我有Grammar_A
语法,我想分成两个语法Grammar_A1
和Grammar_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 : '"';
答案 0 :(得分:1)
如果您可以在Java代码中重现此问题(您可以使用它),则可以将其报告为reference implementation's issue tracker上的错误。否则,如果这是特定于C#目标的,您可以在C# target's issue tracker上报告。
如果你有一个语法,我强烈建议你考虑的唯一分离是将它分成lexer grammar
和parser grammar
,而不是使用import
语句。 import
语句实际上有帮助的情况很少见。
您在问题中指出的操作对于正确解析并不重要,因此应将其重新定位到在解析完成后执行的侦听器或访问者。如果这些操作位于正确的位置,您将不再受到您所描述的问题的限制。
答案 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