我真的试图让我的头围绕理解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上提出更多问题,我会尽量回答他们:-)