通过accj转移/减少冲突

时间:2013-11-24 21:11:07

标签: java parsing yacc lalr

我在这个简单的正则表达式解析器中遇到了一个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(字母数字符号)和两个正则表达式之间的连接。但是,即使我的输入正确,第二条规则永远不会匹配

1 个答案:

答案 0 :(得分:0)

语法

  

exp→id | exp exp

是不明确的,因为id id id有两个不同的解析树。通常,只要S非终结符号可以从起始符号到达,具有S→SS形式的CFG将是不明确的。由于没有模糊语法是LALR(1),解析器将找到shift / reduce或reduce / reduce冲突。

要解决此问题,请尝试将语法更改为

  

exp→id | id exp

这个语法是明确的,应该可以解决这个问题。

希望这有帮助!