Antlr4解析数

Antlr4 Parse Number

想像springEl一样写表达式练习

当我输入#user.age>3是对的。

但我输入#user.age>3ww#user.age>3ww && #user.age<2解析器没有提示任何错误。我不认为 #user.age>3ww 是正确的语法。

如何更改语法让解析器提示 3ww 是错误的?

我的部分antlr4语法

grammar FlowExpr;

statement : expr;

expr
    :   expr (Mul|Div) expr
    |   expr (Add|Sub) expr
    |   expr BooleanOperator expr
    |   expr And expr
    |   expr Or expr
    |   Not expr
    |   object
    ;

object
    :   boolean
    |   invoker
    |   entity
    |   number
    |   String
    ;
entity : ObjectSymbol Identifier;
boolean : 'true'|'false';
invoker : entity attribute+;
attribute : Dot Identifier;
number
    :   Integer
    |   Float
    ;
Identifier :  Letter (Letter|JavaIDDigit)* ;
Integer : '-'? INT ;
Float : '-'? INT Dot [0-9]*;

Commas : ',';

BooleanOperator
    :   '>'|'>='|'<'|'<='|'=='|'!=';
Not:'!';
Dot : '.';
ObjectSymbol : '#';
WS  :   [ \t\n\r]+ -> skip ;

enter image description here

输入 2w 被标记为 Integer- 和 Identifier 标记。然后 number 解析器规则使用 Integer 标记然后停止解析(它恰好匹配 1 Integer 标记,这是你告诉它做的)。

如果你想强制解析器使用 all 词法分析器产生的标记,你需要通过添加 EOF(内置的 -在 file/input 令牌的末尾)。您通常有 1 个包含此 EOF:

的条目规则
grammar t;

entryPoint
    : number EOF
    ;

number
    :   Integer
    |   Float
    ;
fragment INT :  '0'| [1-9][0-9]* ; 
Integer : '-'? INT ;
Float : '-'? INT Dot [0-9]*;
Dot : '.';
Identifier :  [a-zA-Z];