说我有这样的语法:
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,具有非终结符号的优先顺序,它使用最右边的终端符号的优先级,但我找不到关于非终结符的关联性规则本身的任何文档。
答案 0 :(得分:2)
执行此操作的“正常”方法(据我所知)是为每个运算符定义不同的expr类型,这样就可以非常明确地控制正在发生的事情。
Python的语法就是一个很好的例子:http://docs.python.org/reference/grammar.html。