Java Antlr4和xC5ÄÖ;chars无限循环

Java Antlr4和xC5ÄÖ;chars无限循环,java,antlr4,Java,Antlr4,我有一个Antlr4语法,当试图解析表达式时,它会以无限循环结束 运行Antlr版本4.7 Java 1.8 表达式如下所示: 猴子=Å 但如果正确的变量是字符串,则它可以工作: 猴子=“Å” 或者如果它看起来像这样: 猴子 Antlr在卡住之前打印的最后一条消息是: 第1行:5个不匹配的输入“”,应为{数字、字符串、布尔值, “空”、“空”} 可悲的是,我不是Antlr的专家,我已经试着读过了,但无法理解这一点 这是我的语法文件: grammar MyObjectFilter; /* *

我有一个Antlr4语法,当试图解析表达式时,它会以无限循环结束

运行Antlr版本4.7 Java 1.8

表达式如下所示:

猴子=Å

但如果正确的变量是字符串,则它可以工作:

猴子=“Å”

或者如果它看起来像这样:

猴子

Antlr在卡住之前打印的最后一条消息是:

第1行:5个不匹配的输入“”,应为{数字、字符串、布尔值, “空”、“空”}

可悲的是,我不是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
;

我的最佳猜测是它无法确定表达式的EOF。

有一个lexer规则匹配零宽度标记(其中有无限量):

将其更改为:

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