同济大学2021级软件工程 张恺瑞 蒋钰萱 赵明泽 宓田田
该项目是小型 PL/0 编程语言的简单编译器,旨在加深对编译器构造的理解。PL/0 编译器将 PL/0 语言源程序作为输入,并输出以三地址代码格式表示的中间代码。
该编译器是单通道编译器,其中词法分析模块作为子程序,在需要时由语法分析模块调用。实现过程使用语法定向翻译技术,在进行语法分析的同时生成中间代码,生成的代码保存到文件中。
- 输入:PL/0 语言源程序。
- 输出:中间代码(三地址代码)。
- 单程编译过程。
- 整合了词法分析、语法分析和中间代码生成。
- 语法定向翻译方法。
- 词法分析: Thompson算法
- 语法分析: 递归下降解析法
- 中间代码生成: 属性⽂法、翻译⼦程序等
-
词法规则:
- 关键字:
program
,begin
,end
,const
,var
,while
,do
,if
,then
。 - 标识符: 以字母开头,后跟字母和数字的字符串。
- 整数: 以数字开头的数字序列。
- 运算符和分隔符:
+
,-
,*
,/
,:=
,=
,<>
,>
,>=
,<
,<=
,(
,)
,;
,,
.
- 关键字:
-
语法规则:
- <程序>→<程序⾸部> <分程序>
- <程序⾸部>→PROGRAM <标识符>
- <分程序>→[<常量说明>][<变量说明>]<语句>(注:[ ]中的项表⽰可选)
- <常量说明>→CONST <常量定义>{,<常量定义>} ; (注: { }中的项表⽰可重复若⼲次)
- <常量定义>→<标识符>:=<⽆符号整数>
- <⽆符号整数>→<数字>{<数字>}
- <变量说明>→VAR<标识符>{,<标识符>};
- <标识符>→<字⺟>{<字⺟> | <数字>}
- <复合语句>→BEGIN <语句>{; <语句>} END
- <语句>→<赋值语句> | <条件语句 >| <循环语句> | <复合语句> | <空语句>
- <赋值语句>→<标识符>:=<表达式>
- <表达式>→[+|-]项 | <表达式> <加法运算符> <项>
- <项>→<因⼦> | <项><乘法运算符> <因⼦>
- <因⼦>→<标识符> |<⽆符号整数> | (<表达式>)
- <加法运算符>→ + | -
- <乘法运算符>→ * | /
- <条件语句>→IF <条件> THEN <语句>
- <循环语句>→WHILE <条件> DO <语句>
- <条件>→<表达式> <关系运算符> <表达式>
- <关系运算符>→ = | <> | < | <= | > | >=
- <字⺟>→a | b …| x | y | z
- <数字>→0 | 1 | … | 8| 9
PROGRAM add
VAR x, y;
BEGIN
x := 1;
y := 2;
WHILE x < 5 DO
x := x + 1;
IF y > 0 THEN
y := y - 1;
y := y + x
END
确保已安装 g++
,并已在环境中设置,以便使用VScode编译和运行 C++ 代码。
导航至项目目录,在终端中使用以下命令将源代码编译为可执行文件:
g++ -o program main.cpp Lexer.cpp Parser.cpp -std=c++17
要运行 PL/0 编译器,请使用以下命令:
./program
运行编译器后,将生成中间代码保存到IR.txt,生成的标识符表将输出到IT.csv