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]