RoundedOrange / CompilerExperiment

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

山东大学软件学院2022编译原理实验

实验项目简介

  1. 这个实验项目包括了词法分析器、语法分析器、语义分析器、代码生成器的Java语言实现。
  2. 项目主要是以老师提供的C++版本编译器进行参考。同时也略微参考了python版本和C版本的编译器。
  3. 可以在Windows(16位)和Linux环境下运行输出的汇编代码。

如何运行

运行环境

  1. 要求有Java才能运行实验的编译器。
  2. 若想要运行汇编代码则还额外需要gcc工具。

开始运行

  1. 本实验的main函数提供了冒泡排序的例子代码,可以更改成其他的代码。
  2. 运行Main.java中的main函数即可运行实验编译器(包括词法分析器、语法分析器、语义分析器、代码生成器)。输出的汇编代码被存在项目根目录下bubble_sort.s中。
  3. 在Linux下若还想运行汇编代码,运行./bubble_sort.sh即可启用脚本。
  4. 在Windows下若想运行汇编代码,运行.\bubble_sort.bat即可启用批处理程序。注意!Windows生成的是16位应用程序,请用合适的Windows版本运行!如果用Windows10或其他不支持16位的Windows操作系统,会显示不兼容!

实现细节

词法分析器

  1. 支持int、float、bool、char等字面常量和普通标识符。还支持很多常见的关键字,还支持比较运算符、间隔符。也能识别用于标识字符流结尾的EOF的token。
  2. 在能够识别C++参考代码中的所有token的基础上又加了老师给的c语言和python语言参考代码中支持的token。所以三个参考代码里的token在我的实验里都能识别。
  3. 在改写的基础上对参考代码的块注释的词法分析代码进行了重写,因为觉得参考代码不太正确。
  4. 因为调整了块注释的代码,所以对应地整合了除法的词法分析代码。
  5. 参考代码只有整个编译器的测试程序,我新编写了专门用于词法分析器的测试程序。
  6. 因为Java程序不支持'\a'和'\v'转义符,所以虽然参考程序能识别这两个转义符,我没有实现这两个转义符的识别。

语法分析器

  1. 已支持C++版本的AST,缺乏对const的判别,未来加入。
  2. 添加测试程序。

语义分析器

  1. 已支持C++版本的语义分析。
  2. 由于Java不支持C++中的一些语言特性,故部分代码采用python版本的逻辑。
  3. 添加测试程序。

代码生成器

  1. 已支持C++版本代码生成。
  2. 添加测试程序。

About


Languages

Language:Java 99.7%Language:Batchfile 0.2%Language:Shell 0.2%