【问题标题】:Stratego/XT: Understanding the basic of basicsStratgo/XT:了解基础知识
【发布时间】:2011-08-11 17:16:07
【问题描述】:

我真的试图了解了解 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 的深入理解?

谢谢!

【问题讨论】:

    标签: program-transformation


    【解决方案1】:
    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* 是术语变量,绑定到匹配期间在其各自位置找到的子术语。然后在构建部分中使用这些名称,在那里它们扩展到它们之前绑定的子树。请注意,确实, * 和 ' 可能出现在术语变量名称的末尾。单引号没有特殊含义,而 * 在列表构建操作中有特殊含义(这里不是这种情况)。

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

    另外,有没有很好的资源可以进一步加深对 更容易阅读的 Stratego/XT 比庞大而复杂的 Stratego/XT 网站上的官方“教程”?

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

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

    【讨论】:

    • ...灯亮了。谢谢,托比。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多