语法定向翻译

诺瓦克007

我正在尝试为给定cfg之后的3个代码表示形式编写表达式的语法定向翻译的语义规则。

考虑,

在此处输入图片说明

在这里,为什么|| 需要操作员吗?gen()是唯一需要的东西,因为它确实完成了所需的东西。

艾拉·巴克斯特(Ira Baxter)

这套规则描述了一种属性语法,一种用于计算树属性的方案。这样的方案几乎总是纯粹是功能性的(无副作用)。它是在每个规则/树节点上计算属性,并在其使用的符号中命名为XY,其中X代表规则/树(例如,S和E以及变体E1和E2。Y代表计算出的属性(在这种情况下,有“代码”和“位置”属性。

每个规则对应一个子树,S =表达式中,E = E1 + E2对应树(E + E1 E2)。“ E.code:= ...”表示计算“ ...”,并将结果分配给“ E(+)”树根处的属性“ code”(“合成”属性);“ E1.code:= ...”表示计算“ ...”并分配给“ E1”叶(“继承的属性”)。不在分配左侧的“ XY”表示“在节点X上获取属性Y的值”。

所使用的计算是“ newtemp”(由于它不是变量,而是函数,因此实际上应该是“ newtemp()”),“ gen(...)”和“ ||”。“ gen”显然是在完成制造各个指令的关键工作。但是它的结果是什么?一个简单的答案就是“一个字符串”。一个更复杂的答案可能是所生成指令的二进制表示。

“ ||”的目的 将代码生成步骤的结果组合到生成的代码中;如果gen结果是字符串,则“ ||” 可以是字符串连接,如果结果是二进制记录,则将二进制记录列表串联为单个列表。

您可能会以为“ gen”只是产生其结果并将其写入未提及的输出流而感到困惑。这将违反属性​​语法的精神,而这是不允许的。“ ||” 需要运算符来计算沿树传递的功能结果。

您可能会弯曲属性语法,因此gen确实会写入隐藏的流。在这种情况下,所有“ ||” 运算符消失了,就像前面提到的计算结果(例如“ E1.code”)一样。如果您的属性树评估是从左到右(大),则严格按照从左到右的顺序正确组合生成的子树以生成结果流的顺序,就可以完成此工作。如果属性语法说“ E.code = E2.code || E1.code || gen(...)”,也就是说,它正在重新排列生成的代码,则隐藏的输出流技巧将不起作用。

从另一个角度来看:假设您想在大型程序中快速评估此属性语法。如果您坚持纯粹的功能语法,则可以并行评估所有属性您使用一个递归过程为每个孩子分叉助手谷物。[听起来疯了吗?并非如此,我有一个完全基于此原理的属性评估器系统(请参阅我的简历)。隐藏的输出流在这种情况下也不起作用,因为并行性可能导致以任何顺序访问子级。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章