Antlr4 认识到真正的价值

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: . ; 当我使用以

我试图识别真实的价值观(如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
我错过了什么

第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)*;