野牛/雅克 转移/减少冲突



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

相关内容

  • 没有找到相关文章

最新更新