《编译原理》课程报告 第一章 编译器概述
(1)编译器的功能:
将经过预处理器预处理的源程序(高级语言)转变为目标语言(汇编语言)。编译是指将“一种高级语言”转化为“另一种低级语言”的过程,如将C语言代码转化为与其等效的机器代码。一个现代编译的主要工作流程:源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → (汇编器 →)目标代码(优化) (object code) → 链接器(Linker) → 可执行程序 (executables)。 (2)编译器的工作方法:
1)首先编译器进行词法分析,得到一个个的“单词”,把源文件的字符流转换成记号流。
2)再进行语法分析,识别出记号流中的结构(短语、句子),并构造一棵能够正确反映该结构的语法树
3)然后进行语义分析,就是把各个由语法分析分析出的语法单元的意义搞清楚。
4)最后生成的是目标文件,也称为.obj文件。 5)再经过链接器的链接就可以生成最后的.exe文件了。
6)有些时候需要把多个文件产生的目标文件进行链接,产生最后的代码。
1
第二章 词法分析
2.1 词法分析知识点梳理 2.2.1 语法分析的知识思维导图
大致如图1-语法分析知识思维导图所示:
图1-语法分析知识思维导图
2.2.2 词法分析的概述:
词法分析:根据词法规则识别出源程序中的各个记号(token),每个记号代表一类单词(lexeme)。源程序中常见的记号可以归为几大类:关键字、标识符、字面量和特殊符号。词法分析器的输入是源程序,输出是识别的记号流。词法分析器的任务是把源文件的字符流转换成记号流。本质上它查看连续的字符然后把它们识别为“单词”。
词法分析的任务:从左至右逐个字符地对源程序进行扫描,产生一个个
2
单词符号,把作为字符串的源程序改造成为单词符号串的中间程序。 2.2.3 词法分析器的设计 2.2.3.1输入、预处理
(1)词法分析器工作的第一步是输入源程序文本。输入串一般放在一个缓冲区中,这个缓冲区称输入缓冲区。词法分析器的工作可以直接在这个缓冲区中进行。但在许多情况下,把输入串预处理一下,对单词符号的识别工作将是比较方便的。
(2)预处理工作包括对空白符、跳格符、回车符和换行符等编辑性字符的处理,及删除注解等。我们可以设想构造一个预处理子程序,他完成上面的工作。
(3)每当词法分析器调用它时就处理出一串确定长度的输入字符,并将其装入词法分析器所指定的缓冲区中(称为扫描缓冲区)。这样分析器就可以在此缓冲区中直接进行单词符号的识别工作。
(4)分析器对扫描缓冲区进行扫描时一般使用两个指示器:
1)一个指向当前正在识别单词的开始位置(指向新单词的首字符);
2)另一个用于向前搜索以寻找单词的终点。
不论扫描缓冲区设得多大都不能保证单词符号不会被缓冲区的边界所打断。因此,扫描缓冲区最好使用如下一分为二的区域。 2.2.3.2超前搜索
(1)单词符号的简单识别流程,如图2-单词符号的简单识别流程图 所示:
3
图2-单词符号的简单识别流程图
(2)超前搜索是为了解决识别if , for 等是关键字还是标识符的方式
2.2.3.3状态转换图
(1)使用状态转换图是设计词法分析器的一种好途径。转换图是一张有限方向图。
在转换图中
? 结点代表状态,用圆圈表示; ? 状态之间用箭弧连结;
? 箭弧上的标记(字符)代表在射出结点(即箭弧始结点)状态下可能出现的输入字符或字符类。 (2)看图3-状态转换图1,
4
图3-状态转换图1
在状态1下
? 若输入字符为X,则读进X,并转换到状态2; ? 若输入字符为Y,则读进Y,并转换到状态3。 (3)看图4-状态转换图2
图4-状态转换图2
一张转换图只包含有限个状态(即有限个结点),其中有一个被认为是初态,而且实际上至少要有一个终态(用双圈表示)。 2.2.3.4状态转换图的实现
(1)转换图容易用程序实现。最简单的办法是让每个状态结点对应一小段程序。
2.2.4 词法规则形式化--正规集与正规式
(1)为了更好地使用状态转换图构造词法分析器,为了讨论词法分析器的自动生成,还需要将转换图的概念形式化。
5