一个简单的语法制导编译器:
该部分的重点是编译器的前端,特别是词法分析、语法分析和中间代码生成。从小事做起,首先建立一个能够将中缀表达式转换为后缀表达式的语法制导翻译器,然后再将其扩展,使之能将某些程序片段转换为三地址码,如图所示:
编译器再分析阶段(前端)把一个源程序划分成各个组成部分,并生成源程序的内部表示形式。这种内部表示称为中间代码,然后编译器在综合阶段(后端)将这个中间代码翻译成目标程序。
一个编译器前端的模型:
-
- 词法分析:使编译器可以处理多个字符组成的构造(比如标识符)和表达式。
- 词法单元:
- 名字:在语法分析时,常将其与终结符号等价
- 属性值:这个值就是一个指向符号表的指针,符号表中包含了该词法单元的附加信息,附加信息不是文法的组成布冯
- 标识符:标识符由多个字符组成,其在语法分析阶段被称为词法单元。
- 表达式:由数值、标识符和“空白字符”(空格、制表符和换行符)等组成。
- 词素:构成一个词法单元的输入字符序列
- 词法:词素的正确形式(正则文法)
- 语法分析(语法扫描):把词法记号流依照语言的语法结构按层次分组,以形成语法短句
- 上下文无关文法:不仅可以描述一个语言的语法,还可以指导程序的翻译过程。
- 语法:程序设计语言的语法描述了该语言的程序的正确形式,常使用上下文无关文法或BNF(Backus-Naur范式)的表示方法来描述语法。
- 语法制导翻译:面向文法的编译技术。
- 语义:该语言的语义定义了程序的含义,结合非形式化描述和启发性的示例来描述语言的语义。
- 中间代码的生成:
- 语法树(抽象语法树):源程序的层次化语法结构。
- 三地址码(三地址指令):x = y op z,其中op是一个二目运算符,y和z是运算分量的地址,x是运算结果的存放地址。最多只执行一个运算,通常是计算、比较或者分支跳转运算。
参考-《编译原理(第二版)》