gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:10:57 26 4
gpt4 key购买 nike

我在使用 ANTLR 4 中的语义谓词时遇到问题。我的语法在句法上有歧义,需要向前看一个标记来解决歧义。

例如,我想将“Jan 19, 2012 until 9 pm”解析为日期“Jan 19, 2012”,将解析器的下一个标记留在“until”。我想将“Jan 19, 7 until 9 pm”解析为日期“Jan. 19”,解析器的下一个标记为“7”。

所以我需要查看第 3 个标记,要么拿走它,要么留下它。

我的语法片段是:

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

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

line 1:9 rule date failed predicate: { isYear(getCurrentToken().getText())}?

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

有人可以告诉我如何完成这个吗?

最佳答案

在解析器规则中,ANTLR 4 仅在做出决定时使用左边缘的谓词。像您上面显示的那样的内联谓词仅经过验证

以下修改将导致 ANTLR 在做出决定时评估谓词,但显然您需要修改它以使用正确的先行标记而不是调用 getCurrentToken() .

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

PS:如果month始终恰好是一个标记长,那么 _input.LT(3)应该提供您想要的 token 。

关于parsing - ANTLR4 谓词失败忽略以下替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17839285/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com