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