Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java antlr4类似令牌定义_Java_Antlr_Grammar_Antlr4_Antlrworks - Fatal编程技术网

Java antlr4类似令牌定义

Java antlr4类似令牌定义,java,antlr,grammar,antlr4,antlrworks,Java,Antlr,Grammar,Antlr4,Antlrworks,我对令牌的定义有问题 这是我的语法 r: PROPNAME ':' PROPVALUE PROPNAME: [a-zA-Z]+ PROPVALUE: [a-zA-Z0-9]+ 如果我使用 姓名:Christo123 it match 如果我使用 姓名:christof不匹配 当PROPVALUE等待时,因为“christof”与PROPVALUE和PROPNAME表达式都匹配,所以争论“christof”是PROPNAME lexer 但我不想让你知道 姓名123:克里斯托夫 有什么想法吗?

我对令牌的定义有问题

这是我的语法

r: PROPNAME ':' PROPVALUE
PROPNAME: [a-zA-Z]+
PROPVALUE: [a-zA-Z0-9]+ 
如果我使用

姓名:Christo123 it match

如果我使用

姓名:christof不匹配

当PROPVALUE等待时,因为“christof”与PROPVALUE和PROPNAME表达式都匹配,所以争论“christof”是PROPNAME lexer

但我不想让你知道

姓名123:克里斯托夫


有什么想法吗?

就像你说的,lexer会将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
这将生成以下与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]
名称:克里斯托夫
第1行:13处的令牌识别错误:'\n'
[@0,0:3='name',1:0]
[@1,4:4=':',,1:4]
[@2,5:12='christof',1:5]
[@3,14:13='',,2:0]

好的,似乎有效,问题是我需要一个中间规则名称和值,就是这样吗?欢迎。您需要将lexer规则分解为更小的单元,并将其组合到此类用例中。
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]