非终结符号的yacc关联性?

时间:2011-12-04 06:30:18

标签: yacc

说我有这样的语法:

expr : expr '+' expr   { $$ = operation('+', $1, $3); }
     | expr '-' expr   { $$ = operation('-', $1, $3); }
     | expr '*' expr   { $$ = operation('*', $1, $3); }
     | expr '/' expr   { $$ = operation('/', $1, $3); }
     | num
     ;

其中每个运算符都附加了一个优先级,并标记为左关联。

然后我想重构我的语法:

op   : '+' | '-' | '*' | '/' ;

expr : expr op expr { $$ = operation($2, $1, $3); }
     | num
     ;

在这种情况下,yacc(如果有的话)如何确定op的关联性和优先级?在评估+时,它是否会追踪-*/op的所有可能的优先级/关联性,或定义关联性非终结符号没有意义吗?

AFAIK,具有非终结符号的优先顺序,它使用最右边的终端符号的优先级,但我找不到关于非终结符的关联性规则本身的任何文档。

1 个答案:

答案 0 :(得分:2)

执行此操作的“正常”方法(据我所知)是为每个运算符定义不同的expr类型,这样就可以非常明确地控制正在发生的事情。

Python的语法就是一个很好的例子:http://docs.python.org/reference/grammar.html