认识到真正的价值

Recognizing a REAL value

我正在尝试识别真实值(例如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

我错过了什么?

line 1:4 mismatched input '45' expecting DECIMALS

你得到那个错误是因为 45 被标记为 NUMBERNUMBERDECIMALS 之前定义,因此 NUMBER 获得优先权。词法分析器不会 "listen" 解析器在给定时间可能需要的内容。

这可行:

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
 : .
 ;

对于E,使用科学记数法。 例如,Accepted Real 是:
1.0,
1e-12,
1.0e-12,
0.000000001

到目前为止,我已经测试了 GRAMMAR ANTLR v4 of Real Number

fragment DIGIT : [0-9] ;
INT : DIGIT+ ;
SUBREAL : (INT)('e')?('+'|'-')?(INT)*;
DOT: '.';
REAL : SUBREAL DOT SUBREAL;
ID : (REAL)*;