就像你说的那样,词法分析器会将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]
好吧,似乎工作,它的问题是我需要一个中间规则名称和值是它吗? –
Oups,非常感谢。 –
欢迎。您需要将词法分析规则分解为更小的单位并将其组合为用于此类用例。 – boring