Stratego / XT:了解基础知识的基础知识

时间:2011-04-24 02:47:33

标签: program-transformation

我真的试图了解了解Stratego / XT的第一步。我已经google了很多,我发现的所有网络资源似乎都在一开始就有了足够大的飞跃,我无法建立连接。让我解释一下。

我理解这样的抽象语法树:

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,这些内容更易于阅读Stratego / XT网站上的garganutan和复杂官方“教程”?

谢谢!

1 个答案:

答案 0 :(得分: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*)) build 部分)。当左侧不匹配时,规则失败,当前术语保持不变。

d1,d2,d *,e *是与在比赛期间在各自位置找到的子项绑定的术语变量。然后在构建部分中使用这些名称,然后将它们扩展到之前绑定的子树。请注意,确实,*和'可能出现在术语变量名称的末尾。单引号没有特殊含义,而*在列表构建操作中具有特殊含义(这里不是这种情况)。

匹配部分中的语法[d1, d2 | d*]匹配具有至少两个元素的任何列表。这些元素将绑定到d1和d2,列表中的其余元素将绑定到d *(因此d *将是一个列表,可能是空列表[])。

  

此外,是否有足够的资源来进一步深入了解   Stratego / XT更容易阅读garganutan和复杂   Stratego / XT网站上的官方“教程”?

研究论文。虽然不可否认它们并不是很容易阅读,但可以说它们是解释一些更高级概念的唯一地方。

无论如何,请随时在stackoverflow上提出更多问题,我会尽力回答: - )

相关问题