广工计算机操作系统实验,广工操作系统实验.doc

广工操作系统实验.doc

编译原理课程设计

学 院_____计算机学院________

专 业____计算机科学与技术____

年级班别______11级7班_________

学 号______3111005976________

学生姓名______解玮珩_______

指导教师______________________

成 绩

20 14年 1 月

一、实验目的与要求

对PL/0作以下修改扩充:

(1)增加单词:

保留字 ELSE,FOR,STEP,UNTIL,DO,RETURN

运算符 *=,/=,&,||,!

(2)修改单词:不等号# 改为 <>

(3)增加条件语句的ELSE子句,要求:写出相关文法,语法图,语义规则。

二、实验环境与工具

(1)计算机及操作系统:PC机,WindowsXP,Windows7

(2)程序设计语言:C/C++

(3)使用软件Borland C++ Builder 6

(4)教学型编译程序:PL/0

三、设计方案

1、结构设计说明

(1)PL/0 语言编译器

PL/0语言可看成是PASCAL语言的子集,它的编译程序是一个编译解释执行系统。PL/0的目标程序为假想栈式计算机的汇编语言,与具体计算机无关。

(2)PL/0编译程序的语法分析过程BLOCK是整个编译过程的核心。编译程序的总体流程,弄清BLOCK过程在整个编译程序中的作用。

(3)各功能模块描述

过程或函数名简要功能说明pl0主程序error出错处理,打印出错位置和错误编码getsym词法分析,读取一个单词getch漏掉空格,读取一个字符gen生成目标代码,并送入目标程序区test测试当前单词符号是否合法block分程序分析处理过程enter登录名字表position(函数)查找标识符在名字表中的位置constdeclaration常量定义处理vardeclaration变量说明处理listode列出目标代码清单statement语句处理expression表达式处理term项处理factor因子处理condition条件处理interpret对目标代码的解释执行程序base(函数)通过静态链求出数据区的基地址

2、主要成分描述

(1)符号表

为了组成一条指令,编译程序必须知道其操作码及其参数(数或地址)。这些值是由编译程序本身联系到相应标识符上去的。这种联系是在处理常数、变量和过程说明完成的。为此,标识符表应包含每一标识符所联系的属性;如果标识符被说明为常数,其属性值为常数值;如果标识符被说明成变量,其属性就是由层次和修正量(偏移量)组成的地址;如果标识符被说明为过程,其属性就是过程的入口地址及层次。常数的值由程序正文提供,编译的任务就是确定存放该值的地址。我们选择顺序分配变量和代码的方法;每遇到一个变量说明,就将数据单元的下标加一(PL/0 机中,每个变量占一个存贮单元)。开始编译一个过程时,要对数据单元的下标dx 赋初值,表示新开辟一个数据区。dx 的初值为3,因为每个数据区包含三个内部变量RA,DL 和SL。

(2)运行时存储组织和管理

对于源程序的每一个过程(包括主程序),在被调用时,首先在数据段中开辟三个空间,存放静态链SL、动态链DL和返回地址RA。静态链记录了定义该过程的直接外过程(或主程序)运行时最新数据段的基地址。动态链记录调用该过程前正在运行的过程的数据段基址。返回地址记录了调用该过程时程序运行的断点位置。对于主程序来说,SL、DL和RA的值均置为0。静态链的功能是在一个子过程要引用它的直接或间接父过程(这里的父过程是按定义过程时的嵌套情况来定的,而不是按执行时的调用顺序定的)的变量时,可以通过静态链,跳过个数为层差的数据段,找到包含要引用的变量所在的数据段基址,然后通过偏移地址访问它。在过程返回时,解释程序通过返回地址恢复指令指针的值到调用前的地址,通过当前段基址恢复数据段分配指针,通过动态链恢复局部段基址指针。实现子过程的返回。对于主程序来说,解释程序会遇到返回地址为0的情况,这时就认为程序运行结束。解释程序过程中的base函数的功能,就是用于沿着静态链,向前查找相差指定层数的局部数据段基址这在使用sto、lod等访问局部变量的指令中会经常用到。  类PCODE代码解释执行的部分通过循环和简单的case判断不同的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 扩充语句(pascal的for语句): for <变量>:=<表达式> to <表达式> do <语句>。 Pascal中的for语句用于循环执行一系列语句,通过控制一个变量在指定范围内递增或递减。扩充语句中包含以下几个部分: 1. 变量(Variable):指定一个变量用于控制循环的次数或迭代值。 2. 表达式(Expression):包含两个表达式,用于指定循环的起始值和结束值。 3. to关键字:用于指定循环变量递增的方向,即从起始值逐步增加到结束值。 4. do关键字:指定循环体中需要执行的语句。 例如,如果我们想输出1到10之间的所有数字,我们可以使用以下扩充语句: for i:= 1 to 10 do begin writeln(i); end; 在这个例子中,我们定义了一个变量i用于控制循环的次数。起始值为1,结束值为10。我们使用to关键字指定变量递增的方向(从1到10)并使用do关键字指定在每次迭代中需要执行的语句。在循环体中,我们调用writeln函数输出当前变量i的值。 通过这个扩充语句,我们可以轻松地控制循环的次数和行为,并根据需要执行相应的语句。这大大提高了程序的灵活性和可读性。 ### 回答2: 扩充语句是Pascal编程语言中的一种循环语句,用于重复执行一段代码块。它的语法是:for <变量>:=<表达式> to <表达式> do <语句>。 其中,<变量>表示循环控制变量,可以是任何有效的标识符。这个变量在循环过程中会不断地被赋予不同的值。 <表达式>是一个数值表达式,用于指定循环控制变量的初值和终值。它可以是整型常量、整型变量、算术表达式或函数调用的结果。 to关键字表示循环控制变量的递增方向。当递增方向为正时,循环控制变量从初值逐步增加到终值;当递增方向为负时,循环控制变量从初值逐步减小到终值。 <语句>是一段需要重复执行的代码块。它可以包括一条或多条语句,用begin和end关键字将其包围起来。 在循环的每次迭代中,循环控制变量的值会根据递增方向进行相应的更新。如果循环控制变量的值仍然在有效范围内(即满足递增方向和终值的要求),则会继续执行循环内的代码块。否则,循环会结束,程序将继续执行循环后的代码。 扩充语句的使用可以方便地实现计数器控制的循环,从而简化程序的编写。 ### 回答3: 扩充语句(pascal的for语句):for <变量>:=<表达式> to <表达式> do <语句>。 扩充语句是Pascal编程语言中用于循环执行一段指定次数的代码的结构。其中,<变量>是一个已定义的变量,<表达式>是一个可以计算得到一个数值的表达式,<语句>是需要循环执行的代码块。 for语句的执行流程如下: 1. 开始执行for语句时,首先计算第一个<表达式>的值,并将其赋给<变量>。 2. 判断<变量>是否小于或等于第二个<表达式>的值,如果满足条件,则进入循环体,执行<语句>。 3. 执行完<语句>后,将<变量>的值增加1。 4. 再次判断<变量>是否小于或等于第二个<表达式>的值,如果满足条件,则再次执行<语句>,并重复步骤3。 5. 如果<变量>大于第二个<表达式>的值,则终止循环,程序执行流程继续向下。 通过for语句,可以方便地对一段代码进行重复执行,循环次数由<表达式>的值决定。在循环体内,可以使用<变量>的值来实现不同的逻辑处理和操作。 需要注意的是,<表达式>的计算结果必须是可以比较的整数类型(如整数或字符型)以及递增或递减的顺序。同时,<变量>的初始值必须小于等于第二个<表达式>的值,否则循环体将不会被执行。 总而言之,“for <变量>:=<表达式> to <表达式> do <语句>”是Pascal编程语言中用于控制循环执行次数的一种语句结构,它可以帮助我们实现代码的自动化重复执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值