张昱 中国科学技术大学 计算机科学技术系 2008.4.21 合肥 编译原理实验指导 张昱 中国科学技术大学 计算机科学技术系 2008.4.21 合肥
资源 编译原理实验教程及实验软件包 Java语言规范(第3版)--JLS3 Eclipse AST Help http://staff.ustc.edu.cn/~yuzhang/compiler Java语言规范(第3版)--JLS3 http://java.sun.com/docs/books/jls/ Java 1.5的文法规范文件 java15.cup java15.jj Eclipse AST Help JDT Plug-in Developer Guide Reference API Reference org.eclipse.jdt.core.dom 编译原理实验指导
实验入门指南—初步了解 开发基础 Eclipse AST(见JDT Plug-in Developer Guide) Eclipse、JDK、命令控制台、ant Eclipse AST(见JDT Plug-in Developer Guide) AST节点:ASTNode及派生类 AST的构造:AST类(工厂类) AST的访问:ASTVisitor类 AST的图形化显示包ASTView(见实验教程3.5.6节) SimpleMiniJOOL语言的特点 SkipOOMiniJOOL语言的特点 编译原理实验指导
实验入门指南—深入学习1 开发基础 写一个简单的Java程序 mydir/src/test.java 或者直接利用lab1中的代码lab1/src/… 用Eclipse编译和调试 尝试按实验教程中1.4.3.3节介绍的各种方法来建立工程 学习在Eclipse下调试和运行 在命令控制台下编译和调试 用javac编译Java源程序,得到Java字节码 用java运行Java字节码 写一个ant编译文件(参见实验教程中的图1-14),用ant来编译和运行Java程序 用实验平台运行,熟悉配置文件 编译原理实验指导
实验入门指南—深入学习2 SkipOOMiniJOOL语言及其AST 编写SkipOOMiniJOOL程序 目的:了解语言特点,所写程序可以作为测试程序 查看SkipOOMiniJOOL程序的AST 方法:参见lab5中的Generator1里的main方法 目的:通过AST图形化输出了解一个SkipOOMiniJOOL程序与其AST的对应关系 手工构造SimpleMiniJOOL程序的AST 方法:参见实验教程第3章, TestCase.java等 从小语言入手来学习AST的构造 构造AST的一些注意事项 关于List类型的实例:可以用java.util.LinkedList(或ArrayList) 一个AST节点不能被多棵AST(子树)所引用 编译原理实验指导
实验入门指南—深入学习3 前端:词法分析+语法分析+语义分析 做法 先支持SimpleMiniJOOL,再扩展到SkipOO… 使用JFlex+CUP来生成分析器的源码: 参见ch4和ch5 使用JavaCC来生成分析器的源码: 参见ch5 手工编写分析器 先支持SimpleMiniJOOL,再扩展到SkipOO… 语言中的注意点: 变量的作用域,同名问题的处理,等等 了解AST访问者类、管理符号的一些容器类(如HashMap)、List等等 各类符号的描述信息定义符号类、符号表类 编译原理实验指导
实验入门指南—深入学习4 前端:词法分析+语法分析+语义分析 利用分析器的生成工具构造分析器时, 先构造简单的语法分析器:不构造AST、不进行错误处理 重点:熟悉分析器的生成工具及其使用方法 再构造能输出AST的语法分析器,它只能分析正确的源程序 重点:熟悉在产生式的语义动作中添加构造AST的代码 再构造能处理语法错误并产生AST的语法分析器 重点:识别哪些错误?如何处理错误?如何恢复错误?错误信息? 以AST Visitor的实现类为基础实现语义检查 重点:符号表的设计,语义检查 修改文法规范文件,增加符号表的维护与语义检查动作 重点:注意了解语法和语义分析之间的相互影响 编译原理实验指导
实验入门指南—深入学习5 后端:由AST生成x86或mips汇编码 了解x86汇编码及其相关工具(gcc) 了解mips汇编码及其相关工具(spim) 总结语言的语法结构与汇编码之间的映射关系 写出对应的C程序,用gcc编译得到x86汇编码或spim汇编码 汇编码的内部表示(见实验教程的第7章) 不考虑寄存器分配(假设伪寄存器无限多)的代码生成(lab5或lab6中的Generator1.java) 考虑寄存器分配(假设伪寄存器无限多)的代码生成(lab5或lab6中的Generator2.java) 编译原理实验指导