2012-05-07 6 views
1

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

私のランタイムオブジェクトのソース位置?私があまりにも多くのことを求めていないのであれば、文法ファイルにできるだけ影響を与えたくありません。

私は可能な限り文法に少しのコードを入れて、品質を向上させようとしました。 sbが生成されたコードと私のランタイムの間のアダプタとして機能し、私のScriptBuilderある

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

:私の(多くの)表現の一つは、このようになります。私はnewBinaryExpressionに追加のパラメータとしてソース位置を追加することができますが、私は他のすべての式にも触れなければなりません。私は、トークンストリームをsbに一度入れるだけで、文法ソースにまったく影響を与えずにストリームからソース位置を取得できることを期待していました。

Antlrが多くのスクリプト言語で使用されているので、ソース位置処理が単一の側面であり、文法ファイル全体に邪魔されたくないので、これを処理する標準的な方法があります。あまり乾燥していない。

答えて

1

私はANTLRは、多くのスクリプト言語で使用されているので、あなたがANLTRがこれをサポートしていないように聞こえる作るこの

を処理するための標準的な方法がある、ということを願っていました。確かにあります:すべてのCommonTokenCommonTreeオブジェクトは、パブリックgetLine()getCharPositionInLine()メソッドを公開していますが、これらのインスタンスを破棄し、独自のノード(Expression)を作成します。

ランタイムオブジェクトをCommonTreeクラスまで拡張し、これらのカスタムランタイムオブジェクトを構築できるようにすることができます(クラスは現在継承しています)。 getLine()およびgetCharPositionInLine()の方法)。参照:Using custom AST node types

+0

TreeAdaptorを私に指摘してくれてありがとう、それはまさに私が探していたものでした。 – Michael

+0

あなたは大歓迎です@マイケル。 –

関連する問題