2017-01-09 59 views
2

我有一个令牌定义问题。antlr4类似的令牌定义

这是我的语法。

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

如果我使用

名称:christof123它匹配

如果我使用

名:克里斯托夫不匹配

当PROPVALUE等待,因为'christof'与两个PROPVALUE PROPORALPROPNAME表达式匹配,所以争论'christof'是PROPNAME词法分析器。

但我不希望匹配的

name123:克里斯托夫

任何想法?

回答

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] 
+0

好吧,似乎工作,它的问题是我需要一个中间规则名称和值是它吗? –

+0

Oups,非常感谢。 –

+0

欢迎。您需要将词法分析规则分解为更小的单位并将其组合为用于此类用例。 – boring