编译原理内容总结

时间:2021-09-29 16:26:34

编译原理内容总结

    我们学习编译原理的目的是设计编写一个编译程序,将某种语言的程序转化为另一种语言的程序。编译程序的工作过程有5个阶段:词法分析、语法分析、语义分析和中间代码的产生、优化、目标代码的产生。

    编译程序的结构以及每个部分的功能如下:

 编译原理内容总结

词法分析器:输入源程序,进行词法分析,输出单词符号。

语法分析器:在词法分析的基础上,根据语法规则,识别出语法单元。

语义分析和中间代码生成器:对识别的语法单元,分析含义,进行初步翻译。

代码优化器:对中间代码进行加工变换,以产生更高效的目标代码。

目标代码生成器:把中间代码变换成特定机器上的低级语言代码。

前三部分称为编译前端,后两部分称为编译后端。

下面是具体每部分设计原理。

1. 语法分析

    语法分析的实际就是根据不同单词的构词规则识别单词及其类型,由此我们需要设计词法分析器。词法分析器有两种设计方法:1)采用状态图描述构词法,实现识别,这是手工设计词法分析程序;2)采用正规式描述构词法,然后转换为自动机,最后实现单词的识别,也就是自动设计词法分析程序。我们主要使用后者的设计方法,因此我们学习了正则文法、正则表达式、确定的有穷自动机和非确定的有穷自动机以及它们之间的相互转换。 文法是语言的生成系统,FA是语言的识别系统,一条词法规则可以表示为一个正规式,一个正规式可以化为一个DFA,这个DFA就可以用来识别该词法规则定义的所有单词符号。把程序设计语言所有的词法规则都构造出DFA就得到了一个词法分析器。

    我们学习的重点就是将一个正则文法转换为DFA,转换过程分为三步:首先,将正则文法转换成等价的正则表达式,根据正则式对应的转换图转换成NFA;然后根据子集构造算法将NFA确定化为DFA;最后,对DFA化简算法进行化简,得到最小化的DFA。这样一个正则文法就转换成了其对应的DFA,继续进行就可以得到某程序设计语言的词法分析器了。

2. 语法分析

    词法分析是编译过程的核心部分,在语法分析的基础上,分析判定程序的语法结构是否符合语法规则。词法分析器的本质是识别输入的符号串是否是一个句子,并建立一个与输入串相匹配的语法分析树。按照分析树的建立方法,语法分析的识别分为两种方法:自上而下和自下而上的分析方法。

    1)自上而下的分析方法分为确定的和不确定的两种,确定的分析方法有:递归下降分析法和预测分析法LL(1)。自上而下分析法面临一些问题:左递归、回溯和虚假匹配的问题,为了解决这些问题就引进了LL(1)分析法,为了更好的使用LL(1)分析法就构造两个集合FIRST FOLLOW 集,因此自上而下语法分析的重点和难点在于FIRST FOLLOW 集的构造、LL(1)文法的判定和LL(1)预测分析表的构造。

    2)自下而上的语法分析也有两种:优先分析法和LR分析法。

    算符优先算法是基于最左素短语来构造分析树而LR分析法基于句柄来构造分析树的。

    优先分析算法,是为了解决结构规约过程出现的先后顺序不确定性,他指明了规约的先后顺序。优先算法有简单优先算法和算符优先算法,简单优先算法直接说明优先顺序;算符优先算法的优先级是隐含在文法中的,后者是学习的重点。为了更好地描绘出文法中各个符号之间的优先级我们同样定义了两个集合FIRSTVT LASTVT集,这样就能更方便的构造出文法的算符优先表。FIRSTVT LASTVT集以及由算符优先表构造算法构造优先表是这里的重点。

    LR分析法,由于算符优先算法强调优先关系的唯一性,使用范围比较窄,由此引进LR分析法。LR分析法包括LR(0)分析法、SLR(1)分析法、LR(1)分析法和LALR分析法。这里的重点和难点就是相应分析表的构造和根据分析表分析某个输入串的规约过程。

    LR(0)分析表的构造过程如下:a.扩广文法 b.列出所有项目 c.构造扩广文法的项目集规范族 d.由构造算法得到分析表。由于LR(0)分析表构造过程中会出现移进规约冲突,就出现了SLR(1)分析法。二者的不同在于在构造算法中,对含有移进规约冲突或是规约规约冲突的项目集进行后缀集合处理来确定到底是移进还是规约。但SLR(1)分析法也存在局限性,它存在无效规约,就引进了LR(1)分析法,它项目集的构造办法本质上和LR(0)项目集构造规范族办法是一样的,按照其分析表的构造算法来构造LR(1)分析表。但是LR(1)分析表比较庞大,就出现了LALR(1)分析法,它的分析表相对较小、能力差一点,但是可以解决一些SLR不能解决的情形。

3.语义分析和中间代码的产生

    这一阶段的任务是对语法分析产生的语法单元分析含义,初步翻译产生中间代码。学习的重点在于中间代码的形式、布尔表达式的翻译与控制结构的翻译。中间代码表示有三种形式:逆波兰式、图示法和三地址式。图示法有抽象语法树和DAG图,三地址式有三元式、间接三元式和四元式的形式,把一个表达式分别用以上中间形式表示是学习重点之一。另一个重点是将给的布尔表达式和控制结构转化成对应的三地址式,进而用四元式表示,表示出来的四元式就和我们接触过的汇编语言很相似了,这就产生了初步代码。

4.代码优化和目标代码的产生

  代码优化的任务是对中间代码进行加工变换,以产生更高效的目标代码。目标代码生成的任务是把中间代码变换成特定机器上的低级语言代码。

    以上内容就是我们编译原理课程的主要内容,可能有些地方写的不是很详细,主要是对这门课串了串。通过对编译原理课程的学习我了解了编译程序的执行过程,也基本明白了每一部分的设计思路,基于什么来实现的,比如最基本的,词法分析是基于正则文法,语法分析是基于上下文无关文法的。其实这门课程的终极目标是能够自己写出一个编译程序来实现某种语言的转换,我想这个对于我来说目前还是有难度的,学习的最高境界就是将所学的理论知识应用到实践中去,所以我还是希望自己有一天能够运用所学的理论,静下心来设计实现一个编译程序。