Antlr4:解析带双点的点结束浮点

Antlr4:解析带双点的点结束浮点,antlr4,Antlr4,我试图用以点结尾的浮点和双点排列数组来解析句子,但做不到 这是我的语法文件 grammar foo; Digits : [0-9]+ ; Real : Digits* '.' Digits+ | Digits+ '.' Digits* ; Range : '..' ; Whitespace : [ \t]+ -> skip ; Newline : ( '\r

我试图用以点结尾的浮点和双点排列数组来解析句子,但做不到

这是我的语法文件

grammar foo;

Digits
    :   [0-9]+
    ;

Real
    :   Digits* '.' Digits+
    |   Digits+ '.' Digits*
    ;

Range
    :   '..'
    ;

Whitespace
    :   [ \t]+
        -> skip
    ;

Newline
    :   (   '\r' '\n'?
        |   '\n'
        )
        -> skip
    ;

range
    :   Digits Range Digits
    ;
和(文件名为
foo.c

代码1:

1..2
代码2:

1 ..2
我使用以下方法编译和测试:

antlr4 foo.g4
javac foo*.java
grun foo range -gui foo.c
代码1将出现错误:

line 1:2 token recognition error at: '. '
line 1:0 extraneous input '1.' expecting Digits
line 1:5 mismatched input '<EOF>' expecting '..'
行1:2令牌识别错误位于:'
行1:0外部输入“1”。应为数字
第1行:5不匹配的输入“”应为“..”
但是我可以用代码2来实现


添加额外的空间使其正确,但我希望有一种语法可以在没有额外空间的情况下解析代码1。

这就是ANTLR的lexer的工作原理:它尝试匹配尽可能多的字符。因此,输入
1..2
生成2个
Real
令牌
1.
.2
,而不是3个令牌
数字
范围
数字

要创建3个令牌,您必须添加。试着这样做:

FLOAT
 : [0-9]+ '.' {_input.LA(1) != '.'}?
 | [0-9]* '.' [0-9]+
 ;

INT
 : [0-9]+
 ;

RANGE
 : '..'
 ;

SPACE
 : [ \t\r\n] -> skip
 ;
如果我根据上述规则创建一个lexer,并向其提供输入
“12..34 56..7 8.9999”
,我将获得以下标记:

INT        '1'
FLOAT      '2.'
FLOAT      '.34'
INT        '56'
RANGE      '..'
INT        '7'
FLOAT      '8.99999'

我保持浮动,可以以单点结束:1。