Antlr に基づくスクリプト言語があります。実行時オブジェクト (ステートメントなど) を構築するパーサーとツリー文法です。実行時にステートメントを処理するとき、元のソースの位置を知りたい (たとえば、エラーをスローするときに、スクリプト ソース内の行と位置を記述したい)。
ソース位置をランタイム オブジェクトにアタッチするための最善の戦略は何ですか? あまり多くを求めていないのであれば、文法ファイルへの影響をできるだけ少なくしたいと考えています。
品質を向上させるために、文法にできるだけ少ないコードを入れようとしました。たとえば、私の(多くの)式の1つは次のようになります。
multiplyExpression returns [Expression value]
: ^('*' l=expression r=expression)
{
$value = sb.newBinaryExpression(CorIdentifier.MULTIPLY, $l.value, $r.value);
}
;
where sb
is my はScriptBuilder
、生成されたコードとランタイムの間のアダプターとして機能します。ソース位置を追加パラメーターとして追加できることはわかっていますnewBinaryExpression
が、他のすべての式にも触れなければなりません。トークン ストリームを sb に 1 回だけ入れて、文法ソースにまったく影響を与えずにストリームからソース位置を取得できることを望んでいました。
Antlr は多くのスクリプト言語で使用されているため、これを処理する標準的な方法があることを期待していました。ソース位置の処理は単一の側面であり、文法ファイル全体に散らかしたくないため、DRY ではありません。