我有Grammar_A
語法,我想分成兩種語法:Grammar_A1
和Grammar_A2
; Grammar_A2
進口Grammar_A1
(我已包括在問題的最後)。用@init stub導入語法的問題
當我嘗試編譯我的項目時,儘管存在三個'@init'操作,但我在Grammar_A2
中獲得了錯誤redefinition of 'init' action
兩次。
如果我評論三個@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 : '"';
我看到在我的語法包含init和行動後,多條規則類似的問題。這沒有被提及爲禁止..但它似乎有一個問題。我試圖弄清楚,希望能夠構建一個測試用例。 –