我在这个简单的正则表达式解析器中遇到了一个shift / reduce冲突。我是yacc的初学者,我似乎有点困惑。这是我到目前为止所写的内容:
%token ID
%%
exp: ID { $$ = new YYRegExParserVal(this._createObjectForID($1.ival)); }
| exp exp { $$ = new YYRegExParserVal(this._createObjectForConcat($1.obj, $2.obj)); }
;
%%
我的解析器类的名称是YYRegExParser
,现在它应该只识别简单的ID(字母数字符号)和两个正则表达式之间的连接。但是,即使我的输入正确,第二条规则永远不会匹配
答案 0 :(得分:0)
语法
exp→id | exp exp
是不明确的,因为id id id
有两个不同的解析树。通常,只要S非终结符号可以从起始符号到达,具有S→SS形式的CFG将是不明确的。由于没有模糊语法是LALR(1),解析器将找到shift / reduce或reduce / reduce冲突。
要解决此问题,请尝试将语法更改为
exp→id | id exp
这个语法是明确的,应该可以解决这个问题。
希望这有帮助!