使用 yacc 和 lex 编写文本分析器
2008-11-13 08:32:06 来源:WEB开发网语法定义用于定义标记序列以及应得到的结果。它通常与 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));
}
;
更多精彩
赞助商链接