以下是针对 Parser generator 2.07 中的 Class 例子的笔记;要查看完整的工程和代码,可参考原例。
标题
|
说明
|
分析栈和属性栈
|
- 分析栈:保存当前的文法符号,即,终结符或非终结符。
- 属性栈:保存当前文法符号对应的数据(类似'属性文法'中的属性),在 Parser Generator 中该数据类型为 YYSTYPE ,用户可以自己定义该类型。
|
%token <value> NUMBER
|
用来说明文法符号和属性的关系
NUMBER 为词法分析器中返回的一种符号类型; <value> 指出 NUMBER 和属性中的 value 成员对应。
|
%type <value> expr
|
用来指明非终结符 expr 对应于属性中的 value 成员
|
符号的顺序和优先级
|
按定义的顺序,由低到高;即,越靠后的符号,优先级越高,例如: %right '='
%left '+', '-'
%left '*', '/'
%right UMINUS
|
。。。 | '-' expr %prec UMINUS { $$ = -$2; } 。。。
|
用 %prec 指定本条规则的优先级。本例中,指明 '-' 和右边的表达式结合时,优先级和 UMINUS 相同;而注意到,UMINUS 在之前定义为比其他四则运算符优先!
|
规约过程中的文法符号和属性引用
|
$$
|
:当前规约表达式的结果
|
$1,$2…
|
:从左至右依次表示规约表达式中的符号
|
注意:如果文法属性为自定义结构,通过$引用时,其值和符号声明中的 <xxxx> 成员对应。例如:
%token <value> NUMBER
|
修改默认的输入源
|
重载 yylexer::yygetchar() 虚函数;而不是之前认为的 yylexer::yyinput() !
|