3

私は、Stratego/XT を理解するための最初のステップに頭を悩ませようとしました。私はたくさんグーグルで調べましたが、私が見つけたすべてのWebリソースは、最初は十分に大きな飛躍を遂げているようで、接続を確立することはできません. 説明させてください。

次のような抽象構文ツリーを理解しています。

Minus(Call(Var("f"),[Plus(Var("a"),Int("10"))]),Int("3"))

しかし、(次の文でも)ドキュメントは次のように飛躍しているようです。

LetSplit :
  Let([d1, d2 | d*], e*) ->
  Let([d1], Let([d2 | d*], e*))

これは私には意味がありません。誰かがここで何が起こっているのか説明できLetSplitますか?

また、Stratego/XT Web サイトの巨大で複雑な公式の「チュートリアル」よりも読みやすい、Stratego/XT の確実な理解を促進するための優れたリソースはありますか?

ありがとう!

4

1 に答える 1

3
LetSplit :
  Let([d1, d2 | d*], e*) ->
  Let([d1], Let([d2 | d*], e*))

これは、LetSplit という名前の書き換えルールです。

これは次の戦略と同等です (構文糖衣) :

LetSplit =
  ?Let([d1, d2 | d*], e*) ;        // match
  !Let([d1], Let([d2 | d*], e*))   // build

呼び出されると、左側 Let([d1, d2 | d*], e*)(一致部分) が現在の用語と一致する、現在の用語が右側Let([d1], Let([d2 | d*], e*))(構築部分) に置き換えられます。左辺が一致しない場合、ルールは失敗し、現在の項は変更されません。

d1、d2、d*、e* は、マッチ中にそれぞれの位置で見つかったサブタームにバインドされたターム変数です。名前はビルド部分で使用され、以前にバインドされていたサブツリーに展開されます。実際、* および ' は用語変数名の最後に表示される場合があることに注意してください。一重引用符には特別な意味はありませんが、* はリスト作成操作で特別な意味を持ちます (ここではそうではありません)。

一致部分の構文[d1, d2 | d*]は、少なくとも 2 つの要素を持つ任意のリストに一致します。これらの要素は d1 と d2 にバインドされ、リスト内の残りの要素は d* にバインドされます (したがって、d* はリストになり、空のリストになる場合があります[])。

また、Stratego/XT Web サイトの巨大で複雑な公式の「チュートリアル」よりも読みやすい、Stratego/XT の確実な理解を促進するための優れたリソースはありますか?

研究論文。確かに、それらは本当に読みやすいわけではありませんが、間違いなく、いくつかのより高度な概念が説明されている唯一の場所です。

とにかく、ここでスタックオーバーフローについてもっと質問してください。私はそれらに答えようとします:-)

于 2011-07-26T13:27:47.957 に答える