Java 通过ACCJ转移/减少冲突
在这个平凡的正则表达式解析器中,我遇到了移位/减少冲突。我是yacc的初学者,似乎有点困惑。以下是我到目前为止所写的内容: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)); }
%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
这种语法是明确的,应该可以解决这个问题
希望这有帮助 谢谢大家!!的确不再转移/减少冲突。尽管如此,问题依然存在:第二条规则没有对手。