首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >basics /XT:了解基础知识

basics /XT:了解基础知识
EN

Stack Overflow用户
提问于 2011-04-24 10:47:33
回答 1查看 309关注 0票数 3

我真的试着让自己的头脑围绕着理解策略/XT的第一步。我已经用谷歌搜索了很多,我找到的所有网络资源似乎在一开始就有了足够大的飞跃,以至于我无法建立联系。让我解释一下。

我对抽象语法树的理解如下:

代码语言:javascript
复制
Minus(Call(Var("f"),[Plus(Var("a"),Int("10"))]),Int("3"))

但是,文档似乎(甚至在下一句中)实现了这样的飞跃:

代码语言:javascript
复制
LetSplit :
  Let([d1, d2 | d*], e*) ->
  Let([d1], Let([d2 | d*], e*))

这对我来说毫无意义。有人能解释一下LetSplit是怎么回事吗?

另外,有没有一个很好的资源,可以让你更容易地阅读《战略/XT》网站上那本庞大而复杂的官方“教程”,从而更好地加深对《战略/XT》的理解?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-26 21:27:48

LetSplit : Let(d1,d2 | d*,e*) -> Let(d1,Let(d2 | d*,e*))

这是一个名称为LetSplit的重写规则。

它等同于策略(语法糖)

代码语言:javascript
复制
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*将是一个列表,并且可能是空的列表[])。

还有,有没有一个很好的资源,可以让你更容易阅读战略/XT网站上的庞大而复杂的官方“教程”,以加深对战略/XT的深入理解?

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

  • Stratego/XT 0.17. A language and toolset for program transformation (可能是在谷歌scholar)
  • Program Transformation with Scoped Dynamic Rewrite Rules中查找要使用的关键字的一个很好的起点(可怕,但包含了大量关于动态重写规则的信息,这些规则很难找到elsewhere)
  • more papers

无论如何,请在stackoverflow上提出更多问题,我将尝试回答这些问题:-)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5768345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档