给定语法:
grammar Test;
words: (WORD|SPACE|DOT)+;
WORD : (
LD
|DOT {_input.LA(1)!='.'}?
) + ;
DOT: '.';
SPACE: ' ';
fragment LD: ~[.nr ];
使用 Antlr4 生成的 Lexer,对于输入:
test. test.test test..test
令牌序列如下所示:
[@0,0:4='test.',<1>,1:0]
[@1,5:5=' ',<3>,1:5]
[@2,6:14='test.test',<1>,1:6]
[@3,15:15=' ',<3>,1:15]
[@4,16:19='test',<1>,1:16]
[@5,20:20='.',<2>,1:20]
[@6,21:25='.test',<1>,1:21]
[@7,26:25='<EOF>',<-1>,1:26]
令人困惑的是,为什么最后一段文本test..test
被标记为test
.
和.test
,而我应该看到test.
.test
更让我困惑的是输入:
test..test test. test.test
令牌序列为:
[@0,0:3='test',<1>,1:0]
[@1,4:4='.',<2>,1:4]
[@2,5:9='.test',<1>,1:5]
[@3,10:10=' ',<3>,1:10]
[@4,11:14='test',<1>,1:11]
[@5,15:15='.',<1>,1:15]
[@6,16:16=' ',<3>,1:16]
[@7,17:20='test',<1>,1:17]
[@8,21:25='.test',<1>,1:21]
[@9,26:25='<EOF>',<-1>,1:26]
在这里,test.test
被分成两个标记,而在上面它是一个。是_input的召唤。LA(1( 有一些副作用会导致这种情况吗?有人可以解释一下吗?
我正在使用Antlr4。
快速解决方法是检查前一个LA(-1)
令牌是否不相等.
并添加一个前导可选DOT
。
生成的语法为:
grammar Test;
words: (WORD|SPACE|DOT)+;
WORD : DOT? (
LD
|{_input.LA(-1)!='.'}? DOT
) + ;
DOT: '.';
SPACE: ' ';
fragment LD: ~[.nr ];
玩得开心,享受ANTLR,这是一个很好的工具。