当前位置:天才代写 > 作业代写 > PL0编译器实验报告代写 cs论文代写

PL0编译器实验报告代写 cs论文代写

2022-01-19 11:21 星期三 所属: 作业代写 浏览:89

PL0编译器实验报告代写

PL0编译器实验报告

PL0编译器实验报告代写 本综合实验要求学生根据已经掌握的编译技术,读懂读通世界著名科学家 N.Wirth 先生编写的 “PL/0 编译程序”,并根据要求修改编译源程序,在符合 PL/0 语言基本词法、语法规则的前提下,对PL/0 语言的功能进行扩充。

一、 目的与要求

二、 实验内容

三、 实验过程

1.实验扩充的功能及其语法描述

1) 数组

2) Else

3) Break

4) 注释

5) For

6) 双目运算符

7) Write打印格式

2.主要代码模块简析

1) H文件

2) Getsym()

3) Block()

4) Statement()

5) Expression()

6) Term()

7) Factor()

8) Interpret()

3.扩充功能简析

1) 数组(数据结构的扩展、计算功能上的扩展)

2) Else(控制逻辑上的扩展)

3) Break(控制逻辑上的扩展)

4) 注释(额外功能扩展)

5) For(控制逻辑上的扩展)

6) 双目运算符(额外功能扩展)

7) Write打印格式(I/O的功能扩展)

8) 出错处理(高级功能扩展)

四、 实验参考文献

一、目的与要求

本综合实验要求学生根据已经掌握的编译技术,读懂读通世界著名科学家 N.Wirth 先生编写的 “PL/0 编译程序”,并根据要求修改编译源程序,在符合 PL/0 语言基本词法、语法规则的前提下,对PL/0 语言的功能进行扩充。

二、实验内容

  1. 本综合实验要求在解读PL/0 编译程序的基础上,学习 PL/0 语言语法规则、程序结构、词法分析、语法分析和目标代码结构、代码生成、语法错误处理和目标代码在执行时的存储分配。进一步理解编译程序中的各个组成模块的功能,并且能够对编译的过程有个整体的把握。
  2. 根据实验要求对PL/0的语言功能扩展,对PL/0 语言编译程序修改,完成实验要求的基本功能,并对实验扩展功能模块的编译;可以增加除实验要求外的其它功能,鼓励创新。
  3. 修改后的PL/0 语言编译程序,可以编译通过并运行。对于给定的测试用例可以得到正确的目标程序和运行结果。

三、实验过程  PL0编译器实验报告代写

1.实验扩充的功能及其语法描述

1)数组

  • 声明形式

var <数组名> (<上界>:<下界>),如 var a(0:3),其中上界必须大于或等于下界。

  • 使用形式

<数组名>(<下标>),如 a(2),通过下标直接进行索引。

2)Else

  • 使用形式

If <表达式> then <表达式> else <表达式>

3)Break

  • 使用形式

直接进行调用即可。

4)注释

  • 使用形式

/*<注释内容>*/;{<注释内容>};两者皆可。

5)For

  • 使用形式

for<变量>:=<表达式> to <表达式> do <表达式>

6)双目运算符

  • 使用形式

共有++、–、*=、/=四种。

7)Write打印格式

  • 使用形式

write(‘<字符串>’)

2.主要代码模块简析   PL0编译器实验报告代写

1)H文件

  • 扩充部分

关键字符号扩充

名字表类型扩充

名字表结构扩充

Exression()函数参数扩充

2)Getsym()

  • 流程图

  • 扩充部分

PL0编译器实验报告代写
PL0编译器实验报告代写

3)Block()

  • 流程图

4)Statement()

  • 流程图

  • 扩充部分

 

双目运算符

 

Else

PL0编译器实验报告代写
PL0编译器实验报告代写

Break

For

PL0编译器实验报告代写
PL0编译器实验报告代写

5)Expression()    PL0编译器实验报告代写

  • 流程图
PL0编译器实验报告代写
PL0编译器实验报告代写
  • 扩充部分

6)Term()

  • 流程图

7)Factor()

PL0编译器实验报告代写
PL0编译器实验报告代写
  • 流程图

  • 补充部分

对数组的处理

8)Interpret()

  • 扩充部分

3.扩充功能简析    PL0编译器实验报告代写

1)数组(数据结构的扩展、计算功能上的扩展)

  • 名字表中加入array类型

  • 名字表结构中加入下界属性

  • 添加EnterArray函数
PL0编译器实验报告代写
PL0编译器实验报告代写

EnterArray()功能为向名字表中添加数组类型的变量,区别于Enter()

  • Getsym()函数添加
PL0编译器实验报告代写
PL0编译器实验报告代写

添加内容用于识别数组在定义时的语法规则。若冒号后面不是等于号,则认为其不是赋值号,而是数组上下界的隔离标志。

  • Expression参数修改及内容添加(计算功能扩展)

Expression()函数增加nowArray参数用以判断是否是对数组元素进行操作,index参数是相应的数组索引。修改了之后expression()函数可以实现数组的元素的运算功能。

  • 数组元素读入修改

Expression()这个函数会把表达式的值放到栈顶,既然偏移量在栈顶,我们把基地址也放到栈顶,然后相加,那么栈顶的就是真实地址。sto指令并不能满足我们,因为它使用的是名字表的地址,而我们的地址在栈顶,所以添加sto2指令来满足上述要求。两者区别在于sto的地址是传入的,而sto2的地址是从栈顶拿到。

  • Factor数组元素的处理(计算功能扩展)
PL0编译器实验报告代写
PL0编译器实验报告代写

  • 样例程序

程序中首先定义了数组名称为a,长度为3。首先将a[0]赋值为1,再读入a[1]的值,将a[0]和a[1]的和赋给a[2],最后输出a数组全部元素的值。

可见,扩充的部分实现了数组类型以及数组元素的运算。

2)Else(控制逻辑上的扩展)

  • 扩充else关键字

  • Statement()扩充
PL0编译器实验报告代写
PL0编译器实验报告代写

在then关键字后面添加else关键字的处理。若if语句判断出当前条件为假,则会直接跳转至then后的语句的后面。此时若识别出else,则开始处理else后面的语句。

  • 样例程序

程序中定义了变量a,b,将a赋值成3,对a进行判断,如果a小于2则b为0,否则b为1,最后输出b。

可见,扩充的部分实现了else关键字的功能。

3)Break(控制逻辑上的扩展)

  • 扩充break关键字
PL0编译器实验报告代写
PL0编译器实验报告代写

  • Statement()扩展

记录end关键字后面的位置,识别出break关键字后直接跳转到end后面。

  • 样例程序
PL0编译器实验报告代写
PL0编译器实验报告代写

程序的第一个while循环中,在b+1执行完后进行了break,从结果可以看出,b的值停留在了1,c的值停留在了1,都是循环执行1次后的结果。而break直接跳转到end后面,此时执行6次a+1,a的结果为6。

可见,扩充的部分实现了break关键字的功能。

4)注释(额外功能扩展)

  • Getsym()扩充

针对{<注释>},将花括号内部的内容无视掉。

针对/*<注释>*/,将/**/内部的内容无视掉。

  • 样例程序

5)For(控制逻辑上的扩展)

  • 扩充for关键字

  • Statement()扩充
PL0编译器实验报告代写
PL0编译器实验报告代写

先保存循环开始点,将循环判断变量取出放到栈顶,处理表达式E2,之后判断循环条件,生成比较指令。再保存循环结束点,生成跳转指令,将栈顶的值存入循环变量,执行完后无条件跳转到循环开始点。

  • 样例程序

程序中的for循环内,a从0到4,经历了5次循环,b的值每次加一,最终为5。

可见,扩充的部分实现了for关键字的功能。

6)双目运算符(额外功能扩展)    PL0编译器实验报告代写

  • 扩充关键字

  • Getsym()扩充
PL0编译器实验报告代写
PL0编译器实验报告代写

识别++、–、*=、/=符号

  • Statement()扩充

++符号的处理为找到变量地址,将其值入栈,再将常数1取到栈顶,执行加操作;–符号的处理和++类似。*=符号的处理为找到变量地址,将其值入栈,再处理后面的表达式,最后进行乘法操作;/=号的处理和*=类似。

  • 样例程序

a进行++,b进行–,c进行*=3,d进行/=2。

可见,扩充的部分实现了四种双目运算符的功能。

7)Write打印格式(I/O的功能扩展)

  • H文件扩充

  • Getsym()扩充
PL0编译器实验报告代写
PL0编译器实验报告代写

将遇到的每一个’<字符串>’中的字符串内容保存到cache中,再把cache的内容转存至输出字符串集合中。

  • Statement()扩充

若遇到关键字outputsym,直接执行17号操作。

  • Interpret()扩充

将所有输出字符串集合中的元素依次输出。

  • 样例程序

8)出错处理(高级功能扩展)

  • 注释功能出错处理

  • 数组声明错误处理

  • Write出错处理

  • Break出错处理
PL0编译器实验报告代写
PL0编译器实验报告代写
  • For出错处理

  • 错误编码

四、实验参考文献

[1]编译原理(第三版);

[2]编译技术;

[3]CSDN博客;

[4]百度文库;

[5]Github

PL0编译器实验报告代写
PL0编译器实验报告代写

 

更多代写:化学Chemistry代考  Gmat代考  化学网课代做  会计Essay代写论文  国内论文代写  怎么写书评

合作平台:essay代写 论文代写 写手招聘 英国留学生代写

 

天才代写-代写联系方式