[英]antlr4 Similar token definition
我对令牌定义有疑问。
这是我的语法。
r: PROPNAME ':' PROPVALUE
PROPNAME: [a-zA-Z]+
PROPVALUE: [a-zA-Z0-9]+
如果我使用
名称:christof123 它匹配
如果我使用
名称:christof 不匹配
当 PROPVALUE 等待时,争论 'christof' 是 PROPNAME 词法分析器,因为 'christof' 匹配 PROPVALUE 和 PROPNAME 表达式。
但我不想匹配
name123:克里斯托夫
任何的想法?
就像你说的那样,词法分析器将 christof 与 PROPNAME 匹配,因为它首先出现在你的定义中,匹配最长的。 您可以使用grun
检查匹配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]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.