0

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

%token ID
%%
exp:    ID  { $$ = new YYRegExParserVal(this._createObjectForID($1.ival)); }
        | exp exp  { $$ = new YYRegExParserVal(this._createObjectForConcat($1.obj, $2.obj)); }
        ;
%%

我的解析器类的名称是YYRegExParser,现在它应该只识别简单的 ID(字母数字符号)和两个正则表达式之间的连接。但是,即使我的输入正确,第二条规则也永远不会匹配

4

1 回答 1

0

语法

exp → id | exp

是模棱两可的,因为 . 有两种不同的解析树id id id。一般来说,只要 S 非终结符可以从起始符号到达,那么产生形式为 S → SS 的 CFG 将是不明确的。由于没有歧义语法是 LALR(1),解析器将找到移位/归约或归约/归约冲突。

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

exp → id | 身份证

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

希望这可以帮助!

于 2013-11-24T21:14:31.017 回答