我有以下语法:
expr : FUNC '(' expr ')' { ... }
| FUNC '(' expr ',' expr ')' { ... }
| expr '+' expr { ... }
| expr '-' expr { ... }
| NUM { ... }
我想在输入expr之前对FUNC规则执行不同的中规则操作,具体取决于规则。
含义:
expr : FUNC { DO_ACTION_1 } '(' expr ')' { ... }
或
expr : FUNC '(' { DO_ACTION_1 } expr ')' { ... }
在另一个案例中:
expr : FUNC { DO_ACTION_2 } '(' expr ',' expr ')' { ... }
或
expr : FUNC '(' { DO_ACTION_2 } expr ',' expr ')' { ... }
但是我一直在减少/减少错误,而且1美元(或2美元,取决于上面的用法)永远不会减少。
答案 0 :(得分:0)
bison documentation中描述了此问题,以及解决歧义的机制。
歧义是由于野牛需要承诺在解析的早期应用哪两个规则,并且在你的行动阶段它无法分辨。
匹配时:
FUNC
或
FUNC '('
甚至
FUNC '(' expr
它仍然可能是三种语法规则之一,因此操作不明确。
要消除歧义,您可以将操作附加到终端符号(FUNC
或'('
)或为包含操作的前导码制定规则:
func : FUNC { DO_ACTION1 } ;
bra : '(' { DO_ACTION1} ;
或
func_open : FUNC '(' expr { DO_ACTION1 };
expre : func_open | func_open ',' expr | etc