0

ユーザーに次に何を入力するかを指示するANTLR計算機の例の対話型バージョンを作成したいと考えています。たとえば、最初は、、、、IDおよびトークンが可能です。を無視すると、提案メッセージは次のようになります。INTNEWLINEWSWS

Type an identifier, a number, or newline.

数値を解析した後、メッセージは

Type +, -, *, or newline.

等々。これを行う方法?

編集

私がこれまでに試したこと:

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()状態をキャプチャするのは時期尚早だと思います。

4

1 に答える 1