У меня есть грамматика Antlr4, которая завершается бесконечным циклом при попытке проанализировать выражение.
Запуск Antlr версии 4.7 Java 1.8
Выражение выглядит так:
monkey = Å
Но это работает, если правильной переменной является строка:
monkey = "Å"
Или, если это выглядит так:
monkey = A
Последнее сообщение, которое Antlr печатает до того, как оно застряло, это:
строка1: 5 несоответствующий ввод '' ожидание {NUMBER, STRING, BOOLEAN, 'EMPTY', 'NULL'}
К сожалению, я не эксперт в Antlr, и я пытался прочитать оэто, но не могу понять это.
Вот мой файл грамматики:
grammar MyObjectFilter;
/*
* Lexer rules
*/
fragment DIGIT : [0-9] ;
NUMBER : DIGIT+ ([.,] DIGIT+)?;
// Non-greedy String expression that also removes the quotes from the string
STRING : '"' ( '\\"' | . )*? '"' {setText(getText().substring(1, getText().length()-1));} ;
BOOLEAN : 'true' | 'false';
EMPTY : 'EMPTY';
NULL : 'NULL';
// Remove the $ sign from the start of the identifier
IDENTIFIER : [a-zA-Z][a-zA-Z0-9._-]* ;
VALUE : [0-9]*;
AND : '&&' ;
OR : '||' ;
NOT : '!' ;
NEQ : '!=' ;
GT : '>' ;
GE : '>=' ;
LT : '<' ;
LE : '<=' ;
EQ : '=' ;
LPAREN : '(' ;
RPAREN : ')' ;
WS : [ \r\t\u000C\n]+ -> skip;
/*
* Parser rules
*/
parse
: expression EOF
;
expression
: LPAREN expression RPAREN #parenExpression
| NOT expression #notExpression
| left=identifier op=comparator right=value #comparatorExpression
| left=expression op=binary right=expression #binaryExpression
;
identifier
: IDENTIFIER
;
value
: STRING | NUMBER | BOOLEAN | EMPTY | NULL
;
comparator
: GT | GE | LT | LE | EQ | NEQ
;
binary
: AND | OR
;
Инициализация этого с помощью:
InputStream stream = new ByteArrayInputStream(definition.getBytes(StandardCharsets.UTF_8));
MyObjectFilterLexer lexer = new MyObjectFilterLexer(CharStreams.fromStream(stream, StandardCharsets.UTF_8));
MyObjectFilterParser parser = new WTObjectFilterParser(new CommonTokenStream(lexer));
//This is where it get stuck.
ExpressionContext expr = parser.expression();
Лучше всего предположить, что он не может определить EOF выражения.