Я вижу ошибку "посторонний ввод" с вводом "\ aa a" и следующей грамматикой:
Круто.g4
grammar Cool;
import Lex;
expr
: STR_CONST # str_const
;
Lex.g4
lexer grammar Lex;
@lexer::members {
public static boolean initial = true;
public static boolean inString = false;
public static boolean inStringEscape = false;
}
BEGINSTRING: '"' {initial}? {
inString = true;
initial = false;
System.out.println("Entering string");
} -> more;
INSTRINGSTARTESCAPE: '\\' {inString && !inStringEscape}? {
inStringEscape = true;
System.out.println("The next character will be escaped!");
} -> more;
INSTRINGAFTERESCAPE: ~[\n] {inString && inStringEscape}? {
inStringEscape = false;
System.out.println("Escaped a character.");
} -> more;
INSTRINGOTHER: (~[\n\\"])+ {inString && !inStringEscape}? {
System.out.println("Consumed some other characters in the string!");
} -> more;
STR_CONST: '"' {inString && !inStringEscape}? {
inString = false;
initial = true;
System.out.println("Exiting string");
};
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines
ID: [a-z][_A-Za-z0-9]*;
Вот результат:
$ grun Cool expr -tree
"\aa a"
Entering string
The next character will be escaped!
Escaped a character.
Consumed some other characters in the string!
Exiting string
line 1:0 extraneous input '"\aa' expecting STR_CONST
(expr "\aa a")
Интересно, что если я удалю правило идентификатора, antlr нормально разбирает ввод. Вот результат, когда я удаляю правило идентификатора:
$ grun Cool expr -tree
"\aa a"
Entering string
The next character will be escaped!
Escaped a character.
Consumed some other characters in the string!
Exiting string
(expr "\aa a")
Есть идеи, что может происходить? Почему antlr выдает ошибку, если ID является одним из правил лексера?
grun
, поэтому я не могу сказать, позволяет ли он это сделать, но в коде с вашим сгенерированным лексером вы можете вызватьfill()
для анализа всех токенов, а затем перебрать их и распечатать их текстовое представление. Это покажет вам, какие типы обнаружил лексер и соответствуют ли они вашим ожиданиям. 04.06.2019