Bison/yacc Shift/Reduce 冲突

Bison/yacc Shift/Reduce conflict

我想制作一个简单的 Java 解析器,所以我从这个语法开始:

Programme
    : Class{ printf("Programme OK!\n");}
;

Class
    : ClassPrototype O_ACCOL VariableDeclaration Main C_ACCOL

ClassPrototype
    : ACCESS CLASS ID ClassInheritance
    | CLASS ID ClassInheritance
;

ClassInheritance
    : EXTENDS ID
    |
;

VariableDeclaration
    : TYPE ID VariableDeclarations
    | ACCESS TYPE ID VariableDeclarations
    |
;

VariableDeclarations
    : COMA ID VariableDeclarations
    | S_COLON VariableDeclaration
;

Main
    : MainPrototype O_ACCOL C_ACCOL
;

MainPrototype
    : ACCESS STATIC VOID MAIN O_PAREN "String" ID C_PAREN
    | STATIC VOID MAIN O_PAREN "String" ID C_PAREN
    | VOID MAIN O_PAREN "String" ID C_PAREN
;

编译后我有 2 个 shift/reduce 冲突。我想我知道为什么(如果我错了请告诉我):在阅读 ACCESS 之后,它实际上无法在 VariableDeclaration 和 MainPrototype 之间做出选择。这就是我从研究中发现的。

但是我真的不知道如何解决这些冲突。有任何想法吗 ?

好的。所以我来到这个不再 return 我 warnings/conflicts 的语法。我按照 SomeProgrammerDude 的建议概括了我的声明规则。感谢他。

我知道这个语法并不完美,但我不会 post 我遇到的所有问题 post ^^

Programme
    : Class{ printf("Programme OK!\n");}
;

Class
    : ClassPrototype O_ACCOL Declarations C_ACCOL
;

ClassPrototype
    : ACCESS CLASS ID ClassInheritance
    | CLASS ID ClassInheritance
;

ClassInheritance
    : EXTENDS ID
    |
;

Declarations
    : Main
    | ACCESS STATIC TYPE ID Declaration Declarations
    | STATIC TYPE ID Declaration Declarations
    | TYPE ID Declaration Declarations
    | ACCESS TYPE ID Declaration Declarations
    |
;

Declaration
    : O_PAREN PrototypeParameters C_PAREN
    | VariableDeclarations
;

VariableDeclarations
    : COMA ID VariableDeclarations
    | S_COLON
;

PrototypeParameters
    : TYPE ID PrototypeParameters
    |
;

/* Parameters
    : ID Parameters
    |
; */

Main
    : MainPrototype O_ACCOL C_ACCOL
;

MainPrototype
    : ACCESS STATIC VOID MAIN O_PAREN TYPE ID C_PAREN
    | STATIC VOID MAIN O_PAREN TYPE ID C_PAREN
;