第二章PL0编译程序课件_第1页
第二章PL0编译程序课件_第2页
第二章PL0编译程序课件_第3页
第二章PL0编译程序课件_第4页
第二章PL0编译程序课件_第5页
已阅读5页,还剩26页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第2章PL/0编译程序PL/0语言和类pcode的描述PL/0编译程序的结构PL/0编译程序的语法语义分析

PL/0编译程序的错误处理2.1PL/0语言和类pcode的描述

PL/0编译程序

PL/0语言程序

类pcode代码源语言(PL/0)目标语言(类pcode)实现语言(pascal)PL/0

类pcodepascal

PL/0编译程序类pcode解释程序类pcode代码PL/0源程序输入输出PL/0编译系统的结构框架2.1.1PL/0语言PL/0程序示例PL/0的语法描述图PL/0语言文法的EBNF表示

PL/0程序示例CONSTA=10;(*常量说明部分*)

VARB,C;(*变量说明部分*)PROCEDUREP;(*过程说明部分*)VARD;

PROCEDUREQ;

VARX;

BEGIN

READ(X);D:=X;WHILEX#0DOCALLP;

END;

BEGIN

WRITE(D);

CALLQ;

END;

BEGIN

CALLP;

END.Q的过程体p的过程体主程序体程序分程序.内的文字表示非终结符或内的文字或符号表示终结符PL/0的语法描述图PL/0的语法描述图varprocedure分程序语句分程序const标识符标识符标识符numberPL/0的语法描述图end表达式:=begin语句语句)(,read标识符标识符语句PL/0语言文法的EBNF表示

EBNF

引入的符号(元符号):

<>用左右尖括号括起来的语法成分为非终结符

∷=(→)‘定义为’∷=(→)的左部由右部定义|‘或’

{}表示花括号内的语法成分可重复任意次或限定次数

[]表示方括号内的语法成分为任选项

()表示圆括号内的成分优先例:用EBNF描述<整数>的定义:

<整数>∷=[+|-]<数字>{<数字>}

<数字>∷=0|1|2|3|4|5|6|7|8|9或更好的写法

<整数>∷=[+|-]<非零数字>{<数字>}|0

<非零数字>∷=1|2|3|4|5|6|7|8|9

<数字>∷=0|<非零数字>PL/0语言文法的EBNF表示

2.1.2目标代码类pcode目标代码类pcode是一种假想栈式计算机的汇编语言。指令格式:flaf 功能码l 层次差(标识符引用层减去定义层)a 根据不同的指令有所区别类pcode指令功能表

consta=10;

varb,c;

procedurep;

begin

c:=b+a;

end;

begin

read(b);

whileb≠0do

begin

callp;

write(2*c);

read(b);

end

end.

(0)jmp08转向主程序入口(1)jmp02转向过程p入口(2)

int03过程p入口,为过程p开辟空间(3)lod13取变量b的值到栈顶(4)lit010取常数10到栈顶(5)opr02次栈顶与栈顶相加(6)sto14栈顶值送变量c中(7)opr00退栈并返回调用点(16)(8)

int05主程序入口开辟5个栈空间(9)opr016从命令行读入值置于栈顶(10)sto03将栈顶值存入变量b中(11)lod03将变量b的值取至栈顶(12)lit00将常数值0进栈(13)opr09次栈顶与栈顶是否不等(14)jpc024等时转(24)(条件不满足转)(15)cal02

调用过程p(16)lit02常数值2进栈(17)lod04将变量c的值取至栈顶(18)opr04次栈顶与栈顶相乘(2*c)(19)opr014栈顶值输出至屏幕(20)opr015换行(21)opr016从命令行读取值到栈顶(22)sto03栈顶值送变量b中(23)jmp011无条件转到循环入口(11)(24)opr00结束退栈

2.2PL/0编译程序的结构词法分析程序语法语义分析程序代码生成程序表格管理程序出错处理程序PL/0源程序目标程序2.2.1PL/0编译程序的总体设计其编译过程采用一趟扫描方式以语法、语义分析程序为核心

词法分析程序和代码生成程序都作为一个过程,当语法分析需要读单词时就调用词法分析程序,而当语法、语义分析正确,需要生成相应的目标代码时,则调用代码生成程序。表格管理程序实现变量,常量和过程标识符的信息的登录与查找。出错处理程序,对词法和语法、语义分析遇到的错误给出在源程序中出错的位置和与错误性质有关的编号,并进行错误恢复。编译程序总体流程图2.2.2词法分析的设计与实现识别的单词:保留字或关键字:如:BEGIN、END、IF、THEN等运算符:如:+、-、*、/、:=、#、>=、<=等标识符:用户定义的变量名、常数名、过程名常数:如:10、25、100等整数界符:如:‘,’、‘.’、‘;’、‘(’、‘)’等词法分析过程GETSYM所要完成的任务:读源程序(getch)滤空格识别保留字识别标识符拼数识别单字符单词拼双字符单词词法分析过程(GETSYM)当识别到标识符时先查保留字表保留字表:word[1]:=‘begin‘;word[2]:=‘call‘;...word[13]:=‘write‘;查到时找到相应的内部表示wsym[1]=beginsym;wsym[2]=callsym;…wsym[13]=writesym;词法分析程序GETSYM字符对应的单词表:ssym[‘+’]=plus;ssym[‘-’]=minus;ssym[‘:=’]=becomes…ssym[‘;’]=semicolon;词法分析如何把单词传递给语法分析typesymbol=(nul,ident,number,plus,…);3个全程量

SYM:symbol;IDNUM:integer;词法分析程序GETSYM 通过三个全程量

SYM、ID和NUM将识别出的单词信息传递给语法分析程序。SYM:存放单词的类别如:有程序段落为:begininitial:=60;end对应单词翻译后变为:beginbeginsym,initialident,‘:=‘becomes,60number,‘;’semicolon,endendsym。ID:存放用户所定义的标识符的名字如:initial(在SYM中放ident,在ID中放initial)NUM:存放用户定义的数 如:initial在NUM中放60)词法分析程序GETSYM词法分析程序的设计---使用状态转换图实现表示状态,对应每个状态编一段程序,每个状态调用取字符程序,根据当前字符转到不同的状态,并做相应操作。表示终态,已识别出一个单词。标识符数字:=<=<>=>2.2.3PL/0编译程序语法语义分析的设计

PL/0编译程序语法、语义分析的的核心程序是BLOCK过程说明部分的分析与处理语法分析语义分析1、说明部分的分析与处理对每个过程(含主程序)说明的对象(变量,常量和过程)造符号表,在符号表中登录标识符的属性。

标识符的属性:种类,所在层次,值和分配的相对位置。

登录信息由ENTER过程完成。

例:程序说明部分为:CONSTA=35,B=49;

VARC,D,E;

PROCEDUREP;

VARG;…符号表名字种类层次/值地址存储空间对应名字表VARA;BEGINREAD(A)END.<程序>为文法的开始符号,以开始符号作为根结点构造一棵倒挂着的语法树。AA程序分程序变量说明部分语句.VAR标识符;复合语句BEGIN语句END读语句READ(标识符)2、PL/0编译程序语法分析3、PL/0编译程序语义分析语义分析:当遇到标识符的引用时就调用POSITION函数查符号表,看是否有过正确定义,若已有,则从表中取相应的有关信息,供代码的生成使用。若无定义则调用出错处理程序。当语法语义正确时,就生成相应语句功能的目标代码2.2.4目标代码生成代码生成是由过程GEN完成。GEN有3个参数,分别代表目标代码的功能码,层差和位移量。例如gen(opr,0,16);gen(sto,lev-level,adr)

lev:当前处理的过程层次

level:被引用变量或过程所在层次经常不断地学习,你就什么都知道。你知道

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论