Parsing yacc语法中的移位/减少冲突
我写了一个语法,规则如下:Parsing yacc语法中的移位/减少冲突,parsing,grammar,yacc,lalr,Parsing,Grammar,Yacc,Lalr,我写了一个语法,规则如下: A : B '?' | B | A '+' A ; B : "a" | "c" A "t" A ; 这给了我一个转变/减少冲突的机会 A : B . '?' (96) A : B . (98) 我尝试了多种方法来改变语法,但当我试图改变事情时,我似乎会制造更多的冲突。如何消除此冲突 提前感谢您,我们将非常感谢您的帮助。LALR(1)解析器使用单个字符先行查找来解决冲突。当前瞻无法消除不同操作之间的歧义时,冲突将显示给用户 在以下状态中
A : B '?'
| B
| A '+' A
;
B : "a"
| "c" A "t" A
;
这给了我一个转变/减少冲突的机会
A : B . '?' (96)
A : B . (98)
我尝试了多种方法来改变语法,但当我试图改变事情时,我似乎会制造更多的冲突。如何消除此冲突
提前感谢您,我们将非常感谢您的帮助。LALR(1)解析器使用单个字符先行查找来解决冲突。当前瞻无法消除不同操作之间的歧义时,冲突将显示给用户
在以下状态中,“?”先行表示解析器可以移动
A : B . '?'
A : B .
但是,如果它减少了一个错误呢?可能会降低到以下状态:
B: "c" A "t" A .
通过减少B,可能会导致:
A : B . '?'
A : B .
因此,“?”也是一个有效的前瞻性减少
那么你如何解决这个问题呢
您有两个选择:
1) 尝试用左递归而不是右递归重写语法。这可能会有帮助,但不能保证
2) 告诉YACC在发生此冲突时选择哪一个(例如,使用%left或%right)
或者,也许可以使用更智能的解析器。例如,或antlr。A : B . '?'
A : B .
但是,如果它减少了一个错误呢?可能会降低到以下状态:
B: "c" A "t" A .
通过减少B,可能会导致:
A : B . '?'
A : B .
因此,“?”也是一个有效的前瞻性减少
那么你如何解决这个问题呢
您有两个选择:
1) 尝试用左递归而不是右递归重写语法。这可能会有帮助,但不能保证
2) 告诉YACC在发生此冲突时选择哪一个(例如,使用%left或%right)
或者,也许可以使用更智能的解析器。例如,antlr。您希望解析器如何解析
cata?
?哪个A得到尾随的?
?“c”和其他字符是用来表示代币的,对不起,我不清楚这并没有回答我的问题:你可以去cata?从A->B开始?或者A->B,意思是语法本身就是模棱两可的。哦,我现在明白了,我真的无能为力,语法本身就是模棱两可的。非常感谢。您希望解析器如何解析cata?
?哪个A得到尾随的?
?“c”和其他字符是用来表示代币的,对不起,我不清楚这并没有回答我的问题:你可以去cata?从A->B开始?或者A->B,意思是语法本身就是模棱两可的。哦,我现在明白了,我真的无能为力,语法本身就是模棱两可的。非常感谢。单令牌前瞻。单令牌前瞻。