ANTLR4 lexer规则不';I don’我没有按预期工作

ANTLR4 lexer规则不';I don’我没有按预期工作,antlr4,Antlr4,我想写一个关于月份和年份的lexer规则,规则是(带正则表达式): “hello”和“ever”文本仅用于调试 也就是说,一个或两个数字表示月份,两个或四个数字表示年份。更重要的是,今年的部分可能会被忽略 例如: 2015年8月->hello08ever2015或hello8ever2015或hello8ever15或hello8ever或hello08ever; 2015年10月->hello10ever2015或hello10ever15或hello10ever15 我的lexer规则如下(

我想写一个关于月份和年份的lexer规则,规则是(带正则表达式):

“hello”和“ever”文本仅用于调试

也就是说,一个或两个数字表示月份,两个或四个数字表示年份。更重要的是,今年的部分可能会被忽略

例如: 2015年8月->hello08ever2015或hello8ever2015或hello8ever15或hello8ever或hello08ever; 2015年10月->hello10ever2015或hello10ever15或hello10ever15

我的lexer规则如下(ANTLR4):

但它似乎不起作用。 以下是我测试的一些日志:

C:\antlr\workspace\demo>java org.antlr.v4.runtime.misc.TestRig Hello r -tree -gui
hello20ever2014
^Z
(r hello 20 ever 2014)

C:\antlr\workspace\demo>grun Hello r -tree -gui

C:\antlr\workspace\demo>java org.antlr.v4.runtime.misc.TestRig Hello r -tree -gui
hello2ever20
^Z
(r hello 2 ever)

C:\antlr\workspace\demo>grun Hello r -tree -gui

C:\antlr\workspace\demo>java org.antlr.v4.runtime.misc.TestRig Hello r -tree -gui
hello20ever14
^Z
(r hello 20 ever)

C:\antlr\workspace\demo>grun Hello r -tree -gui

C:\antlr\workspace\demo>java org.antlr.v4.runtime.misc.TestRig Hello r -tree -gui
hello2ever2014
^Z
(r hello 2 ever 2014)
输入:hello2ever20,无法识别年份部分“20”; 输入:hello20ever14,无法识别年份部分“14”

有人能帮忙吗


谢谢

您必须意识到ANTLR的lexer规则是根据它们在语法文件中的位置匹配的。lexer不会在解析器规则的某个位置“侦听”解析器可能需要的内容。lexer尝试匹配尽可能多的字符,当两个(或更多)规则匹配相同数量的字符时,首先定义的规则将获胜

在您的情况下,这意味着
15
将始终标记为
TimeDate
,而不会标记为
TimeYear
,因为这两个规则都匹配
15
,但
TimeDate
是先定义的<代码>2015将标记为时间年,因为没有其他规则匹配4位数字

解决方案是将
TimeYear
更改为解析器规则:

timeYear
 : TimeDate TimeDate?
 ;
除答案外,有关详细说明,请参见。
C:\antlr\workspace\demo>java org.antlr.v4.runtime.misc.TestRig Hello r -tree -gui
hello20ever2014
^Z
(r hello 20 ever 2014)

C:\antlr\workspace\demo>grun Hello r -tree -gui

C:\antlr\workspace\demo>java org.antlr.v4.runtime.misc.TestRig Hello r -tree -gui
hello2ever20
^Z
(r hello 2 ever)

C:\antlr\workspace\demo>grun Hello r -tree -gui

C:\antlr\workspace\demo>java org.antlr.v4.runtime.misc.TestRig Hello r -tree -gui
hello20ever14
^Z
(r hello 20 ever)

C:\antlr\workspace\demo>grun Hello r -tree -gui

C:\antlr\workspace\demo>java org.antlr.v4.runtime.misc.TestRig Hello r -tree -gui
hello2ever2014
^Z
(r hello 2 ever 2014)
timeYear
 : TimeDate TimeDate?
 ;