如何使用ANTLR创建建议消息?
我想创建一个交互式版本的ANTLR,它告诉用户下一步要键入什么。例如,在开始时,如何使用ANTLR创建建议消息?,antlr,interactive,Antlr,Interactive,我想创建一个交互式版本的ANTLR,它告诉用户下一步要键入什么。例如,在开始时,ID、INT、NEWLINE和WS标记是可能的。忽略WS,建议消息可以是: 键入标识符、数字或换行符。 解析数字后,消息应为 Type+、-、*、或换行符。 等等。如何做到这一点 编辑 到目前为止,我所尝试的: private void accept(String sentence) { ANTLRInputStream is = new ANTLRInputStream(sentence); Ope
ID
、INT
、NEWLINE
和WS
标记是可能的。忽略WS
,建议消息可以是:
键入标识符、数字或换行符。
解析数字后,消息应为
Type+、-、*、或换行符。
等等。如何做到这一点
编辑
到目前为止,我所尝试的:
private void accept(String sentence) {
ANTLRInputStream is = new ANTLRInputStream(sentence);
OperationLexer l = new OperationLexer(is);
CommonTokenStream cts = new CommonTokenStream(l);
final OperationParser parser = new OperationParser(cts);
parser.addParseListener(new OperationBaseListener() {
@Override
public void enterEveryRule(ParserRuleContext ctx) {
ATNState state = parser.getATN().states.get(parser.getState());
System.out.print("RULE " + parser.ruleNames[state.ruleIndex] + " ");
IntervalSet following = parser.getATN().nextTokens(state, ctx);
for (Integer token : following.toList()) {
System.out.print(parser.tokenNames[token] + " ");
}
System.out.println();
}
});
parser.prog();
}
打印第一个令牌的正确建议,但对于所有其他令牌,它打印当前令牌。我想在
enterEveryRule()
捕获状态还为时过早。在LL(k)解析器中准确地收集这些信息,其中k>1,需要彻底了解解析器内部。几年前,我在ANTLR 3中遇到了这个问题,发现唯一真正的解决方案是如此复杂,以至于我成为了ANTLR 4的合著者,因此我可以处理这个问题
ANTLR(包括ANTLR 4)在解析阶段消除解析树的歧义,这意味着如果您的语法不是LL(1),那么在解析树中执行此分析意味着您已经丢失了准确所需的信息。您需要编写自己版本的parsertansimulator
(或封装它的自定义解释器),这样就不会丢失信息