编译原理第六章学习总结
编译原理第六章学习总结
在编译原理第六章中,我们首先了解到的是属性文法的基本概念,之后学习了基于属性文法的处理方法,讨论如何在自上而下分析和自下而上分析中实现属性的运算。
一 学习内容
Ⅰ属性文法
属性文法是在上下文无关文法的基础上,为每个文法符号(终结符或非终结符)配备若干相关的“值”(称为属性)
属性代表着与文法符号相关的信息 如它的类型/值/代码序列等 同变量一样可以进行计算和传递。
/语义规则:对于文法的每个产生式都配备了一组属性的计算规则,称为语义规则。
/语义规则的介绍
注:终结符只有综合属性 由词法分析器提供
非终结符既可以有综合属性也可以有继承属性 文法开始符号的所有继承属性作为属性计算前的初始值
/属性分类
①综合属性 在语法树中,一个节点的综合属性的值由其子结点的属性值确定,因此通常使用自底向上的方法在每一个结点处使用语义规则计算综合属性的值。
②继承属性 在语法树中,一个结点的继承属性由此结点的父结点和/或兄弟结点的某些属性确定
/语义规则所描述的工作
属性计算
静态语义检查
符号表操作
代码生成
注:语义规则可能产生副作用(如产生代码) 也可能是过程,不是严格的函数
Ⅱ基于属性文法的处理方法
对单词符号串进行语法分析构造语法分析树 根据需要遍历语法树并在语法树的各结点处按语义规则进行计算
输入串→语法树→依赖图→语义规则计算次序
这种由源程序的语法结构所驱动的处理方法就是语法制导翻译法。
依赖图
①如果一棵语法树中一个结点的属性b依赖于属性c,那么这个结点处计算b的语义规则必须在确定c的语义规则后使用
②依赖图的构造算法
/属性的计算次序
一个有向非循环图的拓扑序是图中结点的任何顺序m1,m2,..mk,使得边必须是从序列中前面的结点指向后面的结点。也就是说如果mi→mj是mi到mj的一条边,那么在序列中mi必须出现在mj之前。
/树遍历的属性计算方法
首先假设语法树已建立并且树中已带有开始符号的继承属性和终结符的综合属性。然后以某种次序遍历语法树,直至计算出所有的属性
一遍扫描的处理方法:在语法分析的同时计算属性值 无需构造实际的语法树
/抽象语法树
在语法树中去掉对于翻译不必要的信息从而获得更有效的源程序中间表示,这种经变换后的语法树称之为抽象语法树。
Ⅲ属性文法的自下而上计算
S-属性文法只含有综合属性,综合属性可以在分析输入符号串的同时由自下而上的分析器来计算。分析器可以保存与栈中文法符号有关的综合属性值,每当进行归约时新的属性值就由栈中正在归约的产生式右边符号的属性值来计算。S-属性文法的翻译器通常可借助于LR分析器进行实现。
Ⅳ L-属性文法和自顶向下翻译
L-属性文法的定义
二课后练习
三.学习感悟
在第六章中我们主要学习了语义分析以及翻译方面的知识,相对于前几章的学习,本章的内容较为难理解。对于语法翻译的基本思想和翻译模式以及属性的理解都较为复杂,其中属性的计算要通过一系列的语法规则对属性进行计算和传递,最后来表达翻译的过程。自顶向下翻译和自底向上翻译的学习在逻辑性上我还是有欠缺的地方,在做习题时不能规范完整的做好习题,要达到真正完全的理解本章的知识还需要课后的勤加练习和努力。