(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++文档类资源-CSDN下载
附本人课程设计成绩:



