我想做一个简单的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 班/减少冲突。我想我知道为什么(如果我错了,请告诉我(:在阅读ACCESS之后,它无法真正在VariableDeclaration和MainPrototype之间进行选择。这就是我从我的搜索中发现的。
但我真的不知道如何解决这些冲突。有什么想法吗?
好的。所以我来到了这个语法,它不再返回我警告/冲突。我按照SomeProgrammerDude的建议概括了我的声明规则。多亏了他。
我知道这个语法并不完美,但我不会在这篇文章中发布我遇到的所有问题^^
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
;