Java 通过ACCJ转移/减少冲突

Java 通过ACCJ转移/减少冲突,java,parsing,yacc,lalr,Java,Parsing,Yacc,Lalr,在这个平凡的正则表达式解析器中,我遇到了移位/减少冲突。我是yacc的初学者,似乎有点困惑。以下是我到目前为止所写的内容: %token ID %% exp: ID { $$ = new YYRegExParserVal(this._createObjectForID($1.ival)); } | exp exp { $$ = new YYRegExParserVal(this._createObjectForConcat($1.obj, $2.obj)); }

在这个平凡的正则表达式解析器中,我遇到了移位/减少冲突。我是yacc的初学者,似乎有点困惑。以下是我到目前为止所写的内容:

%token ID
%%
exp:    ID  { $$ = new YYRegExParserVal(this._createObjectForID($1.ival)); }
        | exp exp  { $$ = new YYRegExParserVal(this._createObjectForConcat($1.obj, $2.obj)); }
        ;
%%
我的解析器类的名称是
YYRegExParser
,现在它应该只识别简单的ID(字母数字符号)和两个正则表达式之间的连接。但是,即使我的输入正确,第二条规则也不会匹配

经验→ id | exp exp

不明确,因为
id
有两个不同的解析树。通常情况下,CFGs的生成形式为S→ 只要从开始符号可以访问S非终结符,则SS将是不明确的。由于LALR(1)中没有不明确的语法,解析器将发现移位/减少或减少/减少冲突

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

经验→ id | id exp

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


希望这有帮助

谢谢大家!!的确不再转移/减少冲突。尽管如此,问题依然存在:第二条规则没有对手。