3

我真的试图了解了解 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 网站上庞大而复杂的官方“教程”更容易阅读?

谢谢!

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*]匹配任何具有至少两个元素的列表。这些元素将绑定到 d1 和 d2 并且列表中的其余元素将绑定到 d* (因此 d* 将是一个列表,并且可能是空列表[])。

此外,是否有一个很好的资源可以更好地加深对 Stratego/XT 的理解,它比 Stratego/XT 网站上庞大而复杂的官方“教程”更容易阅读?

调查报告。虽然不可否认,它们并不是真的更容易阅读,但可以说它们是解释一些更高级概念的唯一地方。

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

于 2011-07-26T13:27:47.957 回答