背景: 解析器使用CFG(上下文无关语法)来验证输入字符串,并为编译器的下一阶段生成输出。输出可以是解析树或抽象语法树。现在,为了将语义分析与编译器的语法分析阶段交织在一起,我们使用语法定向翻译。
释义 语法规则有助于语法分析。SDT涉及以附加到节点的属性的形式,自下而上和/或自上而下地向解析树传递信息。语法导向的翻译规则在其定义中使用1)节点的词汇值,2)常量和3)与非终结符关联的属性。
语法定向翻译的一般方法是构造一棵解析树或语法树,并通过按一定顺序访问树的节点来计算属性值。在很多情况下,在没有显式转换的情况下,可以在构建树的过程中进行解析。 实例
E -> E+T | TT -> T*F | FF -> INTLIT
这是一种语法,用于在语法上验证包含加法和乘法的表达式。现在,为了进行语义分析,我们将SDT规则扩展到这个语法中,以便向解析树传递一些信息,并检查语义错误(如果有)。在本例中,我们将重点讨论给定表达式的计算,因为在这个非常基本的示例中,我们没有任何语义断言可供检查。
E -> E+T { E.val = E.val + T.val } PR#1E -> T { E.val = T.val } PR#2T -> T*F { T.val = T.val * F.val } PR#3T -> F { T.val = F.val } PR#4F -> INTLIT { F.val = INTLIT.lexval } PR#5
为了进一步理解翻译规则,我们将第一个SDT扩展为[E->E+T]产生式规则。考虑中的转换规则将val作为非终端–E&T的属性。转换规则的右侧对应于生成规则右侧节点的属性值,反之亦然。一般来说,SDT是CFG的扩充规则,它将1)一组属性与语法的每个节点相关联,2)一组翻译规则与使用属性、常量和词汇值的每个产生式规则相关联。
让我们用一个字符串来看看语义分析是如何发生的——s=2+3*4。对应于S的解析树将是
为了评估翻译规则,我们可以在解析树上使用一次深度优先搜索遍历。这是可能的,因为SDT规则不会对求值施加任何特定的顺序,直到在具有所有合成属性的语法的父级之前计算子级属性。否则,我们必须找出最适合遍历解析树的计划,并在一次或多次遍历中评估所有属性。为了更好地理解,我们将以从左到右的方式自下而上地计算示例的翻译规则。
上图显示了语义分析是如何进行的。信息流是自下而上的,所有孩子的属性都是在父母之前计算出来的,如上所述。右侧节点有时用下标1进行注释,以区分子节点和父节点。 其他信息 综合属性 这些属性仅依赖于子节点的属性值。 因此[E->E+T{E.val=E.val+T.val}]有一个与节点E相对应的合成属性val。如果一个扩充语法中的所有语义属性都被合成,那么在语义分析阶段,任何顺序的一次深度优先搜索遍历就足够了。
遗传属性 这些属性依赖于父母和/或兄弟姐妹的属性。 因此[Ep->E+T{Ep.val=E.val+T.val,T.val=Ep.val}],其中E&Ep是注释以区分父级和子级的相同生产符号,具有对应于节点T的继承属性val。
参考: http://www.personal.kent.edu/~rmuhamma/Compilers/MyCompiler/syntaxDirectTrans。htm http://pages.cs.wisc.edu/~fischer/cs536。s06/课程。按住/html/NOTES/4。句法定向翻译。html
本文由 维内特·珀斯瓦尼 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 写极客。组织 或者把你的文章寄去评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。
如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。