An open API service indexing awesome lists of open source software.

https://github.com/gdut-yy/pl0_qt

使用Qt重写的PL0 语言编译系统
https://github.com/gdut-yy/pl0_qt

Last synced: 3 months ago
JSON representation

使用Qt重写的PL0 语言编译系统

Awesome Lists containing this project

README

        

# PL/0 编译器 高仿Qt重制版(已更新至 v1.0.2)

## 一、相关 LINK

| 目录 | 说明 |
| - | - |
| [PL0_Raw](https://github.com/gdut-yy/PL0/tree/master/PL0_Raw) | 老师所提供的PL0项目(原始代码,实验和课设需在此基础上进行功能扩充) |
| [**PL0_Exp**](https://github.com/gdut-yy/PL0/tree/master/PL0_Exp) | **本人的实验报告项目** |
| [**PL0_Des**](https://github.com/gdut-yy/PL0/tree/master/PL0_Des) | **本人的课程设计项目** |
| [PL0_Cpp](https://github.com/gdut-yy/PL0_Cpp) | 教材附录A中的 PL/0代码(C版本)。(所用编译器是 VS2017) |
| [PL0_Java](https://github.com/gdut-yy/PL0/tree/master/PL0_Java) | PL0_Cpp 改写而成的 PL/0代码(Java版本)。(所用编译器是 eclipse) |
| [**PL0_Qt**](https://github.com/gdut-yy/PL0_Qt) | **本人的 Qt 高仿重制版** |

## 二、实现功能

1. 增加了保留字 ELSE,FOR,STEP,UNTIL,RETURN; 运算符 *=,/=,&,||,! ;
2. 不等号 由 # 改为了 <> ;
3. 增加了条件语句的ELSE子句 ;
4. 扩充赋值运算:*= 和 /= ;
5. 扩充语句。FOR <变量>:=<表达式>STEP<表达式>UNTIL<表达式>Do<语句> ;
6. (选做)扩充运算符 +=,-= ;
7. (选做)扩充运算:++ 和 -- ;
8. (选做)多行注释功能 /**/ 实现 ;
9. (选做)单行注释功能 // 实现 ;

----

## 三、项目来源

本项目源于 本人大三下学期 编译原理课程 的课内实验和课程设计。课程用书是 清华大学出版社的《编译原理(第3版)》。

尽管当下已是8102年,微软刚刚完成对GitHub的收购,但这门课的 实验和课设 还依旧沿用着“祖传代码”,虽然比起教材后面的源码要好一点(真的只是一点,多了个GUI界面),但Borland C++Builder 6 这个编译器实在是太旧了,作为曾经 T1级别的编译器,在现在这个智能编译器满天飞的时代高下立见,附图为Borland C++Builder 6界面。在Windows 10 版本更新到 1803的今天,由于Borland C++Builder 6的兼容性问题,本人只能专门安装一个 Windows 7的虚拟机 去完成这个 实验和课设。

此刻本人已基本完成 实验和课设。由于在 Windows 7 的虚拟机的 Borland C++Builder 6 编译器上修改代码十分恶心!!!

所以特地花了一个下午用Qt写了这个 高仿重制版。除了重写了 GUI 和修复了几个小 BUG 以外,尽最大力度保持了与源码的一致。

![](demo.png)

![](qt00.png)

## 四、与 Borland C++Builder 6 对比(以 E01.PL0 为例)

### 1、E01.PL0 原文件(显示目标代码):

PROGRAM EX01;
VAR A,B,C;
BEGIN
A:=88;
READ(B);
C=A+B*(3+B);
WRITE(C)
END.

原版输出:

![](cbc01.png)

Qt版本输出:

![](qt01.png)

-----

### 2、E01.PL0 原文件(不显示目标代码):

原版输出:

![](cbc02.png)

Qt版本输出:

![](qt02.png)

-----

### 3、E01.PL0 原文件修正错误后:

PROGRAM EX01;
VAR A,B,C;
BEGIN
A:=88;
READ(B);
C:=A+B*(3+B);
WRITE(C)
END.

原版输出:

![](cbc03.png)

Qt版本输出:

![](qt03.png)

-----

### 4、输入数值2后,COD文件结果:

原版输出:

![](cbc04.png)

Qt版本输出:

![](qt04.png)