Antlr4 で生成されたコードには、元のソースを再構築するために文法とパーサー ツリーを使用できるアンパーサーのようなものが含まれていますか? それが存在する場合、どうすればそれを呼び出すことができますか? 一部のアプリケーションとデバッグで役立つ可能性があるため、質問します。
2 に答える
はい!ANTLR のインフラストラクチャは (通常) 元のソース データを利用できるようにします。
デフォルトのケースでは、CommonTokenStream を使用します。これはBufferedTokenStreamを継承しており、取得するための多数のメソッドを提供します。
メソッド getHiddenTokensOnLeft (および ...Right) は、DEFAULT ストリームに表示されないトークンのリストを取得します。これらのトークンは、getText() を使用してソース テキストを明らかにします。
さらに便利なのは BufferedTokenStream.getText(interval) です。これは、ツリー要素 (RuleContext) から取得できる Interval のテキスト (非表示を含む) を提供します。
CommonTokenStream とそのメソッドを利用するには、それを作成した場所から渡し、解析ツリーを調べているクラス (XXXBaseListener など) にパーサーを設定するだけです。Listener に、インスタンス フィールドとしての CommonTokenStream。
したがって、ルール ctx の完全なテキストが必要な場合は、次の小さな方法を使用します。
String originalString(ParserRuleContext ctx) {
return this.tokenStream.getText(ctx.getSourceInterval());
}
または、行番号とオフセットをいじりたい場合は、トークンにも行番号とオフセットが含まれています。