编译原理课程设计——小型编译器的设计与实现

 一、 设计内容 实现一个小型编译程序。

(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下载

附本人课程设计成绩:

  • 4
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月初XH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值