antlr4类似的标记定义

时间:2017-01-09 18:10:55

标签: java antlr grammar antlr4 antlrworks

我的令牌定义存在问题。

这是我的语法。

r: PROPNAME ':' PROPVALUE
PROPNAME: [a-zA-Z]+
PROPVALUE: [a-zA-Z0-9]+ 

如果我使用

  

名称:christof123匹配

如果我使用

  

名称:christof它不匹配

争论christof'当PROPVALUE等待“christof'匹配PROPVALUE& PROPNAME表达式。

但我不喜欢'希望匹配

  

name123:克里斯托夫

任何想法?

1 个答案:

答案 0 :(得分:2)

就像你说的那样,词法分析器会将christof与PROPNAME匹配,因为这在你的定义中首先与最长的匹配。您可以使用grun检查匹配项。

antlr4 MyGrammer.g4
javac -g *.java
grun MyGrammer r -tokens
# enter your input string and press ctlr+d

你的语法会产生以下匹配,从而产生错误。

name:christof
line 1:13 token recognition error at: '\n'
[@0,0:3='name',<2>,1:0]
[@1,4:4=':',<1>,1:4]
[@2,5:12='christof',<2>,1:5]
[@3,14:13='<EOF>',<-1>,2:0]
line 1:5 mismatched input 'christof' expecting PROPVALUE

因此,将语法修改为以下内容将会解决。

r: name ':' value;

name: ALPHA;
value: ALPHA | ALPHANUM;

ALPHA: [a-zA-Z]+;
ALPHANUM: [a-zA-Z0-9]+;

与grun产生以下匹配。

name:christof
line 1:13 token recognition error at: '\n'
[@0,0:3='name',<2>,1:0]
[@1,4:4=':',<1>,1:4]
[@2,5:12='christof',<2>,1:5]
[@3,14:13='<EOF>',<-1>,2:0]