使用@init语句导入语法时出现问题

时间:2014-03-12 18:34:28

标签: c# antlr4

我有Grammar_A语法,我想分成两个语法Grammar_A1Grammar_A2; Grammar_A2导入Grammar_A1(问题末尾包含了所有内容)。

当我尝试编译我的项目时,我在redefinition of 'init' action中两次获得错误Grammar_A2,尽管有三个'@init'动作。

如果我评论三个@init行动中的两个,无论如何,编译都很好。

我将语法翻译成Java并像Antlr4网站中的教程一样进行编译:我得到java -classpath .;../antlr-4.2-complete.jar org.antlr.v4.Tool Grammar_A2.g4时出现的相同错误,但表示错误94,ACTION_REDEFINITION

我尝试使用antlr 4.1版和4.2版进行编译。

知道我能做错什么?

Grammar_A

grammar Grammar_A;

@parser::members
{
    protected const int EOF = Eof;
    int numPrints, numReads;
}

@lexer::members
{
    protected const int EOF = Eof;
    protected const int HIDDEN = Hidden;
}

program
@init { numPrints = numReads = 0; }
    :   (printExpression | readExpression)+
    ;

printExpression
@init {numPrints++;}
    :   PRINT_KEY 
        ( id
            | QUOT id QUOT
        )
        SEMICOLON
;

readExpression
@init {numReads++;}
    : ID READ_KEY SEMICOLON
;

id 
    :   ID | PRINT_KEY | READ_KEY
    ;

WS
    :   (' ' | '\r' | '\n') -> channel(HIDDEN)
    ;

PRINT_KEY : 'print';
READ_KEY : 'read';

ID : ('a'..'z')+ ;


SEMICOLON : ';';
QUOT : '"'; 

Grammar_A1

grammar Grammar_A1;

@parser::members
{
    protected const int EOF = Eof;
}

@lexer::members
{
    protected const int EOF = Eof;
    protected const int HIDDEN = Hidden;
}

id 
    :   ID | PRINT_KEY | READ_KEY
    ;    

WS
    :   (' ' | '\r' | '\n') -> channel(HIDDEN)
    ;

PRINT_KEY : 'print';
READ_KEY : 'read';

ID : ('a'..'z')+ ;

Grammar_A2

grammar Grammar_A2;

import Grammar_A1; 


@parser::members {
    int numPrints, numReads;
}

program
@init { numPrints = numReads = 0; }
    :   (printExpression | readExpression)+
    ;

printExpression
@init {numPrints++;}
    :   PRINT_KEY 
        ( id
            | QUOT id QUOT
        )
        SEMICOLON
;

readExpression
@init {numReads++;}
    : ID READ_KEY SEMICOLON
;


SEMICOLON : ';';
QUOT : '"';

2 个答案:

答案 0 :(得分:1)

  1. 如果您可以在Java代码中重现此问题(您可以使用它),则可以将其报告为reference implementation's issue tracker上的错误。否则,如果这是特定于C#目标的,您可以在C# target's issue tracker上报告。

  2. 如果你有一个语法,我强烈建议你考虑的唯一分离是将它分成lexer grammarparser grammar,而不是使用import语句。 import语句实际上有帮助的情况很少见。

  3. 您在问题中指出的操作对于正确解析并不重要,因此应将其重新定位到在解析完成后执行的侦听器或访问者。如果这些操作位于正确的位置,您将不再受到您所描述的问题的限制。

答案 1 :(得分:0)

我有同样的问题,它可能是ANTLR中的一个错误?

要解决此问题,我会重新定位所有+---------------------+ | right click here | | +-----------------+ | | | right click here| | each layout | +-----------------+ | has it\'s own right click event | | | +-----------------+ | | | right click here| | | +-----------------+ | +---------------------+ @init块内联。 这样的事情(未经测试):

@after

编辑: 我在这里开了一个问题 https://github.com/antlr/antlr4/issues/2041