如何使用ANTLR创建建议消息?

如何使用ANTLR创建建议消息?,antlr,interactive,Antlr,Interactive,我想创建一个交互式版本的ANTLR,它告诉用户下一步要键入什么。例如,在开始时,ID、INT、NEWLINE和WS标记是可能的。忽略WS,建议消息可以是: 键入标识符、数字或换行符。 解析数字后,消息应为 Type+、-、*、或换行符。 等等。如何做到这一点 编辑 到目前为止,我所尝试的: private void accept(String sentence) { ANTLRInputStream is = new ANTLRInputStream(sentence); Ope

我想创建一个交互式版本的ANTLR,它告诉用户下一步要键入什么。例如,在开始时,
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
(或封装它的自定义解释器),这样就不会丢失信息