本系列为个人编译原理学习笔记,谬误之处恳请高人指点,感激不尽!
内容整理自西安电子科技大学 王小兵、张南、鱼滨老师的编译原理课程。
编译器的工作步骤
在开始说任何东西之前,我们先来大致看一下编译器是怎么工作的——从代码到程序,大概要经过下面这样的步骤——这里用粗浅的语言进行解释,先有个印象即可,后面还会提到
词法分析:编程语言的语句,由一堆堆的单词组成——比如变量类型名、变量名、函数名、值、符号等。既然我们要让机器来分析源程序然后编译,那么就需要首先让计算机能够明白我们写的语句是什么意思,而理解语句的第一步就是理解每个词。所谓词法分析,进行的工作就是让计算机识别单词;
语法分析:完成词法分析,就要通过语法分析来识别语句的结构;
语义分析:该步骤的目标,就是确定“某一条语句是什么意思”,检查一下说的有没有不合法的地方;
符号表管理:相当于字典。符号表用于各个阶段查找、填写;
出错处理:在出现错误时的处理。种类可分词法错误、语法错误、静态/动态语义错误;
中间代码(可选)可以为优化提供支持。中间代码接近于目标语言,却又与具体硬件对应的机器指令无关,便于优化和代码生成。中间代码优化是对指令进行等价变化,提高运行效率;
中间代码经过优化,就可以生成目标代码了。比如二进制程序的机器码,或者各种 VM 用的字节码。
词法分析器 Lex 和词法分析器 Yacc:
Lex(Lexical Analyzar) 是词法分析器, Yacc(Yet Another Compiler Compiler) 是语法分析器。
虽然从名字上看,这两个东西就已经是“分析器”了,然而实际上并不是,他们是用来生成“分析器”的工具。Lex 是用来生成词法分析器的工具,Yacc 是用来生成语法分析器的工具。
这两个工具可以根据我们输入的词法 / 语法规则,自动生成相应的语法分析器、词法分析器,然后这些分析器就可以帮助我们简单地完成对源代码的词法、语法分析。
因这两样工具的存在,开发编译器、解释器的词语法分析器的难度被