Antlr4 ÅÄÖ chars бесконечный цикл - PullRequest
2 голосов
/ 29 марта 2019

У меня есть грамматика 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 выражения.

1 Ответ

3 голосов
/ 29 марта 2019

Существует правило лексера, которое соответствует токенам нулевой ширины (которых бесконечное количество):

VALUE      : [0-9]*;

Изменение его на:

VALUE      : [0-9]+;
...