1

Antlr に基づくスクリプト言語があります。実行時オブジェクト (ステートメントなど) を構築するパーサーとツリー文法です。実行時にステートメントを処理するとき、元のソースの位置を知りたい (たとえば、エラーをスローするときに、スクリプト ソース内の行と位置を記述したい)。

ソース位置をランタイム オブジェクトにアタッチするための最善の戦略は何ですか? あまり多くを求めていないのであれば、文法ファイルへの影響をできるだけ少なくしたいと考えています。

品質を向上させるために、文法にできるだけ少ないコードを入れようとしました。たとえば、私の(多くの)式の1つは次のようになります。

multiplyExpression returns [Expression value]
: ^('*' l=expression r=expression)
{
    $value = sb.newBinaryExpression(CorIdentifier.MULTIPLY, $l.value, $r.value);
}
;

where sbis my はScriptBuilder、生成されたコードとランタイムの間のアダプターとして機能します。ソース位置を追加パラメーターとして追加できることはわかっていますnewBinaryExpressionが、他のすべての式にも触れなければなりません。トークン ストリームを sb に 1 回だけ入れて、文法ソースにまったく影響を与えずにストリームからソース位置を取得できることを望んでいました。

Antlr は多くのスクリプト言語で使用されているため、これを処理する標準的な方法があることを期待していました。ソース位置の処理は単一の側面であり、文法ファイル全体に散らかしたくないため、DRY ではありません。

4

1 に答える 1

1

Antlr は多くのスクリプト言語で使用されているため、これを処理する標準的な方法があることを願っていました。

ANLTR がこれをサポートしていないように聞こえます。確かにあります: すべてCommonTokenの andオブジェクトは publicとメソッドCommonTreeを公開しますが、これらのインスタンスを破棄して独自のノードを作成します ( )。この情報を自分のノードに埋め込むために余分な努力をしても驚かないでください:)getLine()getCharPositionInLine()Expression

ランタイム オブジェクトにクラスを拡張CommonTreeさせ、(組み合わせた) 文法でこれらのカスタム ランタイム オブジェクトを構築させることができます (クラスはgetLine()およびgetCharPositionInLine()メソッドを継承するようになりました)。参照:カスタム AST ノード タイプの使用

于 2012-05-08T17:42:37.477 に答える