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,意思是语法本身就是模棱两可的。哦,我现在明白了,我真的无能为力,语法本身就是模棱两可的。非常感谢。单令牌前瞻。单令牌前瞻。