gpt4 book ai didi

java - Antlr4 当第二个谓词失败时不遵循备用路径

转载 作者:太空宇宙 更新时间:2023-11-04 12:12:23 27 4
gpt4 key购买 nike

这是我的代码:

@parser::members {

public boolean twoDigitDay(String text) {
try {
int day = Integer.parseInt(text);
if (day >= 1 && day <= 31)
{
return true;
}
}
catch (Exception e)
{

}
return false;
}
public boolean twoDigitMonth(String text) {
try {
int day = Integer.parseInt(text);
if (day >= 1 && day <= 12)
{
return true;
}
}
catch (Exception e)
{
}
return false;
}

}

date        :   day seperator month
| month seperator day
;

day : dayTwoDigits ;
month : monthTwoDigit;
monthTwoDigit : {twoDigitMonth(getCurrentToken().getText())}? TWO_DIGITS;
dayTwoDigits : {twoDigitDay(getCurrentToken().getText())}? TWO_DIGITS;
seperator : ('/');
ONE_DIGIT : [0-9];
TWO_DIGIT : ONE_DIGIT ONE_DIGIT

这里的问题是:输入 - 12/29(它应该转到月份分隔符日路径,因为第一个失败)。解析器在 29 处抛出“无可行输入”...因为 29 不满足 @member 中定义的月份标准。在这种情况下,12 根据日期方法(1-31)通过,之后 29 将进行月份检查(1-12)并且失败。它应该回溯到根并遵循第二条路径,而不是在 29 异常处给出“无可行输入”。

最佳答案

让我们将语义谓词直接移至date 语法规则。

TWO_DIGIT : [0-9][0-9];

date
: {twoDigitDay(getCurrentToken().getText()) && twoDigitMonth(_input.LT(3).getText())}?
TWO_DIGIT '/' TWO_DIGIT # dayAndMonth
| {twoDigitMonth(getCurrentToken().getText()) && twoDigitDay(_input.LT(3).getText())}?
TWO_DIGIT '/' TWO_DIGIT # monthAndDay
;

当我们开始匹配规则date时,我们首先检查dayAndMonth命名的替代项。仅当第一个数字是正确的日期并且第二个数字是正确的月份(用 _input.LT(3) 标记表示)时,我们才匹配 dayAndMonth。否则,我们将匹配 monthAndDay 命名的替代项。

关于java - Antlr4 当第二个谓词失败时不遵循备用路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39754462/

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