WEB开发网
开发学院操作系统Linux/Unix 使用 yacc 和 lex 编写文本分析器 阅读

使用 yacc 和 lex 编写文本分析器

 2008-11-13 08:32:06 来源:WEB开发网   
核心提示: 语法定义用于定义标记序列以及应得到的结果,它通常与 lex 联合使用,使用 yacc 和 lex 编写文本分析器(7),由 lex 读取相应的文本,并且两者一同构成整个分析器,加法和减法处理是类似的操作,所以可以将它们集中作为一组, yacc 的基本语法yacc 语法定义的基本结构是定义预

语法定义用于定义标记序列以及应得到的结果。它通常与 lex 联合使用,由 lex 读取相应的文本,并且两者一同构成整个分析器。

yacc 的基本语法

yacc 语法定义的基本结构是定义预期的标记序列。例如,您可以定义表达式 A + B,其中 A 和 B 都是使用下列定义的数值:

NUMBER PLUSTOKEN NUMBER { printf("%fn",($1+$3)); }

NUMBER 是一个数值的识别标记,并且 PLUSTOKEN 是加号的识别标记。

大括号中的代码定义了识别这个序列后进行何种操作,在本示例中,给出的是将这两个数值相加的 C 代码。请注意,使用命名法 $1 表示该语法表达式中的第一项标记,$3 表示其中的第三项。

对于待识别的语法序列,您必须对序列进行命名,如清单 6 所示。

清单 6. 对序列命名

addexpr: NUMBER PLUSTOKEN NUMBER
     {
       printf("%fn",($1+$3));
     }
     ;

语法组的名称为 addexpr,并且这个组定义以一个分号作为结束。

一个语法定义可以包含多个序列(以及相关的操作),而这些序列都是一个特殊的组中的一部分。例如在计算器中,加法和减法处理是类似的操作,所以可以将它们集中作为一组。一个组中不同的定义可以使用管道符号 (|) 进行分隔(请参见清单 7)。

清单 7. 一个组中不同的定义使用管道符号进行分隔

addexpr: NUMBER PLUSTOKEN NUMBER
     {
       printf("%fn",($1+$3));
     }
     | NUMBER MINUSTOKEN NUMBER
     {
       printf("%fn",($1-$3));
     }
     ;

上一页  2 3 4 5 6 7 8 9 10  下一页

Tags:使用 yacc lex

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接