Ошибка Antlr v3 с правилами парсера / лексера - PullRequest
2 голосов
/ 12 февраля 2012

У меня проблемы с моей грамматикой Antlr. Я пытаюсь написать правило синтаксического анализа для 'typedident', которое может принимать следующие входные данные:

'int a' или 'char a'

Имя переменной 'a' взято из моего правила лексера 'IDENT', которое определено следующим образом:

IDENT : (('a'..'z'|'A'..'Z') | '_') (('a'..'z'|'A'..'Z')|('0'..'9')| '_')*;

Мое правило синтаксического анализа 'typedident' выглядит следующим образом:

typedident : (INT|CHAR) IDENT;

INT и CHAR определены как токены.

Проблема, с которой я сталкиваюсь, заключается в том, что при тестировании 'typedident' имя переменной должно содержать более одного символа. Например:

'int a' не принимается, а 'int ab' принимается.

Я получаю предполагаемую ошибку:

"MismatchedTokenException: несоответствующий ввод" a ", ожидающий" $ ""

Есть идеи, почему я получаю эту ошибку? Я новичок в Antlr, поэтому извиняюсь, если ошибка тривиальна.

EDIT

Я буквально только что заработал, и я не знаю почему. У меня также было два других правила лексера, определенных следующим образом:

ALPH : ('a'..'z'|'A'..'Z'); 
DIGIT : ('0'..'9'); 

Я понял, что они вообще не использовались, поэтому я удалил их, и теперь все работает отлично! Я думаю, почему это работает, потому что ALPH и DIGIT переопределяли мои другие правила Lexer:

NUMBER : ('0'..'9')+; 
CHARACTER : '\'' (~('\n' | '\r' |'\'')) '\''; 

Кто-нибудь знает, так ли это? Мне любопытно, почему эта проблема теперь решена.

1 Ответ

0 голосов
/ 12 февраля 2012

'int a' не принято, а 'int ab' принято.... Я думаю, почему это работает, потому что ALPH и DIGIT были переопределены ...

Да, кажется, ALPH было определено до правила IDENT, и в этом случае отдельные буквы были токенизированыкак ALPH токены.Если IDENT было определено до ALPH, все должно пройти нормально (в вашем случае).

Подводя итог, как работают правила лексера ANTLR:

  • правила лексера соответствуют максимально возможному количеству символов (жадные алгоритмы);
  • если 2 (или более) правила лексера совпадают с одним и тем же входным сигналом, правило, определенное первым, будет "win" .

Вы должны понимать, что лексер не производит токены на основе того, что нужно анализатору (в то время).Лексер работает независимо от парсера.

...