gpt4 book ai didi

Antlr 回溯选项不起作用

转载 作者:行者123 更新时间:2023-12-01 23:34:50 27 4
gpt4 key购买 nike

我不确定,但我认为 Antlr 回溯选项无法正常工作或其他原因...

这是我的语法:

grammar Test;
options {
backtrack=true;
memoize=true;
}

prog: (code)+;

code
: ABC {System.out.println("ABC");}
| OTHER {System.out.println("OTHER");}
;

ABC : 'ABC';
OTHER : .;

如果输入流是“ABC”,那么我会看到打印出 ABC。

如果输入流是“ACD”,那么我会看到 OTHER 打印 3 次。

但是如果输入流是“ABD”那么我会看到第 1:2 行不匹配的字符 'D' 期待 'C'第 1:3 行需要 (...)+ 循环在输入 '' 处不匹配任何内容

但我希望看到 OTHER 三次,因为如果第一条规则失败,输入应该匹配第二条规则。

这没有任何意义。为什么解析器在看到最后一个字符不是“C”时没有回溯?但是,“ACD”没问题。

有人可以帮我解决这个问题吗???谢谢你的时间!!!

最佳答案

选项 backtrack=true 仅适用于解析器规则,不适用于词法分析器规则。

编辑

我知道的唯一解决方法是让 "AB" 后跟 "C" 以外的其他字符在相同的 中匹配>ABC 规则,然后手动发出其他 token 。

演示:

grammar Test;

@lexer::members {
List<Token> tokens = new ArrayList<Token>();

public void emit(int type, String text) {
state.token = new CommonToken(type, text);
tokens.add(state.token);
}

public Token nextToken() {
super.nextToken();
if(tokens.size() == 0) {
return Token.EOF_TOKEN;
}
return tokens.remove(0);
}
}

prog
: code+
;

code
: ABC {System.out.println("ABC");}
| OTHER {System.out.println("OTHER");}
;

ABC
: 'ABC'
| 'AB' t=~'C'
{
emit(OTHER, "A");
emit(OTHER, "B");
emit(OTHER, String.valueOf((char)$t));
}
;

OTHER
: .
;

关于Antlr 回溯选项不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6997546/

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