PL/0语言功能扩展[PASCAL VERSION]

来源:互联网 发布:系统温度监控软件 编辑:程序博客网 时间:2024/06/13 10:01

实验一、PL/0语言功能扩展

一、实验目的

1.掌握PL/0语言的结构和过程。

2.通过对PL/0语言的扩展,进一步了解程序语言设计和编译的过程。

二、实验设备

1.普通计算机

2.pascal编译环境

三、实验要求

1.做本实验之前,应预习和实验相关的基础知识

2.按照给出的扩充语法图进行扩展

3.阅读已经给出的pl/0语言c语言(版本)的功能扩展,要求完成pascal语言的扩展功能。

四、实验内容

完成对PL/0语言的功能扩展:

1.增加else语句:

<条件语句>::=if<条件>then<语句> [else<语句>]

2.增加for语句:

FOR <循环变量>=<初值> STEP <增量> UNTIL <终值> DO <语句>

<初值>是表达式

<增量><终值>可以是常量、变量、数字和表达式

3.增加打印格式:

     write语句的功能进行扩充,使其能支持对字符串的打印,例如:

     Write"a=",a,"b=",b;

     Write"hello world!";

4.不等号# 改为 <>

   5.增加 repeat until语句:

 repeat <语句序列> until<条件>

     其中,<条件>是循环条件,即条件成立时,重复执行循环体的< 语句序列>

   6.增加整型一维数组变量,其说明形式最好表示为:

 VAR 〈数组标识名〉[〈下界〉:〈上界〉]

〈下界〉和〈上界〉可用常量表示名

五、实验方案


  http://good.gd/1969883.htm  num-3

本实验在原有的程序上进行扩展,原程序可参考附录1,附录1即教材附录Apl0 pascal实验程序,附录2pl0c语言扩充,附录3为测试程序。

1. 增加else语句

设计思路:

           首先对读到的词调用getsym进行词法分析,把当前的代码地址cx保存在cx2中,调用gen(jmp,0,0)生成条件跳转,地址未知。将当前代码的地址加1赋给cx,同时把cx的地址保存在cx2中。

2.增加for语句:

设计思路:

          首先获取赋值符号左边的标识符,从符号表中查找标识符,若此标识符为变量名,则报错,若是,则调用表达式处理过程算得赋值号右边的值并通过相应的指令将此值放到数据栈顶。然后根据左部变量的位置信息,生成STO指令,将栈顶值存入指定的变量空间,实现赋值操作。

          然后用condition过程处理条件语句,把当前condition生成的判断条件代码地址cx保存到cx1中。在每次循环中,设置跳回条件,判断当前条件是否跳出循环。把本次循环结束的下一个位置保存到cx2生成跳转,并在循环结束时用cx2更新为目前循环结束跳转地址。

3. write语句的功能扩充:

设计思路:

    在词法分析时,当读到读到"时,开始判断读入的内容是否是字符,若是字符,则继续判断读入的东西,直到读入",并使sym=zifu,否则报错,在语法分析中时,当sym=writesym时,若sym=zifu,则:采用中间代码opr 0 a 其中a=17+字符串指针的下标或自己增加新的中间代码指令,即gen(opr,0,17+cur),完成对字符串的处理。在interpret过程中,当opra值不为0-16时,即处理的是zifu

    语法描述图:

 

 

 

 

(

write

exp

stringr

)

exp

 

 

 

 

 

 

 

 

 

 

 

 


4. 不等号# 改为 <>

设计思路:

   当编译器检测到当前字符为“〈”时,接着检测下一个字符,如果是“〉”,则使sym=neq

5. 增加 repeat until语句

设计思路:

     首先对读到的词调用getsym进行词法分析,把当前模块后跟符号集合赋给s,把;和untilsym也赋给s,将当前的代码地址cx保存在cx1中,调用statement(s),然后将语句开始符号集合赋给s2,若开始符号未读完,读入为分号,则进行词法分析,否则输出错误10,若读入为until调用condition过程处理条件语句,同时调用gen(jpc,0,cx1);生成条件跳转

6. 增加一维数组:

设计思路:

    vardeclaration过程中,当读入一个标识符时,若读入的是[,判断读入的是不是数字,若读入数字,则此数字是数组的下界,然后判断是否读入:,若非:,则报错,继续判断读入的时候是数字,若是,此数字为数组的上界,最后判断是否输入的],若非,则报错。此为判断声明数组的过程。

    在过程函数中,当sym中为变量时,若读入一个[,判断下一个字符是否为数字,若是,则判断此数字是否在数组的下界和上界之间,否则报错。然后判断下一个读入的是否为],否则报错。

六、结果验证

将调通后的代码整理成文档,并将本次实验运行结果截屏附在报告中

 

七、建议、心得和收获

 

 

 

 

下载:http://good.gd/1969880.htm

    http://good.gd/1969879.htm


完整版代码:http://download.csdn.net/detail/waylife/4277416 pascal版本,不是c或者c++版本
原创粉丝点击