小编Ken*_*mer的帖子

ANTLR4 谓词失败忽略以下替代方案?

我在处理 ANTLR 4 中的语义谓词时遇到了麻烦。我的语法在句法上有歧义,需要提前一个标记来解决歧义。

例如,我想将“2012 年 1 月 19 日至晚上 9 点”解析为日期“2012 年 1 月 19 日”,将解析器的下一个标记留在“直到”。我想将“Jan 19, 7 to 9 pm”解析为日期“Jan.19”,解析器的下一个标记为“7”。

所以我需要查看第三个令牌,然后要么接受要么离开。

我的语法片段是:

date
    :    month d=INTEGER  { isYear(getCurrentToken().getText())}?  y=INTEGER
                                    {//handle date, use $y for year}
    |    month d=INTEGER            {//handle date, use 2013 for year}
    ;                                             
Run Code Online (Sandbox Code Playgroud)

当解析器在任一示例输入上运行时,我收到以下消息:

line 1:9 rule date failed predicate: { isYear(getCurrentToken().getText())}?
Run Code Online (Sandbox Code Playgroud)

它永远不会到达第二个规则替代方案,因为(我猜)它已经读取了一个额外的标记。

有人可以告诉我如何做到这一点吗?

parsing antlr text-parsing antlr4

3
推荐指数
1
解决办法
877
查看次数

标签 统计

antlr ×1

antlr4 ×1

parsing ×1

text-parsing ×1