antlr4 类似的令牌定义



我对令牌定义有问题。

这是我的语法。

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

如果我使用

名称:克里斯托夫123 它匹配

如果我使用

名称:克里斯托弗 它不匹配

争论 'christof' 是 PROPNAME 词法分析器,当 PROPVALUE 等待时,因为 'christof' 匹配 PROPVALUE 和 PROPNAME 表达式。

但我不想匹配

姓名123:克里斯托弗

知道吗?

就像你说的,词法分析器会将 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]

相关内容

  • 没有找到相关文章

最新更新