enterDecision(int) в типе DebugEventListener неприменим для аргументов (int, boolean)?

Я использую ANTLR 3.1.3 для создания парсера. После импорта сгенерированного testParser я обнаружил несколько ошибок, таких как

попробуйте {dbg.enterDecision(2, solutionCanBacktrack[2]);

Описание Тип расположения пути к ресурсу Метод enterDecision(int) в типе DebugEventListener неприменим для аргументов (int, boolean) testParser.java /ANTLRTest/src строка 280 Java Проблема

Если я изменил на dbg.enterDecision(2), то все в порядке.

Грамматика следующая,

grammar Test;  

options {output=AST;}

expr : mexpr (PLUS^ mexpr)* SEMI! ; 

mexpr : atom (STAR^ atom)* ;  
atom: INT ;  
//class csharpTestLexer extends Lexer;  
WS : (' ' | '\t' | '\n' | '\r') { $channel = HIDDEN; } ;  
LPAREN: '(' ;  
RPAREN: ')' ;  
STAR: '*' ;  
PLUS: '+' ;  
SEMI: ';' ; 

DIGIT : '0'..'9' ;  
INT : (DIGIT)+ ;  

Я использую ANTLRWorks 1.4.3 для создания лексера и парсера.

JDK 1.6

Любая причина этой ошибки?


person Adam Lee    schedule 11.03.2012    source источник
comment
У меня есть параметры { output=AST} определенные   -  person Adam Lee    schedule 12.03.2012
comment
Я обнаружил, что когда я использую Генерировать/генерировать код, сгенерированный лексер/парсер в порядке. Но если я использую отладку, которая также генерирует код, код не может компилироваться   -  person Adam Lee    schedule 12.03.2012
comment
Вероятно, под ANTLRWorks встроены какие-то dbg. Я не вижу этого, когда использую Generate Code.   -  person Adam Lee    schedule 12.03.2012
comment
Просто импортируйте код в Eclipse, и я получаю сообщение об ошибке. Он отлично работает, если работает под ANTLRWorks. В любом случае, большое спасибо за вашу помощь.   -  person Adam Lee    schedule 12.03.2012
comment
Кстати, я получаю ошибку для 2 + 2 * 3, знаете почему? что-то не так с приведенной выше грамматикой.   -  person Adam Lee    schedule 12.03.2012


Ответы (1)


Похоже, вы создали лексер и парсер с версией ANTLR, отличной от той, которую вы добавили в путь к классам Eclipse.

Если вы создаете лексер и/или парсер с помощью ANTLRWorks 1.4.3 (который содержит ANTLR 3.4), вам также следует добавить ANTLR 3.4 в путь сборки вашего проекта в Eclipse и удалить из него ANTLR 3.1.3.

Кстати, я получаю ошибку для 2 + 2 * 3, знаете почему? что-то не так с приведенной выше грамматикой.

Это связано с тем, что однозначные числа размечаются как токены DIGIT. Либо сделайте DIGIT фрагментом:

fragment DIGIT : '0'..'9' ;  
INT : (DIGIT)+ ;  

или удалить его:

INT : '0'..'9'+ ;  

См.: Что означает фрагмент в ANTLR?

person Bart Kiers    schedule 12.03.2012
comment
Я до сих пор не знаю, почему: когда не используется фрагмент, 2+2*3 неверно, а 22 + 22 * ​​33 правильно, можете пояснить? - person Adam Lee; 14.03.2012
comment
@AdamLee, если DIGIT не является fragment, то ввод 2+2*3 заставляет лексер создавать токены: DIGIT STAR DIGIT STAR DIGIT. Ваш синтаксический анализатор не может сопоставить эти токены, он может только сделать что-то из токенов INT STAR INT STAR INT. Если вы сделаете DIGIT fragment, то лексер никогда не создаст токены DIGIT: правила fragment используются только другими правилами лексера (в вашем случае INT) и никогда не станут собственными токенами. - person Bart Kiers; 14.03.2012
comment
@AdamLee, тот факт, что "22" обозначается как INT, а "2" как DIGIT, заключается в том, что всякий раз, когда два или более правил соответствуют одному и тому же входу (и DIGIT, и INT соответствуют "2"), побеждает тот, который определен первым (DIGIT в вашем случае). Обратите внимание, что из "22" создается INT, потому что это больше, чем одна цифра! - person Bart Kiers; 14.03.2012
comment
Спасибо за ваше подробное объяснение. Это очень полезно. - person Adam Lee; 15.03.2012