编译原理 课程总结

       学习编译原理的目的是学习设计与构造程序设计语言编译程序的原理与方法。编译器就是一个程序,它读入用某种语言编写的源程序,并翻译成一个与之等价的另一种语言编写的源程序。编译程序的工作,从输入源程序开始,到输出目标程序结束,与自然语言之间的翻译有很多相似之处。

       第一章讲编译器的基本结构

    编译原理 课程总结_第1张图片

            词法分析是识别出句子中的单词

            语法分析是分析句子的语法结构

            语义分析及中间代码生成是根据句子的含义进行初步分析

            代码优化是对译文进行修饰

            目标代码生成是写出最后的译文

    第二章讲高级语言及其语法描述,主要包括程序设计语言的语法、程序设计语言的语义、程序设计语言的特点、程序设计语言的语法描述。

    第三章讲词法分析,编译程序是从单词的级别上来分析和翻译源程序的。词法分析的任务是从左至右逐个字符地对源程序进行扫描,产生一个个的单词符号,把作为字符串的源程序改造成为单词符号串的中间程序。执行词法分析的程序称为词法分析器。 首先是对词法分析器的要求,包括功能、输出形式、作为一个独立子程序。接下来是词法分析器的设计,包括输入、预处理和单词符号的识别(超前搜索),其中,状态转换图比较重要,因为后面会用到。最后是正规表达式与有限自动机,这也是本章的重点和难点。正规表达式与正规集相对应,具有相同特征的字组成正规集,正规式是用一种形式化的方法来表示正规集。正规集相同的两个正规式等价。等价正规式之间符合结合律、交换律、分配律等。确定的有限自动机(DFA)与非确定的有限自动机(NFA)的区别在于映射不同,非确定的有限自动机初态是一个非空集合,而确定的有限自动机的初态是唯一的。DFA是NFA的特例,通过证明可以证,可通过子集法将NFA确定化为DFA(重点)。确定的有限自动机和非确定的有限自动机都可以用状态转换矩阵和状态转换图表示。正规式与有限自动机的转换也是重点。首先,正规文法与有限自动机具有等价性,对于正规文法G和有限自动机M,如果L(G)=L(M),则称G与M是等价的。须掌握正规式与有限自动机的互相转换。

确定有限自动机的化简:寻找一个状态更少的DFA。注意化简的步骤和算法。

    第四章讲自上而下语法分析,语法分析是编译过程的核心部分,语言的语法结构是用上下文无关描述的。因为自上而下分析可能会存在两大问题,左递归和回溯,所以产生了消除左递归和克服回溯的方法----LL(1)分析法。使用LL(1)分析法要涉及FIRST集和FOLLOW集,这是重点。当一个文法满足LL(1)条件时,就可以构造递归下降分析器,预测分析程序是另一种使用一张分析表和一个栈实现LL(1)分析的有效方法。其中构造分析表是重点。

    第五章讲自下而上语法分析,自下而上分析是从输入串开始,逐步进行规约,直至规约到文法的开始符号,就是一种“移进-规约”法。自上而下分析的中心问题是怎样判断栈订单符号串的可归约性以及如何规约。解决方案是规范规约。所谓规范规约就是每一步都把句柄换成它对应的产生式的左部符号,句柄就是最左直接短语,此处涉及短语和直接短语的概念。对于规范规约,我个人的理解是:句子中相对最左的可以组成某个产生式右部的一个或多个符号就是最左直接短语,而把它们用相应产生式的左部替换的过程就是规范规约。规范规约可以用符号栈和语法树来表示,用符号栈:有四类操作:移进、规约、接受和出错处理,任何可规约串必出现在栈顶,即当发现栈顶呈现句柄时就用相应产生式的左部符号进行替换。接着,又产生了进一步的问题:如何寻找句柄(寻找句柄的算法)。接着引入LR分析法。LR方法的基本思想是在规范规约的过程中,记住已移进和规约出的整个符号串,并根据所用产生式推测未来可能碰到的输入符号,然后根据输入符号来确定栈顶的符号串是否构成相对某一产生式的句柄。LR分析器的实质是一个带先进后出栈的确定有限状态自动机,它的每一步工作都是由栈顶状态和现行输入符号所唯一决定的。LR分析器的核心部分是一张分析表,一是动作(ACTION)表,另一是状态转换(GOTO)表,它们都是二维数组。LR分析器的工作过程可看成是栈里的状态序列、已规约串和输入串所构成的三元式的变化过程。LR文法是一个能够构造一张分析表,使得它的每个入口均是唯一确定的文法。涉及四种不同分析表的构造方法,首先是LR(0)表构造法。最多向前看K个的符号就可以决定动作的LR分析器所分析的文法成为LR(k)文法。LR(0)是一种只概括“历史”资料而不包含推测性“展望”材料的“状态”。涉及前缀和活前缀的概念。LR分析表的构造需要构造识别活前缀的有限自动机,用有限自动机中的状态表示分析表中的状态,用状态图中的状态之间的转换关系对分析表中的action goto函数等进行定义。构成识别一个文法活前缀的DFA项目集(状态)的全体称为这个文法的LR(0)项目集规范族。第二种是SLR表构造法,规范族中会有含有冲突的项目集,向前查看一个符号,以确定采用的动作。第三种是规范LR表构造法,仍有许多文法构造的LR(0)项目集规范族存在的动作冲突不能用SLR(1)方法解决。最后一种是LALR分析表。算符优先分析法是一种简单直观、广为使用的自下而上分析法,它不是一种规范规约法。算符优先分析就是定义算符之间的某种优先关系,借助于这种优先关系寻找可规约串和进行规约。其中涉及算符文法和算符优先文法的概念。从算符优先文法构造优先关系表,首先需要对文法的每个非终结符构造两个集合FIRSTVT和LASTVT,其中涉及对两个集合的理解。在实际实现算符优先分析算法时,一般采用优先函数,入栈优先函数和比较优先函数。这种方法的优点是节省存储空间,缺点是可能会导致输入串的错误。如果存在优先函数,就可以利用优先表构造优先函数,构造优先函数有三部。算符优先分析有两种情况会出现语法错误,用进行出错处理。   

    第六章讲属性文法与语法制导翻译,属性文法是在上下文无关文法的基础上为每个文法符号(终结符或非终结符)配备若干个相关的“值”,称为“属性”。属性分为综合属性和继承属性。综合属性用于“自下而上”传递信息,在语法树中,一个结点的综合属性的值,由其子结点的属性值确定。继承属性用于“自上而下”传递信息。在语法树中,一个结点的继承属性由此结点的父结点和/或兄弟结点的某些属性确定。语义规则是属性计算的过程即是语义处理的过程对于文法的每一个产生式配备一组属性的计算规则。基于属性文法的处理过程是输入串——》语法树——》依赖图——》语义规则计算次序——》计算结果。在一颗语法树中的结点的继承属性和综合属性之间的相互依赖关系可以用称作依赖图的一个有向图来描述。假设语法树已经建立起了,并且树中已带有开始符号的继承属性和终结符的综合属性。然后以某种次序遍历语法树,直至计算出所有的属性。最常用的遍历方法是深度优先,从左到右的遍历方法,如果需要,可使用多次遍历。与树遍历的属性计算方法不同,一遍扫描的处理方法是在语法分析的同时计算属性值,而不是语法分析构造语法树之后进行属性的计算,而且无需构造实际的语法树。从语法树中去掉对翻译不必要的信息,而获得更有效的源程序中间表示。这种经变换后的语法树称之为抽象语法树。S-属性文法的自下而上计算和L-属性文法的自顶向下翻译。翻译模式是语法制导定义的一种便于翻译的书写形式。其中属性与文法符号相对应,语义规则或语义动作用花括号{ }括起来,可被插入到产生式右部的任何合适的位置上。这是一种语法分析和语义动作交错的表示法,他表达在按深度优先遍历分析树的过程中何时执行语义动作。翻译模式给出了使用语义规则进行计算的顺序。可看成是分析过程中翻译的注释。

    第七章讲语义分析与中间代码生成,语义分析的任务是审查每一个语法结构的静态语义,即验证语法正确的结构是否有意义。几种常用的中间语言形式有:逆波兰表示法、图表示法、三元式、间接三元式、四元式。 波兰表示是一种既不须考虑优先关系、又不用括号的一种表示表达式的方法(前缀式)。图表示法又包括抽象语法树和无循环有向图(DAG)。三元式由三个部分组成:算符:OP,第一运算分量:ARG1,第二运算分量:ARG2。间接三元式是在三元式的基础上附加一张指示器表─间接码表,按运算的先后顺序列出有关三元式在三元式表中的位置。四元式是一个带有四个域的记录结构:op,arg1,arg2及result。它实际上就是一条三地址的指令。数组元素的地址计算公式是 base + (i – low)*w  其中,low为数组下标的下界, base是分配给数组的相对地址,即base为A的第一个元素A[low]的相对地址。  base + (i – low)*w   可整理为:  i*w + (base –low*w) 其中: i*w  是随数组下标变量而变化的部分,记为VARPART ,(base – low*w)是在数组中不变化的常数记为CONSPART。二维数组按行存放,则相对地址可表示为:base + (( i1 – l1)*d2 + i2 – l2) *w其中,l1、l2分别为i1、i2的下界;di界差。若ui为i的上界,则di=ui – li +1.假定i1,i2是编译时唯一尚未知道的值,我们可以重写上述表达式为:( base –( (l1 *d2) + l2) *w)+ ( (i1*d2) + i2) *w其中:前一项子表达式( base – ((l1 *d2) + l2) *w )的值是可以在编译时确定的记为常数CONSPART。后一子项随i1, i2 而改变是一个变数记VARPART。控制流语句的翻译,包括条件语句中布尔表达式的翻译、标号和无条件转移的翻译、循环与分情况语句的翻译、过程调用的翻译。















你可能感兴趣的:(编译原理)