我正在尝试使用点尾浮点数和双点测距数组来解析句子,但是无法实现。
这是我的语法文件
<partial name="_LoginPartial"
model='new LoginViewModel { InputModel = new InputModel() }' />
and(名为grammar foo;
Digits
: [0-9]+
;
Real
: Digits* '.' Digits+
| Digits+ '.' Digits*
;
Range
: '..'
;
Whitespace
: [ \t]+
-> skip
;
Newline
: ( '\r' '\n'?
| '\n'
)
-> skip
;
range
: Digits Range Digits
;
的文件)
代码1:
foo.c
代码2:
1..2
我使用以下代码进行编译和测试:
1 ..2
代码1将出现错误:
antlr4 foo.g4
javac foo*.java
grun foo range -gui foo.c
但是我可以使用代码2来实现。
添加额外的空间使其正确,但是我希望有一种语法可以解析代码1而无需额外的空间。
答案 0 :(得分:1)
这就是ANTLR的词法分析器的工作方式:它尝试匹配尽可能多的字符。因此,输入1..2
产生2个Real
令牌1.
和.2
,而不是3个令牌Digits
,Range
和Digits
要创建3个令牌,您必须添加a predicate in your lexer grammar。尝试这样的事情:
FLOAT
: [0-9]+ '.' {_input.LA(1) != '.'}?
| [0-9]* '.' [0-9]+
;
INT
: [0-9]+
;
RANGE
: '..'
;
SPACE
: [ \t\r\n] -> skip
;
如果我根据以上规则创建一个词法分析器,并将其输入"1 2. .34 56..7 8.99999"
作为输入,则会得到以下标记:
INT '1'
FLOAT '2.'
FLOAT '.34'
INT '56'
RANGE '..'
INT '7'
FLOAT '8.99999'