程序转换- Stratego/XT:了解基础的基础



我真的试图让我的头围绕理解Stratego/XT的第一步。我在谷歌上搜索了很多,我找到的所有网络资源在一开始似乎都有很大的飞跃,我就是不能把它们联系起来。让我解释一下。

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

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网站上庞大而复杂的官方"教程"?

谢谢!

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*) (match部分)匹配当前项时,当前项被右侧的Let([d1], Let([d2 | d*], e*)) (build部分)替换。当左侧不匹配时,规则失败,当前项保持不变。

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

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

还有,是否有很好的资源来进一步深入理解Stratego/XT那是比较容易读懂的,那是庞大而复杂的在Stratego/XT网站上的官方"教程"?

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

  • Stratego/XT 0.17。用于程序转换的语言和工具集(可能是一个很好的起点,可以在例如google scholar中找到要使用的关键字)
  • 具有作用域动态重写规则的程序转换(可怕,但包含了大量关于动态重写规则的信息,很难在其他地方找到)
  • 更多论文

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

最新更新