本实验指导教程作为编译原理课程的课程实验和课程设计的参考,对编译器的构造给出了一些参考性的指导意见。本文档不是一个完整使用手册,所以在阅读时,还需要阅读参考文献,并上网查询相关的资料,最后根据自己的理解,选择一种适合自己的技术线路,完成自定义的高级语言编译器的构造。
目录
1定义高级语言 2
1.1 mini-c语言的文法 3
1.1语言的扩展 3
2词法分析与语法分析 6
2.1 词法分析 7
2.1.1 词法分析的任务 7
2.1.2 FLEX代码结构 8
2.1.3 正则表达式形式 9
2.2 语法分析 12
2.2.1 声明部分 12
2.2.2 辅助定义部分 12
2.2.3 规则部分 15
2.3 报错与容错 16
2.4 抽象语法树(AST) 18
2.5 Flex与Bison的安装 20
2.6语法分析器的构造 22
3语义分析 26
3.1 符号表的管理 27
3.2 静态语义分析 27
3.3 语义程序架构 28
3.3.1 AST遍历 28
3.3.2 作用域与符号表操作 29
4中间代码的生成 32
4.1 中间语言的定义 32
4.2 翻译模式 33
5目标代码的生成 44
5.1 目标语言的指令定义 44
5.2 寄存器的分配 46
5.3 目标代码的生成 46
附录1: 词法分析的程序文件lex.l 49
附录2: 语法分析的程序文件parser.y 51
附录3: 有关定义文件def.h 55
附录4: 抽象语法树的建立与显示ast.c 57
附录5: 语义分析与中间代码生成 61
参考文献 79
1定义高级语言
编译课程的实验,第一个需要完成的工作,就是要定义一个待实现其编译器的语言,用上下文无关文法定义该语言,并给该语言起一个有意义的名称。后续的工作就是完成该语言的编译器。
1.1 mini-c语言的文法
本节给出的是一个简化的C语言的文法,不妨将其称为mini-c。在后续的章节中,主要介绍mini-c的编译过程,给出mini-c语言编译程序构造各阶段实现的指导建议,借此理掌握解编译实现的主要技术线路。Mini-c文法如下:
G[program]:
program → ExtDefList
ExtDefList→ExtDef ExtDefList | ε
ExtDef→Specifier ExtDecList ; |Specifier FunDec CompSt
Specifier→int | float
ExtDecList→VarDec | VarDec , ExtDecList
VarDec→ID
FucDec→ID ( VarList ) | ID ( )
VarList→ParamDec , VarList | ParamDec
ParamDec→Specifier VarDec
CompSt→{ DefList StmList }
StmList→Stmt StmList | ε
Stmt→Exp ; | CompSt | return Exp ;
| if ( Exp ) Stmt | if ( Exp ) Stmt else Stmt | while ( Exp ) Stmt
DefList→Def DefList | ε
Def→Specifier DecList ;
DecList→Dec | Dec , DecList
Dec→VarDec | VarDec = Exp
Exp →Exp =Exp | Exp && Exp | Exp || Exp | Exp < Exp | Exp <= Exp
| Exp == Exp | Exp != Exp | Exp > Exp | Exp >= Exp
| Exp + Exp | Exp - Exp | Exp * Exp | Exp / Exp | ID | INT | FLOAT
| ( Exp ) | - Exp | ! Exp | ID ( Args ) | ID ( )
Args→Exp , Args | Exp
以上只是给出了一个很简单的语言文法,数据类型只支持整型和浮点;函数只有定义,没有原型声明;以及不支持数组,结构等等。