私はANTLRを使用してパスカルインタプリタを作成しようとしていますが、現在はASTツリーを歩いている間にループを処理する際にいくつかの問題があります。ANTLRでのループの反復
parametricLoop
: FOR IDENTIFIER ASSIGN start = integerExpression TO end = integerExpression DO
statement
-> ^(PARAMETRIC_LOOP IDENTIFIER $start $end statement)
;
(とdowntoを有する変異体は無視される):forループ例えば は、以下のように解析されます。 どのようにすれば、ループの実行を必要に応じて何度も繰り返すことができますか?私はそのためにinput.Mark()とinput.Rewind()を使うべきであることを知っています。しかし、どこに置くべきでしょうか?私の現在の間違っバリアントは、(ターゲット言語は、C#で)そうなります
parametricLoop
:
^(
PARAMETRIC_LOOP
IDENTIFIER
start = integerExpression
{
Variable parameter = Members.variable($IDENTIFIER.text);
parameter.value = $start.result;
}
end = integerExpression
{
int end_value = $end.result;
if ((int)parameter.value > end_value) goto EndLoop;
parametric_loop_start = input.Mark();
}
statement
{
parameter.value = (int)parameter.value + 1;
if ((int)parameter.value <= end_value)
input.Rewind(parametric_loop_start);
)
{
EndLoop: ;
}
;
(ホープすべてが理解できます)。繰り返しの条件は、ステートメントの最初の実行の前にチェックする必要があります。 MarkとRewindを@initと@afterを含む別のコードブロックに配置してプレイしようとしましたが、後ろにgotoをループヘッドに入れましたが、たびにループが繰り返されるか、Unexpected token metのような例外がスローされました= '(代入)。私は、どのように適切に動作させるのか、どのような実際的な例も見つけることができません。誰もこの問題の解決策を提案できますか?
これらのMark()およびRewind(...)メソッドは、ツリーの文法から呼び出されます。それらは例外を投げていると私は推測する?あなたは「あなたはinput.Mark()とinput.Rewind()」を使用することを知っていますが、あなたにそれを教えてくれましたか?単純なツリーベースのインタプリタについては、以下を参照してください。http://www.antlr.org/wiki/display/ANTLR3/Simple+tree-based+interpeter –
これは、文法を組み合わせて実行しようとしている人です。木文法でこれをやっています(成功することなく、これをやろうとしていることに注意してください)。ツリー文法はCommonTreeオブジェクトの構造化されたコレクションで、AFAIKの 'mark()'や 'rewind(...)'メソッドにはアクセスできません。さらに、あなたの(ツリー)文法の中の複雑な構造を解釈することは、(IMHO)行く方法ではなく、私は本当にここであなたのための「速い修正」を見ません。これを「適切な」方法で行うことは、ページがいっぱいの手頃なサイズの記事を構成するでしょう。 –