我正在尝试识别真实值(例如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:
.
;
当我使用以下输入运行TestRig时
123.45
我得到了
line 1:4 mismatched input '45' expecting DECIMALS
我错过了什么?
答案 0 :(得分:1)
第1行:4输入'45'不匹配期待DECIMALS
您收到该错误,因为45
被标记为NUMBER
。在NUMBER
之前定义DECIMALS
,以便NUMBER
获得优先权。词法分析器不会“监听”解析器在给定时间可能需要的内容。
这样可行:
realValue
: NUMBER DOT NUMBER
;
但是,您不希望在解析器规则中将标记粘合在一起以创建realValue
。否则输入如下:123 .45
可能会成为一个realValue
。
真实应该是一个词法分析器规则:
number
: INT
| REAL
;
INT
: '0'
| [1-9] [0-9]*
;
REAL
: [0-9]* '.' [0-9]+
;
WS
: [ \t\r\n] -> skip
;
OTHER
: .
;
答案 1 :(得分:0)
对于E,请使用科学计数法。
例如,Accepted Real是:
1.0,
1e-12,
1.0e-12,
0.000000001
到目前为止,我已经针对Real Number的GRAMMAR ANTLR v4进行了测试测试
fragment DIGIT : [0-9] ;
INT : DIGIT+ ;
SUBREAL : (INT)('e')?('+'|'-')?(INT)*;
DOT: '.';
REAL : SUBREAL DOT SUBREAL;
ID : (REAL)*;