PL0编译程序实例资料
(精选)PL0编译程序设计说明书

PL/0编译程序设计说明书小组组长:李文(00000000)小组成员:******(00000000)******(00000000)******(00000000)******(00000000)2006年1月16日1引言 (3)1.1编写目的 (3)1.2背景 (3)1.3定义 (3)1.4参考资料 (5)2总体设计 (5)2.1需求规定 (5)2.2运行环境 (6)2.3模块流程 (6)2.4模块机理说明 (7)2.5模块设计与实现 (10)2.6人工处理过程 (12)2.7程序的亮点 (13)2.8尚未问决的问题 (13)3程序介绍和使用说明 (13)4程序测试结果分析 (16)概要设计说明书1引言1.1编写目的此文档为VK 1.0版PL/0编译器详细设计说明书,旨在说明该编译器的设计思想和实现。
此说明书可以在阅读本编译器代码时有效地帮助您理解本编译器的设计方法和实现过程,希望能提供给您所需的帮助。
1.2背景名称:VK1.0版PL/0编译器说明:此编译器为北京师范大学信息科学学院计算机科学与技术系2003级2005-2006学年度第一学期编译原理课程实验作业。
本软件由李文小组合作开发,组长李文,同组人员有吕叶、刘晟忻、肖纯、曲文星。
本软件主要用于PL/0程序的编译,软件提供生成中间代码,并执行检测。
本软件为开源软件,故除了用于编译以外还可给编译器开发者提供开发参考。
本软件开发运行在Windows 32位平台上,尚未开发其他平台版本。
1.3定义本软件开发中,用到了一些PL/0语言和PCODE的定义以及编译原理术语,下面给予说明。
●PL/0语言:➢BNF范式:〈程序〉∷=〈分程序〉.〈分程序〉∷=[〈常量说明部分〉][〈变量说明部分〉][〈过程说明部分〉]〈语句〉〈常量说明部分〉∷=CONST〈常量定义〉{,〈常量定义〉};〈常量定义〉∷=〈标识符〉=〈无符号整数〉〈无符号整数〉∷=〈数字〉{〈数字〉}〈变量说明部分〉∷=V AR〈标识符〉{,〈标识符〉};〈标识符〉∷=〈字母〉{〈字母〉|〈数字〉}〈过程说明部分〉∷=〈过程首部〉〈分程序〉{;〈过程说明部分〉};〈过程首部〉∷=PROCEDURE〈标识符〉;〈语句〉∷=〈赋值语句〉|〈条件语句〉|〈当型循环语句〉|〈过程调用语句〉|〈读语句〉|〈写语句〉|〈复合语句〉|〈空〉;〈赋值语句〉∷=〈标识符〉∶=〈表达式〉〈复合语句〉∷=BEGIN〈语句〉{;〈语句〉}END〈条件〉∷=〈表达式〉〈关系运算符〉〈表达式〉|ODD〈表达式〉〈表达式〉∷=[+|-]〈项〉{〈加法运算符〉〈项〉}〈项〉∷=〈因子〉{〈乘法运算符〉〈因子〉}〈因子〉∷=〈标识符〉|〈无符号整数〉|'('〈表达式〉')'〈加法运算符〉∷=+|-〈乘法运算符〉∷=*|/〈关系运算符〉∷=#|=|<|<=|>|>=〈条件语句〉∷=IF〈条件〉THEN〈语句〉〈过程调用语句〉∷=CALL〈标识符〉〈当型循环语句〉∷=WHILE〈条件〉DO〈语句〉〈读语句〉∷=READ'('〈标识符〉{,〈标识符〉}')'〈写语句〉∷=WRITE'('〈表达式〉{,〈表达式〉}')'〈字母〉∷=a|b|…|X|Y|Z〈数字〉∷=0|1|2|…|8|9➢PL/0语言允许过程嵌套定义,函数及变量作用于本层。
PL0编译程序源程序

procedure constdeclaration; (*常量定义的处理*) begin if sym = ident then begin getsym; if sym in [eql,becomes] then begin if sym = becomes then error(1); getsym; if sym = number then begin enter(constant); getsym; end else error(2) end else error(3) end else error(4); end; (*constdeclaration 结束*)
until kk = k; id:= a; i:= 1; (*二分法查保留字表*) j:= norw; repeat k:= (i+j) div 2; if id <= word[k] then j:= k-1; if id >= word[k] then i:= k+1 until i>j; if i-1 > j then sym:= wsym[k] else sym:= ident; end else if ch in ['0'..'9'] then begin (*number*) k:= 0; num:= 0; sym:= number; repeat num:= 10 * num+(ord(ch)-ord('0')); k:= k+1; getch until not (ch in ['0'..'9']); if k > nmax then error(30); end else if ch = ':' then begin getch; if ch = '=' then begin sym:= becomes; getch; end else sym:= nul; end else (*<=*)
PL/0编译器的实现文档

第二章PL/0编译程序的实现【课前思考】复习第1章介绍的一个高级程序设计语言编译程序的功能和实现的步骤。
编译程序就是一个语言的翻译程序,通常是把一种高级程序设计语言(称源语言)书写的程序翻译成另一种等价功能语言(称目标语言)的程序。
换句话说,编译是指把一种用源语言表示的算法转换到另一种等价的用目标语言表示的算法。
编译程序实现的必要步骤有词法、语法、语义分析和代码生成。
此外必需有符号表管理程序和出错处理程序。
本章介绍的PL/0编译程序的实现是用PASCAL语言书写的【学习目标】本章目的:以PL/0语言编译程序为实例,学习编译程序实现的基本步骤和相关技术,对编译程序的构造和实现得到一些感性认识和建立起整体概念,为后面的原理学习打下基础。
◇了解并掌握用语法图和扩充的巴科斯-瑙尔范式(EBNF)对PL/0语言的形式描述。
◇了解并掌握PL/0语言编译程序构造和实现的基本技术和步骤。
◇了解并掌握PL/0语言编译程序的目标程序在运行时数据空间的组织管理。
【学习指南】◇要求读者阅读PL/0语言编译程序文本,了解一个编译程序构造的必要步骤和实现技术。
一个编译程序的实现比较复杂,读懂一个典型的程序从设计思想到实现技术也有一定难度,特别是入门开始需要耐心。
一但读懂,不仅了解编译程序的实现方法和技术,还可学到许多编程技巧和好的编程风格。
◇阅读PL/0语言编译程序文本时,应从整体结构开始逐步细化,弄清楚每个过程的功能和实现方法及过程之间的相互关系。
◇建议用一个PL/0源程序的例子为导引作为阅读PL/0语言编译程序文本的入门,然后再逐步全面读懂。
◇通过对PL/0语言编译程序某些指定功能的扩充,加深对编译程序构造步骤和实现技术的理解,并能在实践中应用。
【难重点】重点:◇弄清源语言(PL/0)、目标语言(类pcode)与实现语言(C)这3个语言之间的关系和作用。
◇掌握用语法图和扩充的巴科斯-瑙尔范式(EBNF)对一个高级程序设计语言的形式描述。
编译原理实验报告-简单 PL0编译程序及其扩展

一、题目:简单PL0编译程序及其扩展表示多行表达式的<表达式序列>文法如下:<表达式序列>-> <表达式> ↙<表达式序列> |<表达式>↙↙<表达式> -> [<变量>=] [+|-]<项>{(+|-)<项>}<项> -> <因子>{(* | /)<因子>}<因子> -> <无符号实数>|<变量>|<标准函数>‘(’<表达式>‘)’|‘(’ <表达式>‘)’<标准函数> -> sin | cos | tan | exp其中的变量无需定义且其作用域为第一次赋值处至最后。
递归下降方式设计其编译程序,生成PL/0栈式指令代码,然后解释执行。
二、编译技术,主要数据结构及算法Class:MyPL0int getch();void error(int n);int gen(string function,int lev,string a);int factor();int term();int expression();void listcode();void interpret();void GetFile();void start();void Check(int i);void run(string str);Class:Code主要数据结构:数组,栈,链表三、测试本程序的测试源程序在test.txt中:a=1+2*3-4/(2*3) //检测是否实现基本文法b=sin2+cos6+tan10 //检测是否扩展标准函数(本组没能实现exp)c=9*(3+ //检测出错纠察—缺少右括号d=x+3 //检测变量无定义e=48*+33 //检测表达式非法用于测试的源代码用户也可以自己定义四、遗留问题及思考没有解决exp的识别和计算,有待考究追加通过对书后标准程序的改造和学习,本小组加深了PL0编译程序的执行过程,了解到栈式目标代码的具体生成过程,。
PL0编译程序原理实验报告

编译原理实验报告——理解PL/0编译程序原理实验4.1 理解PL/0编译程序原理一、实验目的1.学习使用教学辅助软件THPL0CAI2.掌握PL/0源程序的编译和解释过程二、实验平台Windows + THPL0CAI三、实验内容1.运行THPL0CAI 程序(1)选择0 - Static Link 方式进入;(2)选择Open/Create a source file 打开一个PL/0源程序,如Test2.pl0:const a=10;var b,c;procedure p;var k;beginc:=b+10;end;beginread(b);while b#0 dobegincall p;write(2*c);read(b)endend.2.按F9键开始单步编译Test2.pl0 程序(1)观察符号表的构造过程Table.dat 窗口;(2)观察目标代码的构造过程Code.dat 窗口。
3.按F9键开始单步执行编译Test2.pl0 生成的代码(1)观察运行栈的变化过程Stack.dat 窗口;(2)观察数据的输入输出Result.dat 窗口。
四、实验分析1.PL/0编译程序结构(a)PL/0编译程序的结构图(b)PL/0的解释执行结构PL/0语言是PASCAL语言的子集 ----指令功能表2.给出编译过程中符号表的建立过程Code.dat:符号表table.dat如图所示:符号表建立过程:(1)运行主程序,“main”存入符号表,类型为procedure,地址:8,大小:6;(2)常量a存入符号表,值为10;(3)存入b,c,类型为variable,地址分别为3,4;(4)执行p程序,存入p,类型为procedure,地址为1;(5)存入k,类型为variable,地址为3;被引用变量或过程所在层次为1;3.给出运行过程中运行栈的变化过程,只给出部分说明即可程序开始(1)输入b=5,将变量b的取值取至栈顶。
PL0语言编译程序分析 .txt

PL/0语言编译程序分析PL/0语言是Pascal语言的一个子集,我们这里分析的PL/0的编译程序包括了对PL/0语言源程序进行分析处理、编译生成类PCODE代码,并在虚拟机上解释运行生成的类PCODE代码的功能。
PL/0语言编译程序采用以语法分析为核心、一遍扫描的编译方法。
词法分析和代码生成作为独立的子程序供语法分析程序调用。
语法分析的同时,提供了出错报告和出错恢复的功能。
在源程序没有错误编译通过的情况下,调用类PCODE解释程序解释执行生成的类PCODE代码。
词法分析子程序分析:词法分析子程序名为getsym,功能是从源程序中读出一个单词符号(token),把它的信息放入全局变量sym、id和num中,语法分析器需要单词时,直接从这三个变量中获得。
(注意!语法分析器每次用完这三个变量的值就立即调用getsym子程序获取新的单词供下一次使用。
而不是在需要新单词时才调用getsym过程。
)getsym过程通过反复调用getch子过程从源程序过获取字符,并把它们拼成单词。
getch过程中使用了行缓冲区技术以提高程序运行效率。
词法分析器的分析过程:调用getsym时,它通过getch过程从源程序中获得一个字符。
如果这个字符是字母,则继续获取字符或数字,最终可以拼成一个单词,查保留字表,如果查到为保留字,则把sym变量赋成相应的保留字类型值;如果没有查到,则这个单词应是一个用户自定义的标识符(可能是变量名、常量名或是过程的名字),把sym置为ident,把这个单词存入id变量。
查保留字表时使用了二分法查找以提高效率。
如果getch获得的字符是数字,则继续用getch获取数字,并把它们拼成一个整数,然后把sym置为number,并把拼成的数值放入num变量。
如果识别出其它合法的符号(比如:赋值号、大于号、小于等于号等),则把sym则成相应的类型。
如果遇到不合法的字符,把sym置成nul。
语法分析子程序分析:语法分析子程序采用了自顶向下的递归子程序法,语法分析同时也根据程序的语意生成相应的代码,并提供了出错处理的机制。
编译原理实践4——程序设计语言PL0

2.EBNF定义的PL/0语法
program = block ".".
A program is a block.
block = [ "const" ident "=" number { "," ident "=" number } ";" ] [ "var" ident { "," ident } ";" ] { "procedure" ident ";" block ";" } statement.
3. PL/0语法图
block—分程序 statement—语句 condition---条件 expression---表达式 term---项 factor---因子
4.判别是否符合两条限制规则
方法: 1)找出图中每一个分支点,考察每一个分 支点的各个分支的头符号是否相异 2)找出图中每一个透明结构,考察每个透 明结构,考察每个透明结构的头符号集 合与其跟随符号集合是否相异 结论:PL/0语言文法符合两条限制规则, 可以应用简单辨认算法的LL(1)文法。
保留字: begin, call, const, do, end, if, odd, procedure, then, var, while 符号: . , ; := + - * / ( ) 标识符:以字母开头的,任意字母和数字组成 的序列 数:阿拉伯数字的序列 关系运算符: < > <= >= # =
var a, b; begin a:=10; if a < 12 then b := a/2; end.
PL0编译程序的实现-教案

PL/0编译程序的工作过程
• 采用一趟扫描方式 • 以语法分析程序为核心 词法分析程序和代码生成程序都作为一个独立的 过程,当语法分析需要读单词时就调用词法分析 程序,而当语法分析正确需要生成相应的目标代 码时,则调用代码生成程序。 • 用表格管理程序建立变量,常量和过程标识符的 说明与引用之间的信息联系。 • 用出错处理程序对词法和语法分析遇到的错误给 出在源程序中出错的位置和错误性质。
• 生成宿主机上可执行的PL/0编译程序
– 应用宿主机上的PASCAL语言系统 – 将 PL0.PAS 转换成 PL0.exe
• 目标机上可执行的PL/0编译程序:
PL0.exe
4
PL/0语言程序的编译、运行
PL/0语言程序的编译
PL/0编译:Pl0.exe PL/0源程序
假想机器语言程序
假想机器语言程序的解释执行
26
0 jmp 0 8 1 jmp 0 2 2 int 0 3 3 lod 1 3 4 lit 0 10 5 opr 0 2 6 sto 1 4 7 opr 0 0 8 int 0 5 9 opr 0 16 10 sto 0 3 11 cal 0 2 12 lod 0 4 13 opr 0 14 14 opr 0 15 15 opr 0 0
址
7
PL/0目标机指令系统
PL/0假想机器指令系统
– 共有8大值” a PL/0目标语言程序的“执行”实现原理 功能码 f 层次差 l
PL/0解释模块将目标语言转换为等价的PASCAL语句。 PL/0解释模块执行时,将目标语言指令解释成PASCAL
次栈顶与栈顶相加
Const a=10; var b,c; procedure p; begin c:=b+a; end; begin read(b); call p; write(c); end.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
‘{ }’ 表示花括号内的语法成分可以重复;在不加上 下界时可重复0到任意次数,有上下界时为可重复次 数的限制
‘[ ]’ 表示方括号内的成分为任选项 ‘( )’ 表示圆括号内的成分优先
PL/0 语言的语法描述图
程序 分程序
const , ; var , ; ; procedure ident ; ident
《编译原理》
例:程序和分程序语法单位的语法描述图
分程序
ident
=
.
number
分程序
语句
PL/0 语言的EBNF表示
EBNF 的元符号
《编译原理》
‘< >’ 是用左右尖括号括起来的中文字表示语法构
实验题目
题目二:预测分析法的实现(3周+1周)
《编译原理》
按预测分析法(即LL(1)分析法)构造语法分析器,并对输入串进行 预测分析
要求及步骤 (1)输入任一给定文法; (2)消除左公共因子和左递归; (3)构造该文法非终结符的FIRST集和FOLLOW集; (4)判断该文法是否为LL(1)文法; (5)若是LL(1)文法,构造该文法的预测分析表; (6)按预测分析法,构造该文法的语法分析器; (7)若是LL(1)文法,输入任一符号串,给出输入串的分析过程和结 果。
PL/0 语言的EBNF表示
例:PL/0 语言的EBNF表示片断
<程序> ::= <分程序>. <分程序> ::= [<常量说明部分>] [<变量说明部分>] [<过程说明部分>] <语句>
《编译原理》
<常量说明部分> ::= CONST <常量定义> { ,<常量定义> } ;
<常量定义> ::= <标识符> = <无符号整数>
PL/0 语言的EBNF表示
PL/0 语言的语义规则
PL/0 程序示例
《编译原理》
CONST A=10; /*主程序常量说明部分*/ VAR B,C; /*主程序变量说明部分*/ PROCEDURE P; /*主程序过程说明部分*/ VAR D; /*过程P的局部变量说明部分*/ PROCEDURE Q; /*过程P的局部过程说明部分*/ VAR X; /*过程Q的局部变量说明部分*/ BEGIN READ(X); D:=X; Q 的过程体 WHILE X#0 DO CALL P; END; BEGIN WRITE(D); P 的过程体 CALL Q; END BEGIN 主程序的过程体 CALL P; END.
PL/0 语言的语法描述图
每个语法单位对应一个语法描述图
《编译原理》
一个入口和一个出口的有向图
从入口可到达任何节点 每个节点都可以到达出口 从入口到出口的路径表示该语法单位的 一种合法中间形式(短语)
有两种类型的节点
内的文字表示所用到的其他语法单位 或 内的文字表示单词符号
实验报告形式
?级-?班-?组-?题.rar: 成员(学号-姓名): 一、题目 二、分析与设计 三、测试设计 四、问题解答 五、各自的贡献 六、心得 ……
《编译原理》
第二章
PL/0 编译程序
《编译原理》
PL/0编译程序
PL/0 编译程序总体结构
PL/0 语言简介
《编译原理》
<无符号整数> ::= <数字> {<数字>} <变量说明部分> ::= VAR <标识符 > { , <标识符 > } ;
<标识符> ::= <字母> {<字母>|<数字>}
<过程说明部分> ::= <过程首部><分程序>{; <过程说明部分> }; <过程首部> ::= PROCEDURE <标识符> ; ……
《编译原理》
PL/0编译程序的组织:一个以语法、语义 分析程序为中心的单遍编译程序
语法、语义 分析程序 类P-code 程序
PL/0 程序
词法分 析程序
代码生 成程序
PL/0 语言简介
《编译原理》
PL/0 语言为一种简化的类Pascal 语言Fra bibliotekPL/0 程序示例
PL/0 语言的语法描述图
PL/0 语言的语义规则
类型、上下文约束与作用域规则
考察规范
《编译原理》
实验共两个题目,占本课程总成绩的15%,其中第一个占8%,第二个 占7%。 各题给分标准: (1)有完善的设计和实现文档,程序可读性好,在要求时间内完成 并提交实验报告,满分; (2)实现正确,程序可读性好,在要求时间内完成,但设计文档和 实验报告存在明显不足,按2/3左右计分; (3)实现正确,程序可读性差,在要求时间内完成,但设计文档和 实验报告存在严重不足,按1/3左右计分; (4)不能完成(包括未接受作业检查的、有抄袭行为的、不能提供 源程序的、无实验报告的),计0分。
实验题目
题目一:多行表达式的计算(4周+1周)
有表示多行表达式的<表达式序列>文法如下:
《编译原理》
<表达式序列>-> <表达式> ↙<表达式序列> |<表达式>↙↙ <表达式> -> [<变量>=] [+|-]<项>{(+|-)<项>} <项> -> <因子>{(* | /)<因子>} <因子> -> <无符号数>|<变量>|‘(’ <表达式>‘)’ <无符号数> -> <无符号整数> | <无符号实数> |<变量> <变量> -> <整型变量> | <实型变量> <整型变量> -> i <字母数字串> <实型变量> -> f <字母数字串> 其中的变量无需定义且其作用域为第一次赋值处至最后,整型量占2 个字节,浮点型量占4个字节。假设数据类型转换规则与C语言相一致。 按递归下降分析法设计并实现该文法定义的语言的编译程序。
类 P-code 虚拟机 PL/0 编译程序的词法分析
PL/0 编译程序的语法分析 PL/0 编译程序的语义分析
PL/0 编译程序的错误处理
PL/0 编译程序的目标代码生成
PL/0编译程序总体结构
T-型图
《编译原理》
PL/0
类P-code
C/Pascal
PL/0编译程序总体结构