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];
想像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];