一、 设计内容 实现一个小型编译程序。
(1) 输入:高级语言源程序;
(2) 输出:四元式程序、汇编语言程序。
二、 设备与环境
电脑设备:Windows 11
语言:C++
开发环境:Visual Studio 2019
三、相关规定
1. 考虑的程序语句
S→if B then S else S︱while B do S︱begin L end︱A
L→S;L︱S
A→i:=E B→B∧B︱B∨B︱¬B︱(B)︱i rop i︱i
E→E+E︱E*E︱(E)︱i
其中,各终结符与非终结符的含义如下:
非终结符 | 含义 |
S | 语句 |
L | 语句串 |
A | 赋值句 |
B | 布尔表达式 |
E | 算术表达式 |
终结符 | 含义 |
i | 整型变量或常数,布尔变量或常数 |
rop | 六种关系运算符的代表 |
; | 起语句分隔符作用 |
:= | 赋值符号 |
¬ | 逻辑非运算符“not” |
∧ | 逻辑与运算符“and” |
∨ | 逻辑或运算符“or” |
+ | 算术加运算符 |
* | 算术乘运算符 |
( | 左括号 |
) | 右括号
|
其中,六种关系运算符分别为:
< 小于 <= 小于等于 <> 不等于
> 大于 >= 大于等于 = 等于
2. 优先级
(1)表达式的运算 由高到低的优先顺序:算术运算>关系运算>布尔运算,并且服从左结合原则。
(2)算术运算符 由高到低的优先顺序:“()”>“*”>“+”。
(3)关系运算符 6 个关系运算符优先级相同。
(4)布尔运算符 由高到低的优先顺序:“¬”>“∧”>“∨”。
3. 单词内部定义
词法分析器输出的单词符号格式为二元式:(单词种别,单词自身的值)。 具体定义如下:
符号 | 种别编码 | 说明 |
sy_if | 0 | 保留字 if |
sy_then | 1 | 保留字 then |
sy_else | 2 | 保留字 else |
sy_while | 3 | 保留字 while |
sy_begin | 4 | 保留字 begin |
sy_do | 5 | 保留字 do |
sy_end | 6 | 保留字 end |
a | 7 | 赋值语句 |
semicolon | 8 | “;” |
e | 9 | 布尔表达式 |
jinghao | 10 | “#” |
S | 11 | 语句 |
L | 12 | 复合语句 |
tempsy | 15 | 临时变量 |
EA | 18 | B and(即布尔表达式中“B∧”) |
EO | 19 | B or(即布尔表达式中“B∨”) |
plus1 | 34 | “+” |
times | 36 | “*” |
becomes | 38 | “:=” |
op_and | 39 | “and” |
op_or | 40 | “or” |
op_not | 41 | “not” |
rop | 42 | 关系运算符 |
lparent | 48 | “(” |
rparent | 49 | “)” |
ident | 56 | 变量 |
intconst | 57 | 整常量 |
其中6种关系运算符,单词种别编码相同,规定其单词自身的值如下表:
关系运算符 | 单词自身值 |
< | 0 |
<= | 1 |
<> | 2 |
> | 3 |
>= | 4 |
= | 5 |
注:
(1)单词自身的值对变量而言是指其在变量表中的位置
(2)若单个种别编码已足以区分该单词是何种类,那么其自身值被定义为0
4. SLR(1)分析表
4.1 算术表达式的 SLR(1)分析表
拓广文法 G[S’]:
(0) S′→E
(1) E→E+E
(2) E→E*E
(3) E→(E)
(4) E→i
分析表如下:
状态 | ACTION | GOTO | |||||
i | + | * | ( | ) | # | E | |
0 | s3 | s2 | 1 | ||||
1 | s4 | s5 | acc | ||||
2 | s3 | s2 | 6 | ||||
3 | r4 | r4 | r4 | r4 | |||
4 | s3 | s2 | 7 | ||||
5 | s3 | s2 | 8 | ||||
6 | s4 | s5 | s9 | ||||
7 | r1 | s5 | r1 | r1 | |||
8 | r2 | r2 | r2 | r2 | |||
9 | r3 | r3 | r3 | r3 |
4.2 布尔表达式的 SLR(1)分析表
拓广文法G[S’]:
(0) S′→E
(1) B→i
(2) B→i rop i
(3) B→(B)
(4) B→not B
(5) A→B and
(6) B→AB
(7) O→B or
(8) B→OB
SLR(1)分析表如下:
状态 | ACTION | GOTO | |||||||||
i | rop | ( | ) | not | and | or | # | B | A | O | |
0 | s1 | s4 | s5 | 13 | 7 | 8 | |||||
1 | s2 | r1 | r1 | r1 | r1 | ||||||
2 | s3 | ||||||||||
3 | r2 | r2 | r2 | r2 | |||||||
4 | s1 | s4 | s5 | 11 | 7 | 8 | |||||
5 | s1 | s4 | s5 | 6 | 7 | 8 | |||||
6 | r4 | s9 | s10 | r4 | |||||||
7 | s1 | s4 | s5 | 14 | 7 | 8 | |||||
8 | s1 | s4 | s5 | 15 | 7 | 8 | |||||
9 | r5 | r5 | r5 | ||||||||
10 | r7 | r7 | r7 | ||||||||
11 | s12 | s9 | s10 | ||||||||
12 | r3 | r3 | r3 | r3 | |||||||
13 | s9 | s10 | acc | ||||||||
14 | r6 | s9 | s10 | r6 | |||||||
15 | r8 | s9 | s10 | r8 |
4.3 程序语句的 SLR(1)分析表
拓广文法 G[S’]:
(0) S′→S
(1) S→if e then S else S
(2) S→while e do S
(3) S→begin L end
(4) S→a
(5) L→S
(6) L→S;L
SLR(1)分析表如下:
表7 程序语句的 SLR(1)分析表
状态 | ACTION | GOTO | |||||||||||
if | then | else | while | begin | do | end | a | ; | e | # | S | L | |
0 | s2 | s3 | s4 | s5 | 1 | ||||||||
1 | acc | ||||||||||||
2 | s6 | ||||||||||||
3 | s7 | ||||||||||||
4 | s2 | s3 | s4 | s5 | 9 | 8 | |||||||
5 | r4 | r4 | r4 | r4 | |||||||||
6 | s10 | ||||||||||||
7 | s11 | ||||||||||||
8 | s12 | ||||||||||||
9 | r5 | s13 | |||||||||||
10 | s2 | s3 | s4 | s5 | 14 | ||||||||
11 | s2 | s3 | s4 | s5 | 15 | ||||||||
12 | r3 | r3 | r3 | r3 | |||||||||
13 | s2 | s3 | s4 | s5 | 9 | 16 | |||||||
14 | s17 | ||||||||||||
15 | r2 | r2 | r2 | r2 | |||||||||
16 | r6 | ||||||||||||
17 | s2 | s3 | s4 | s5 | 18 | ||||||||
18 | r1 | r1 | r1 | r1 |
四、 具体实现
1. 读入待编译程序
2. 词法分析
3. 语法分析和语义分析
3.1算术表达式分析
3.2 布尔表达式分析
3.3 程序语句分析
3.4 显示四元式结果并保存四元式到 pas.med
4. 目标代码生成
因本课设花费较大心血,在此不做细节阐述,给予资源链接,大家自行下载,下载过后有任何问题都可向我咨询。
五、 资源链接
具体实现资源链接如下:
编译原理课程设计——实现一个小型编译程序(C++实现)-C++文档类资源-优快云下载
附本人课程设计成绩: