使用中间规则操作 - 野牛解析器

时间:2016-07-08 11:40:24

标签: parsing bison

我有以下语法:

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美元,取决于上面的用法)永远不会减少。

1 个答案:

答案 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