java - antlr4 类似的标记定义

标签 java antlr grammar antlr4 antlrworks

我对标记定义有疑问。

这是我的语法。

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

如果我使用

name:christof123 it match

如果我使用

name:christof it doesn't match

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

但我不想启用匹配

name123:christof

有什么想法吗?

最佳答案

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

关于java - antlr4 类似的标记定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41554236/

相关文章:

java - AspectJ - native 方法调用的切入点

java - 使用 AWS Java SDK 获取 CloudWatch 指标?

java - 使用ANTLR和Java创建数据绑定(bind)代码生成器

c++ - LL(*) 解析器(如antlr3)可以解析C++吗?

java - 堆栈跟踪 :] with root cause

java - 数据实现

antlr - ANTLR4 会在某个时刻构建自动机吗?

parsing - 同时解析多行注释和字符串文字的语法

theory - 为什么所有 LL(1) 文法都是 LR(1)?

java - 代表CFG制作