Antlr4 认识到真正的价值
我试图识别真实的价值观(如xxx.xx) 这种语法不起作用Antlr4 认识到真正的价值,antlr4,Antlr4,我试图识别真实的价值观(如xxx.xx) 这种语法不起作用 grammar Test; realValue: NUMBER DOT DECIMALS ; DOT: '.' ; NUMBER: '0' | ('1'..'9')('0'..'9')* ; DECIMALS: ('0'..'9')('0'..'9')* ; WS: (' '|'\r'|'\t'|'\n') -> skip ; OTHER: . ; 当我使用以
grammar Test;
realValue:
NUMBER DOT DECIMALS
;
DOT:
'.'
;
NUMBER:
'0' | ('1'..'9')('0'..'9')*
;
DECIMALS:
('0'..'9')('0'..'9')*
;
WS:
(' '|'\r'|'\t'|'\n') -> skip
;
OTHER:
.
;
当我使用以下输入运行TestRig时
123.45
我得到一份工作
line 1:4 mismatched input '45' expecting DECIMALS
我错过了什么
第1行:4不匹配的输入“45”应为小数
您得到该错误是因为45
被标记为数字
。数字
是在小数
之前定义的,因此数字
具有优先权。lexer不会“监听”解析器在给定时间可能需要的内容
这将有助于:
realValue
: NUMBER DOT NUMBER
;
但是,您不希望在解析器规则中将令牌粘在一起以创建realValue
。否则,像这样的输入:123.45
可能会变成单个realValue
真正的实数应该是lexer规则:
number
: INT
| REAL
;
INT
: '0'
| [1-9] [0-9]*
;
REAL
: [0-9]* '.' [0-9]+
;
WS
: [ \t\r\n] -> skip
;
OTHER
: .
;
对于E,使用科学符号。 例如,可接受的实数为:
1.0,
1e-12,
1.0e-12,
0.000000001 到目前为止,我已经测试了实数的语法antlrv4
fragment DIGIT : [0-9] ;
INT : DIGIT+ ;
SUBREAL : (INT)('e')?('+'|'-')?(INT)*;
DOT: '.';
REAL : SUBREAL DOT SUBREAL;
ID : (REAL)*;