ユーザーに次に何を入力するかを指示するANTLR計算機の例の対話型バージョンを作成したいと考えています。たとえば、最初は、、、、ID
およびトークンが可能です。を無視すると、提案メッセージは次のようになります。INT
NEWLINE
WS
WS
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()
状態をキャプチャするのは時期尚早だと思います。