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。