私は、ANTLR4パーサをとり、grun(misc.TestRig
)の-treeオプションで指定されたものと同様の入力用にASTを生成するコードを記述しようとしています。しかし、私はさらに、すべての行番号/オフセット情報を出力に含めることをお勧めします。例えばANTLR4を使用して、プロダクションと行番号をどのように印字するのですか?
、代わりに私が似て
(add (int 5 [line 3, offset 6:7]) '+' (int 6 [line 3, offset 8:9]) [line 3, offset 5:10])
か何かを取得したいのですが
(add (int 5) '+' (int 6))
を印刷します。
ANTLR4の訪問者の例はまだまだたくさんありませんが、ほとんどの場合、デフォルトの実装をtoStringTree
(grunが使用)にコピーすることでこれを行うことができます。ただし、行番号やオフセットに関する情報は表示されません。
私はこのような超簡単なコード書くことができると期待:
String visit(ParseTree t) {
return "(" + t.productionName + t.visitChildren() + t.lineNumber + ")";
}
を、それはこの単純ではないようです。私はパーサから行番号情報を得ることができるはずだと思っていますが、どうやってそれを行うのか分かりません。私の横断でこの行番号/オフセット情報を取得するにはどうすればよいですか?以下の溶液中で、いくつかの空白を埋めるために
は、私が使用:
List<String> ruleNames = Arrays.asList(parser.getRuleNames());
parser.setBuildParseTree(true);
ParserRuleContext prc = parser.program();
ParseTree tree = prc;
tree
とruleNames
を取得します。 program
は私の文法の中でトッププロダクションの名前です。
:
クラスが 'を取るだけです。 –
exitEveryRule
メソッドを更新することによって、あなたの出力に情報を生成するように変更することができますtoStringTree'メソッドを呼び出します。 1つは 'Parser'インスタンスを取りますが、もう1つはルール名の' List@ 280Z28:あなたは本当の事実を述べています。パーサ引数で 'toStringTree'を呼び出すと、実装はルールのリスト(' recog.getRuleNames() ')を取得し、それを' List'をとる 'toStringTree'に渡します。とにかく、これはまだ訪問者を書く間に行番号/オフセット情報を取得する方法を説明していません。 –