认识到真正的价值

时间:2018-03-06 20:15:17

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

当我使用以下输入运行TestRig时

123.45

我得到了

line 1:4 mismatched input '45' expecting DECIMALS

我错过了什么?

2 个答案:

答案 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)*;