80 likes | 346 Views
编译原理实验指导. 张昱 中国科学技术大学 计算机科学技术系 2008.4.21 合肥. 资源. 编译原理实验教程及实验软件包 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
E N D
编译原理实验指导 张昱 中国科学技术大学 计算机科学技术系 2008.4.21 合肥
资源 • 编译原理实验教程及实验软件包 • 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 • ReferenceAPI Referenceorg.eclipse.jdt.core.dom 编译原理实验指导
实验入门指南—初步了解 • 开发基础 • 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 • 前端:词法分析+语法分析+语义分析 • 做法 • 使用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) 编译原理实验指导