2012-02-12 2 views
2

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

«Int А» или «обугливается в»

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

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

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

typedident : (INT|CHAR) IDENT; 

INT и CHAR того, были определены как для Kens.

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

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

outputed ошибки я получаю:

"MismatchedTokenException: несовпадающими вход 'а' ожидает '$'"

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

EDIT

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

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

я понял, они не были использованы на всех, так что я удалил их и теперь все работает отлично! Моя догадка, почему это работает, потому что ALPH и DIGIT были отвергая мои другие правила LeXeR:

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

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

+0

Я буквально просто заработал, и я не знаю почему. У меня также было два других правила лексера, которые определены следующим образом: ALPH: ('a' .. 'z' | 'A' .. 'Z'); DIGIT: ('0' .. '9'); Я понял, что они вообще не используются, поэтому я удалил их, и теперь все работает отлично! Мое предположение, почему это работает, потому что ALPH и DIGIT переопределили мои другие правила Lexer: NUMBER: ('0' .. '9') +; ХАРАКТЕР: '\' '(~ (' \ n '|' \ r '|' \ '')) '\' '; Кто-нибудь знает, если это так? Мне любопытно, почему эта проблема теперь решена. –

ответ

0

'int a' не принимается, пока принимается 'int ab'. ... Мое предположение, почему это работает, потому что Альф и DIGIT были перекрывая ...

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

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

  • правила лексера соответствуют столько символов, сколько возможно (жадный);
  • если 2 (или более) правила лексера совпадают с одним и тем же вводом, то правило, определяемое первым, будет «выиграть».

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

Смежные вопросы