【发布时间】:2017-12-24 16:48:27
【问题描述】:
我想写一个关于月份和年份的词法规则,规则是(带正则表达式):
"hello"[0-9]{1,2}"ever"([0-9]{2}([0-9]{2})?)?
“hello”和“ever”字面量仅用于调试。
也就是说,一个或两个数字代表月份,两个或四个数字代表年份。更重要的是,年份部分可以绕过。
例如: 2015 年 8 月 ->hello08ever2015 或 hello8ever2015 或 hello8ever15 或 hello8ever 或 hello08ever; 2015 年 10 月 -> hello10ever2015 或 hello10ever15 或 hello10ever;
我的词法分析器规则如下(ANTLR4):
grammar Hello;
r : 'hello' TimeDate 'ever' TimeYear? ;
TimeDate : Digit Digit?;
TimeYear : TwoDigit TwoDigit?;
TwoDigit : Digit Digit;
Digit : [0-9] ;
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines
但它似乎不起作用。 这是我的一些测试日志:
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';
有人可以帮忙吗???
谢谢!!
【问题讨论】:
-
请参阅stackoverflow.com/a/59944329/1624454以获取除答案之外的详细说明。
标签: antlr4