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
;
我想制作一个简单的 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
;