编译原理PL0课程设计报告

合集下载

编译原理课程设计报告---PL0编译程序改进及完善

编译原理课程设计报告---PL0编译程序改进及完善

燕山大学《编译原理课程设计》题目:《PL/0编译程序改进及完善》姓名:简越班级:06级计算机应用3班学号:060104010084日期:2009年7月15日设计题目:PL/0编译程序改进及完善。

设计目的:阅读研究,改进设计和调试一个简单的编译程序。

加深对编译理论和过程的了解。

设计要求:1.有选择的对PL/0编译源程序补充,完善.2.设计编译典型的运行实例,以便反应出自己作出改进后的编具有的功能。

设计思想:PL/0语言可以看成PASCAL语言的子集,它的编译程序是一个编译解释执行系统。

PL/0的目标程序为假想栈式计算机的汇编语言,与具体计算机无关。

PL/0的编译程序和目标程序的解释执行程序都是用PASCAL语言书写的,因此PL/0语言可在配备PASCAL语言的任何机器上实现。

其编译过程采用一趟扫描方式,以语法分析程序为核心,词法分析和代码生成程序都作为一个独立的过程,当语法分析需要读单词时就调用词法分析程序,而当语法分析正确需要生成相应的目标代码时,则调用代码生成程序。

用表格管理程序建立变量、常量和过程表示符的说明与引用之间的信息联系。

当源程序编译正确时,PL/0编译程序自动调用解释执行程序,对目标代码进行解释执行,并按用户程序的要求输入数据和输出运行结果。

主要变量说明:/*变量说明*/FILE* fas; /*输出名字表*/FILE* fa; /*输出虚拟机代码*/FILE* fa1; /*输出源文件及其各行对应的首地址*/FILE* fa2; /*输出结果*/bool listswitch; /*显示虚拟机代码与否*/bool tableswitch; /*显示名字表与否*/char ch; /*获取字符的缓冲区,getch使用*/enum symbol sym; /*当前的符号*/char id[al+1]; /*当前ident,多出的一个字节用于存放0*/ int num; /*当前number*/int cc,ll; /*getch使用的计数器,cc表示当前字符(ch)的位置*/int cx; /*虚拟机代码指针,取值范围[0,cxmax-1]*/char line[81]; /*读取行缓冲区*/char a[al+1]; /*临时符号,多出的一个字节用于存放0*/ struct instruction code[cxmax]; /*存放虚拟机代码的数组*/char word[norw][al]; /*保留字*/enum symbol wsym[norw]; /*保留字对应的符号值*/enum symbol ssym[256]; /*单字符的符号值*/char mnemonic[fctnum][5]; /*虚拟机代码指令名称*/bool declbegsys[symnum]; /*表示声明开始的符号集合*/bool statbegsys[symnum]; /*表示语句开始的符号集合*/bool facbegsys[symnum]; /*表示因子开始的符号集合*//* 目标指令*/1、LIT:将常量值取到运行栈顶.2、LOD:将变量放到运行栈顶.3、STO:将栈顶的内容送入某变量单元中.4、CAL:调用过程的指令.5、INT:为被调用的过程(或主程序)在运行栈中开辟数据区.6、JMP:无条件转移指令.7、JPC:条件转移指令,当栈顶的布尔值为真时, 顺序执行,否则转向域的地址.8、OPR:系运算符和算术运算指令.将栈顶和次栈顶的内容进行运算,结果存放栈顶./*函数说明*/void error(int n,int line)说明:出错处理函数,打印出错信息,错误总数加1。

编译原理实验报告

编译原理实验报告

编译原理实验报告一、实验目的和要求本次实验旨在对PL_0语言进行功能扩充,添加新的语法特性,进一步提高编译器的功能和实用性。

具体要求如下:1.扩展PL_0语言的语法规则,添加新的语法特性;2.实现对新语法的词法分析和语法分析功能;3.对扩展语法规则进行语义分析,并生成中间代码;4.验证扩展功能的正确性。

二、实验内容1.扩展语法规则本次实验选择扩展PL_0语言的语句部分,添加新的控制语句,switch语句。

其语法规则如下:<switch_stmt> -> SWITCH <expression> CASE <case_list><default_stmt> ENDSWITCH<case_list> -> <case_stmt> , <case_stmt> <case_list><case_stmt> -> CASE <constant> : <statement><default_stmt> -> DEFAULT : <statement> ,ε2.词法分析和语法分析根据扩展的语法规则,需要对新的关键字和符号进行词法分析,识别出符号类型和记号类型。

然后进行语法分析,建立语法树。

3.语义分析在语义分析阶段,首先对switch语句的表达式进行求值,判断其类型是否为整型。

然后对case语句和default语句中的常量进行求值,判断是否与表达式的值相等。

最后将语句部分生成中间代码。

4.中间代码生成根据语法树和语义分析的结果,生成对应的中间代码。

例如,生成switch语句的跳转表,根据表达式的值选择相应的跳转目标。

5.验证功能的正确性设计一些测试用例,验证新语法的正确性和扩展功能的实用性。

三、实验步骤与结果1.扩展语法规则,更新PL_0语法分析器的词法规则和语法规则。

编译原理—pl0实验报告

编译原理—pl0实验报告

PL/0实验报告课程名称编译原理题目名称PL/0编译程序学生学院计算机科学与技术学院专业班级学号学生姓名班内序号山东理工大学实验报告纸第 1 页姓名:蔡鹏飞计算机院_11_级02班同组者成绩_________室温:气压:课程名称:编译原理教师签字实验项目编号(1)PL/0编译程序的分析指导教师鞠传香实验目的1.熟悉pl/0语言并能编写小程序2.掌握pl/0编译程序的编译过程(词法分析、语法分析、语义分析等)实验仪器(编号)材料、工具PC机、VC++6.0(原理概述)pl/0语言编译程序采用以语法分析为核心、一遍扫描的编译方法。

词法分析和代码生成作为独立的子程序供语法分析程序调用。

语法分析的同时,提供了出错报告和出错恢复的功能。

在源程序没有错误编译通过的情况下,调用类pcode解释程序解释执行生成的类pcode代码。

PL/0语言文法的EBNF表示EBNF表示的符号说明。

〈〉:用左右尖括号括起来的中文字表示语法构造成分,或称语法单位,为非终结符。

∷= :该符号的左部由右部定义,可读作'定义为'。

| :表示'或',为左部可由多个右部定义。

{ } :花括号表示其内的语法成分可以重复。

在不加上下界时可重复0到任意次数,有上下界时为可重复次数的限制。

如:{*}表示*重复任意次,{*}38表示*重复3-8次。

[ ] :方括号表示其内的成分为任选项。

( ) :表示圆括号内的成分优先。

例:用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表示PL/0语言文法的EBNF表示为:〈程序〉∷=〈分程序〉.〈分程序〉∷=[〈常量说明部分〉][〈变量说明部分〉][〈过程说明部分〉]〈语句〉〈常量说明部分〉∷=CONST〈常量定义〉{,〈常量定义〉};〈常量定义〉∷=〈标识符〉=〈无符号整数〉〈无符号整数〉∷=〈数字〉{〈数字〉}〈变量说明部分〉∷=VAR〈标识符〉{,〈标识符〉};〈标识符〉∷=〈字母〉{〈字母〉|〈数字〉}〈过程说明部分〉∷=〈过程首部〉〈分程序〉{;〈过程说明部分〉};〈过程首部〉∷=PROCEDURE〈标识符〉;〈语句〉∷=〈赋值语句〉|〈条件语句〉|〈当型循环语句〉|〈过程调用语句〉|〈读语句〉|〈写语句〉|〈复合语句〉|〈空〉〈赋值语句〉∷=〈标识符〉∶=〈表达式〉〈复合语句〉∷=BEGIN〈语句〉{;〈语句〉}END〈条件〉∷=〈表达式〉〈关系运算符〉〈表达式〉|ODD〈表达式〉〈表达式〉∷=[+|-]〈项〉{〈加法运算符〉〈项〉}〈项〉∷=〈因子〉{〈乘法运算符〉〈因子〉}〈因子〉∷=〈标识符〉|〈无符号整数〉|'('〈表达式〉')'〈加法运算符〉∷=+|-〈乘法运算符〉∷=*|/// 栈顶指针减一相关过程:base(),interpret()。

编译原理pL0实验报告

编译原理pL0实验报告

一.课程设计要求基本内容:(1)扩充赋值运算:*= 和/=(2)扩充语句(Pascal的FOR语句):①FOR <变量>:=<表达式> TO <表达式> DO <语句>②FOR <变量>:=<表达式> DOWNTO <表达式> DO <语句>其中,语句①的循环变量的步长为2,语句②的循环变量的步长为-2。

二.设计思路在课内实验的基础上,额外增加*=和/=运算符和关键字的语义动作,以下是设计思路:1. 扩充单词在头文件pl0.h中的enum symbol中增加关键字forsym, tosym, downtosym, timeseqlsym,slasheqlsym,并修改关键字数#define symnum 46。

/*初始化*/// ssym['*=']=timeseql;// ssym['/=']=slasheql;/*设置保留字名字,按照字母顺序,便于折半查找*/strcpy(&(word[14][0]),"to"); /*增加后需要按序排列*/strcpy(&(word[7][0]),"for");strcpy(&(word[4][0]),"downto");strcpy(&(word[3][0]),"do");/*设置保留字符号*/wsym[7]=forsym;wsym[14]=tosym;/*语法分析,获取一个符号*/在getsym()部分添加:else if(ch=='*'){ /** “*=” **/getchdo;if(ch=='='){sym=timeseql;getchdo;printf("check *= success!");}else sym=times;}else if(ch=='/'){ /* “/=” */getchdo;if(ch=='='){sym=slasheql;getchdo;printf("check /= success!");}else sym=slash;}/*其中printf部分均为识别成功后用作返回的信息而设*/2.扩充赋值运算符:*=和/=,关键字For①EBNF范式的书写:<变量>*=|/=<表达式><for 语句>::=for<变量>:=<表达式> to <表达式> do <语句><for 语句>::=for<变量>:=<表达式> downto <表达式> do <语句>②语法描述图:a.*=和/=:③ 递归下降子程序a.增加+=,/=;找到statement 部分的becomes 部分作为修改: /以下为连接become 语句后的修改部分*/ else if(sym==timeseql) {getsymdo;memcpy(nxtlev,fsys,sizeof(bool)* symnum);expressiondo(nxtlev,ptx,lev);gendo(lod,lev-table[i].level,table[i].adr); gendo(opr,0,4); gendo(sto,lev-table[i].level,table[i].adr); }else if(sym==slasheql){getsymdo;memcpy(nxtlev,fsys,sizeof(bool)* symnum); gendo(lod,lev-table[i].level,table[i].adr);expressiondo(nxtlev,ptx,lev);gendo(opr,0,5);gendo(sto,lev-table[i].level,table[i].adr);}语句 Ident:=/=*=表达式}}}b.增加for:找到statement部分的calsym部分后作为增加:/以下为连接callsym语句后的增加部分*/elseif(sym==forsym){getsymdo;if(sym==ident){i=position(id,*ptx);if(i==0){error(11);}else{if(table[i].kind!=variable){error(12);i=0;}else{getsymdo;if(sym==becomes){getsymdo;}else{error(13);}memcpy(nxtlev,fsys,sizeof(bool)* symnum);expressiondo(nxtlev,ptx,lev);if(i!=0){gendo(sto,lev-table[i].level,table[i].adr);}}}}if(sym==tosym){getsymdo;memcpy(nxtlev,fsys,sizeof(bool)*symnum);nxtlev[dosym]=true;/*后跟符号为do*/cx1=cx; /*保存判断条件超作的位置*/gendo(lod,lev-table[i].level,table[i].adr);expressiondo(nxtlev,ptx,lev);gendo(opr,0,13);cx2=cx; /*保存循环体的结束的下一个位置*/ gendo(jpc,0,0);/*生成条件跳转,但跳出循环的地址未知*/if(sym==dosym){getsymdo;}else{error(18); /*缺少do*/}statementdo(fsys,ptx,lev); /*循环体*/gendo(lod,lev-table[i].level,table[i].adr);gendo(lit,lev-table[i].level,2);gendo(opr,0,2);gendo(sto,lev-table[i].level,table[i].adr);gendo(jmp,0,cx1);/*回头重新判断条件*/code[cx2].a=cx; /*反填跳出循环的地址,与if类似*/}else{if(sym==downtosym) {getsymdo;memcpy(nxtlev,fsys,sizeof(bool)*symnum);nxtlev[dosym]=true;/*后跟符号为do*/cx1=cx; /*保存判断条件超作的位置*/gendo(lod,lev-table[i].level,table[i].adr);expressiondo(nxtlev,ptx,lev);gendo(opr,0,11);cx2=cx; /*保存循环体的结束的下一个位置*/gendo(jpc,0,0);/*生成条件跳转,但跳出循环的地址未知*/if(sym==dosym) {getsymdo;statementdo(fsys,ptx,lev); /*循环体*/}else{error(18); /*缺少do*/}gendo(lod,lev-table[i].level,table[i].adr);gendo(lit,lev-table[i].level,2);gendo(opr,0,3);gendo(sto,lev-table[i].level,table[i].adr);gendo(jmp,0,cx1);/*回头重新判断条件*/code[cx2].a=cx; /*反填跳出循环的地址,与if类似*/}c. 生成的pcode代码:1 int 0 82 lit 0 53 sto 0 34 lit 0 55 sto 0 46 lit 0 17 sto 0 78 lod 0 79 lit 0 1010 opr 0 1311 jpc 0 2112 lod 0 313 lit 0 114 opr 0 215 sto 0 316 lod 0 717 lit 0 218 opr 0 219 sto 0 720 jmp 0 821 lod 0 322 opr 0 1423 opr 0 1524 lit 0 1825 sto 0 726 lod 0 727 lit 0 128 opr 0 1129 jpc 0 3930 lod 0 431 lit 0 132 opr 0 233 sto 0 434 lod 0 735 lit 0 236 opr 0 337 sto 0 738 jmp 0 2639 lod 0 440 opr 0 1441 opr 0 1542 opr 0 0start pl03.测试用例的编写和运行结果:本次测试使用了三个测试用例,其中E02.PL0为检测是否能正确识别所增加的关键字和运算符,E04.PL0就是检测*=和/=是否能正确符合运算规则并求出得数,E05.PL0是for语句的检测。

编译原理课程设计报告PL0编译程序改良及完善

编译原理课程设计报告PL0编译程序改良及完善

燕山大学《编译原理课程设计》题目:《PL/0编译程序改良及完善》姓名:简越班级:06级运算机应用3班学号:060104010084日期:2020年7月15日设计题目:PL/0编译程序改良及完善。

设计目的:阅读研究,改良设计和调试一个简单的编译程序。

加深对编译理论和进程的了解。

设计要求:1.有选择的对PL/0编译源程序补充,完善.2.设计编译典型的运行实例,以便反映出自己作出改良后的编具有的功能。

设计思想:PL/0语言能够看成PASCAL语言的子集,它的编译程序是一个编译说明执行系统。

PL/0的目标程序为假想栈式运算机的汇编语言,与具体运算机无关。

PL/0的编译程序和目标程序的说明执行程序都是用PASCAL语言书写的,因此PL/0语言可在配备PASCAL语言的任何机械上实现。

其编译进程采纳一趟扫描方式,以语法分析程序为核心,词法分析和代码生成程序都作为一个独立的进程,当语法分析需要读单词时就挪用词法分析程序,而当语法分析正确需要生成相应的目标代码时,那么挪用代码生成程序。

用表格治理程序成立变量、常量和进程表示符的说明与引用之间的信息联系。

当源程序编译正确时,PL/0编译程序自动挪用说明执行程序,对目标代码进行说明执行,并按用户程序的要求输入数据和输出运行结果。

要紧变量说明:/*变量说明*/FILE* fas; /*输出名字表*/FILE* fa; /*输出虚拟机代码*/FILE* fa1; /*输出源文件及其各行对应的首地址*/FILE* fa2; /*输出结果*/bool listswitch; /*显示虚拟机代码与否*/bool tableswitch; /*显示名字表与否*/char ch; /*获取字符的缓冲区,getch利用*/enum symbol sym; /*当前的符号*/char id[al+1]; /*当前ident,多出的一个字节用于寄存0*/ int num; /*当前number*/int cc,ll; /*getch利用的计数器,cc表示当前字符(ch)的位置*/int cx; /*虚拟机代码指针,取值范围[0,cxmax-1]*/char line[81]; /*读取行缓冲区*/char a[al+1]; /*临时符号,多出的一个字节用于寄存0*/ struct instruction code[cxmax]; /*寄存虚拟机代码的数组*/char word[norw][al]; /*保留字*/enum symbol wsym[norw]; /*保留字对应的符号值*/enum symbol ssym[256]; /*单字符的符号值*/char mnemonic[fctnum][5]; /*虚拟机代码指令名称*/bool declbegsys[symnum]; /*表示声明开始的符号集合*/bool statbegsys[symnum]; /*表示语句开始的符号集合*/bool facbegsys[symnum]; /*表示因子开始的符号集合*//* 目标指令*/一、LIT:将常量值取到运行栈顶.二、LOD:将变量放到运行栈顶.3、STO:将栈顶的内容送入某变量单元中.4、CAL:挪用进程的指令.五、INT:为被挪用的进程(或主程序)在运行栈中开辟数据区.六、JMP:无条件转移指令.7、JPC:条件转移指令,当栈顶的布尔值为真时, 顺序执行,不然转向域的地址.八、OPR:系运算符和算术运算指令.将栈顶和次栈顶的内容进行运算,结果寄存栈顶./*函数说明*/void error(int n,int line)说明:犯错处置函数,打印犯错信息,错误总数加1。

PL0编译原理课程设计(3109006080何路生)

PL0编译原理课程设计(3109006080何路生)

课程设计课程名称___ 编译原理______ __ 题目名称__编译原理课程设计__ _ 学生学院__ 计算机学院_________ 专业班级_ 09级计科5班_ 学号3109006080学生姓名____ 何路生___________ 指导教师_______张巍____________2011 年12 月29日一.课程设计目的在分析理解一个教学型编译程序(如PL/0)的基础上,对其词法分析程序、语法分析程序和语义处理程序进行部分修改扩充。

达到进一步了解程序编译过程的基本原理和基本实现方法的目的。

二.课程设计要求课内实验:对PL/0作以下修改扩充:(1)增加单词:保留字ELSE,FOR,STEP,UNTIL,RETURN运算符+=,-=,++,--,∧,∨,┓(2)修改单词:不等号# 改为<>(3)增加条件语句的ELSE子句,要求:写出相关文法,语法图,语义规则。

课程设计:基本内容(成绩范围:“中”、“及格”或“不及格”)(1)扩充赋值运算:+= 和-=(2)扩充语句(Pascal的FOR语句):FOR <变量>:=<表达式> STEP <表达式>UNTIL <表达式> DO <语句> (3)增加运算:++ 和--。

选做内容(成绩评定范围扩大到:“优”和“良”)(1)增加类型:①字符类型;②实数类型。

(2)扩充函数:①有返回值和返回语句;②有参数函数。

(3)增加一维数组类型(可增加指令)。

(4)其他典型语言设施。

三.课程设计环境与工具(1)计算机及操作系统:PC机,Windows7(2)实现工具:C++Builder6(3)教学型编译程序:PL/0四.结构设计说明a)PL/0编译程序的结构图b)PL/0编译程序的过程或函数的功能表1、void Error(int n) :错误处理,打印出错位置和错误编码2、void GetCh():漏掉空格,读取一个字符3、void GetSym():词法分析,读取一个单词4、void GEN(FCT X, int Y, int Z):生成目标代码,并送入目标程序区5、void TEST(SYMSET S1, SYMSET S2, int N):测试当前单词符号是否合法6、void ENTER(OBJECTS K, int LEV, int &TX, int &DX):登录名字表7、int POSITION(ALFA ID, int TX):查找标识符在名字表中的位置8、void ConstDeclaration(int LEV,int &TX,int &DX):常量说明处理9、void VarDeclaration(int LEV,int &TX,int &DX):变量说明处理10、void CharDeclaration(int LEV,int &TX,int &DX):字符说明处理11、void RealDeclaration(int LEV,int &TX,int &DX):实数说明处理12、void ListCode(int CX0):列出目标代码清单13、void FACTOR(SYMSET FSYS, int LEV, int &TX) :因子处理14、void TERM(SYMSET FSYS, int LEV, int &TX) :项处理15、void EXPRESSION(SYMSET FSYS, int LEV, int &TX):表达式处理16、void CONDITION(SYMSET FSYS,int LEV,int &TX) :条件处理17、void STATEMENT(SYMSET FSYS,int LEV,int &TX) :语句部分处理18、void Block(int LEV, int TX, SYMSET FSYS) :分程序分析处理过程19、int BASE(int L,int B,int S[]):通过静态链求出数据区的基地址20、void Interpret() :对目标代码的解释执行程序21、void __fastcall TForm1::ButtonRunClick(TObject *Sender):进行编译,RUNc)PL/0编译程序的总体流程图d)词法分析词法分析是编译的第一个阶段,它的主要任务是从左向右逐个字符地对源程序进行扫描,产生一个个单词序列用于语法分析。

《编译原理》设计方案报告

《编译原理》设计方案报告

《编译原理》课程设计报告设计题目:pl0编译器设计一、PL0程序的文法及,指令及属性翻译简化c语言文法定义(LL(1)文法)C程序::=void main(){函数体}函数体::=变量定义部分语句列变量定义部分::=变量定义变量定义部分| ɛ变量定义::=int 变量表变量表::=标识符|标识符,变量表语句列::=语句语句列| ɛ语句::=条件语句| 循环语句| 读语句| 写语句| 复合语句| 表达式语句| 空语句条件语句::=if(表达式)语句循环语句::=while(表达式)语句读语句::=read(变量表);写语句::=write(表达式表);复合语句::={语句列};表达式语句::=表达式;空语句::=;表达式定义(算符优先文法)表达式::=变量=表达式| 变量+=表达式| 变量-=表达式| 变量*=表达式| 变量/=表达式| 变量%=表达式| 表达式1表达式1::=表达式1 || 表达式2 | 表达式2表达式2::=表达式2&&表达式3 | 表达式3表达式3::=表达式3==表达式4 | 表达式3!=表达式4 | 表达式3>=表达式4 | 表达式3>表达式4 | 表达式3<=表达式4 | 表达式3<表达式4 | 表达式4表达式4::=表达式4+表达式5 | 表达式4-表达式5 | 表达式5表达式5::=表达式5*表达式6 | 表达式5/表达式6 |表达式5/表达式6 |表达式6表达式6::=!表达式7表达式7::=(表达式) | 变量| 常量PL0文法定义《程序》::=《分程序》.《分程序》::=《常量定义》;《常后分程序》|《常后分程序》《常后分程序》::=《变量定义》;《变后分程序》|《变后分程序》《变后分程序》::=《过程定义》;《变后分程序》|《语句》《常量定义》::=const 《常量定义表》《常量定义表》::=id = number | id = number,《常量定义表》《变量定义》::= var 《变量表》《变量表》::=id | id,《变量表》《过程定义》::=procedure id ;《分程序》《语句》::=《赋值语句》|《条件语句》|《循环语句》|《读语句》|《写语名》|《复合语句》| 《过程调用语句》|ε《赋值语句》::=id := 《表达式》《读语句》::=read(《变量表》)《写语句》::=write(《表达式表》)《表达式表》::=《表达式》| 《表达式》,《表达式表》《条件语句》::=if 《条件表达式》then 《语句》《循环语句》::=while 《条件表达式》do 《语句》《复合语句》::=begin 《语句列》end《过程调用语句》::=call id《参量表》::=《有参表》|ε《有参表》::=《表达式》,《有参表》|《表达式》《表达式》::=+《表达式1》|-《表达式1》|《表达式1》《表达式1》::=《表达式1》+《表达式2》|《表达式1》-《表达式2》|《表达式2》《表达式2》::=《表达式2》*《表达式3》|《表达式2》/《表达式3》| 《表达式2》mod 《表达式3》|《表达式3》《表达式3》::=id | number | (《表达式》)《条件表达式》::=《条件表达式》or 《条件表达式1》|《条件表达式1》《条件表达式1》::=《条件表达式1》and 《条件表达式2》| 《条件表达式2》《条件表达式2》::=not 《条件表达式3》|《条件表达式3》《条件表达式3》::=(《条件表达式》)|《关系表达式》《关系表达式》::=《表达式》>《表达式》《关系表达式》::=《表达式》>=《表达式》《关系表达式》::=《表达式》<《表达式》《关系表达式》::=《表达式》<=《表达式》《关系表达式》::=《表达式》=《表达式》《关系表达式》::=《表达式》#《表达式》PL0栈式机指令指令格式:指令码(f) 所在层数差(l),操作数(a)PL0栈式机指令:LIT:将常数a取到栈顶LOD:将位于(当前层-l)层处的变量a取到栈顶STO:将栈顶处值存储到指定位置,l,a同上CALL 调用当前-l层处的过程aINT:为调用过程在栈中开辟数据区,a为单元个数JMP:无条件转移指令,a目标地址JPC:条件转移指令,栈顶值的布尔值为非真时转移到a处,否则执行下面语句OPR:关系运算或算术运算PL0属性翻译MCONST(const:常量定义开始), V AR(var:变量定义开始), PROCEDURE(procedure:过程定义开始),CALL(call:过程调用语句),BEGIN(begon:复合语句开始),END(end:复合语句结束),IF(if:条件语句开始),THEN(then:条件结束),WHILE(while:循环语句开始), DO(do:循环条件结束), READ(read:读语句),WRITE(write:输出语句), ODD(odd:判奇运算),//分隔符、运算符号DOT(点:.),COMMA(逗号:,), SEMICOLON(分号:;), LPAREN(左括号:(), RPAREN(右括号:)), ASSIGNOP(赋值::=), PLUSOP(加法运算符号:+), MINUSOP(减法运算符:-), MULTOP(乘法运算符:*), DIVOP(除法运算符:/),GT(大于:>),GE(大于等于:>=),LT(小于:<),LE(小于等于:<=),EQ(等于:=),NE(不等:#),ENDF(输入结束符),//分析过程中需要的非终结符号SERVERKEY(保留字), FACTOR(因子),ROP(关系运算), CONSTANT(常量部份定义), V ARIABLE(变量部份定义), IDENT(自定义标识符), NUMBER(常数)二、符号表的结构,组织,填写及查找1、符号表结构const char *pName; //符号名称int kind; //符号类别,由上面单词分类确定int val; //符号表中的位置值int level; //符号的层数int parent; //符号的作用域int size; //过程长度char strBuff[MAXLENSTR]; //符号堆2、符号表的组织符号表的组织方式有:线性表、散列表、树结构等,其必须维持源程序中的作用域信息。

编译原理实验报告(PL_0语言功能扩充)

编译原理实验报告(PL_0语言功能扩充)

《编译原理》课程实验报告题目PL/0编译程序的C语言扩充专业化学工程与工艺班级学号姓名任课教师华东理工大学信息学院一.实验题目PL/0编译程序的C语言扩充二.实验目的在分析理解PL/0编译程序的基础上,对其词法分析程序、语法分析程序和语义处理程序进行部分修改扩充。

三.实验内容在PL/0语言的基础上增加对整型一维数组的支持、扩充IF-THEN-ELSE条件语句、增加REPEAT 语句、支持带参数的过程和增加注释等,如下所示:(1)整型一维数组,数组的定义格式为:VAR<数组标识名>(<下界>:<上界>)其中上界和下界可以是整数或者常量标识名。

访问数组元素的时候,数组下表是整型的表达式,包括整数、常量或者变量和他们的组合。

(2)扩充条件语句,格式为:<条件语句> ::= EF<条件>THEN<语句> [ELSE<语句>](3)增加REPEAT语句,格式为:<复合语句> ::= REPEAT<语句>UNTL<条件>四.实验过程(1)PL/0编译程序的C语言源代码输入(2)运行PL/0编译程序的C语言源代码,调试运行PL/0编译程序(3)对PL/0编译程序进行功能扩充(4)PL/0编译程序功能扩充部分的分析与设计(5)对PL/0编译程序进行功能扩充,即编写代码(6)进行PL/0编译程序功能扩充部分的运行调试(7)完成实验报告总结五.PL/0编译程序的功能扩充程序说明(1)扩充赋值运算:+=,-=.此功能扩充只需在语句分析里面进行增加如下程序:if(SYM==BECOMES||SYM==PLUSBECOMES||SYM==MINUSBECOMES){if (SYM==BECOMES){GetSym();EXPRESSION(FSYS,LEV,TX);}elseif(SYM==PLUSBECOMES||SYM==MINUSBECOMES){GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);if(SYM==PLUSBECOMES){GetSym();FACTOR(FSYS,LEV,TX);GEN(OPR,0,2);}elseif(SYM==MINUSBECOMES){GetSym();FACTOR(FSYS,LEV,TX);GEN(OPR,0,3);}}if (i!=0)GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);}(2)扩充FOR TO和FOR DOWNTO语句,此功能的关键是如何判断条件是否成立,并如何进行程序跳转.在这里用到了几条指令,和地址回填技术.扩充程序如下:case FORSYM:GetSym();if(SYM!=IDENT)Error(31); //FOR后面要标识符i=POSITION(ID,TX);if (i==0) Error(11);elseif (TABLE[i].KIND!=VARIABLE) { /*ASSIGNMENT TO NON-VARIABLE*/Error(12); //变量}GetSym();if(SYM!=BECOMES)Error(13);GetSym();EXPRESSION(SymSetUnion(SymSetNew(TOSYM,DOWNTOSYM,DOSYM),FSYS),LEV,TX);//表达式if(SYM==DOWNTOSYM)CX1=CX;GetSym();GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);//保存结果至变量单元GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);//重新调入栈顶EXPRESSION(SymSetAdd(DOSYM,FSYS),LEV,TX);//表达式GEN(OPR,0,11);//判断运算CX2=CX;GEN(JPC,0,0);//如果栈顶非真跳转GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);///重新调入栈顶GEN(LIT,0,1) ;//送1到栈顶GEN(OPR,0,3); //减运算if(SYM==DOSYM){GetSym();STATEMENT(FSYS,LEV,TX);}GEN(JMP,0,CX1);CODE[CX2].A=CX;}else if(SYM==TOSYM){CX1=CX;GetSym();GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR); //保存结果至变量单元GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR); /重新调入栈顶EXPRESSION(SymSetAdd(DOSYM,FSYS),LEV,TX);//表达式分析GEN(OPR,0,13);//判断运算CX2=CX;GEN(JPC,0,0);//如果栈顶非真跳转GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);GEN(LIT,0,1);GEN(OPR,0,2);if(SYM==DOSYM){GetSym();STATEMENT(FSYS,LEV,TX);}GEN(JMP,0,CX1);CODE[CX2].A=CX;//回填地址}else Error(35);break;(3) 增加条件语句的ELSE子ELSE语句的语法语义分析程序:case IFSYM:GetSym();CONDITION(SymSetUnion(SymSetNew(THENSYM,DOSYM),FSYS),LEV,TX);if (SYM==THENSYM) GetSym();else Error(16);CX1=CX; GEN(JPC,0,0);STATEMENT(FSYS,LEV,TX);CX2=CX; GEN(JMP,0,CX+1);CODE[CX1].A=CX;if (SYM==SEMICOLON) GetSym();if(SYM==ELSESYM){GetSym();STATEMENT(FSYS,LEV,TX);CODE[CX2].A=CX;} //add the statement of ELSEelse STATEMENT(FSYS,LEV,TX);break;(4)修改单词:不等号# 改为 <>if (CH=='<'){GetCh();if (CH=='=') { SYM=LEQ; GetCh(); }elseif(CH=='>') { SYM=NEQ; GetCh(); }else SYM=LSS;六.实验设计思想1.设计说明PL/0语言是Pascal语言的一个子集,这里分析的PL/0的编译程序包括了对PL/0语言源程序进行分析处理、编译生成类PCODE代码,并在虚拟机上解释运行生成的类PCODE代码的功能。

编译原理实验报告--PLO编译器的修改

编译原理实验报告--PLO编译器的修改

《编译原理》实验报告题目PLO编译器的修改学院计算机学院专业计算机科学与技术2011年1月11日一、课程题目1、对PL/0编译器作以下修改扩充:(1)增加单词:保留字ELSE,FOR,TO,DOWNTO,RETURN 运算符+=,-=,++,――其中FOR,TO,DOWNTO,RETURN属于选做内容。

(2)修改单词:不等号# 改为<>(3)增加条件语句的ELSE子句2、我在本次实验中实现了以下内容:(1)增加单词:保留字ELSE,FOR,TO,DOWNTO,运算符+=,-=,++,――(2)修改单词:不等号# 改为<>(3)增加条件语句的ELSE子句二、测试方案的设计(30%)1、不等号#改为<>的测试方案通过的方案:PROGRAM EX01; V AR A,B,C; BEGINA:=8;C:=10;READ(B);IF B<>1 THEN C:=A+B*(3+B); WRITE(C); END. 不能通过的方案:PROGRAM EX01; V AR A,B,C; BEGINA:=8;C:=10;READ(B);IF B#1 THENC:=A+B*(3+B);WRITE(C); END.2、增加运算符+=,-=,++,――的测试方案:通过的方案1:PROGRAM EX01; V AR a,b,c; BEGINa:=8;b:=4;a+=2*b;WRITE(a);a++;WRITE(a);++b;WRITE(b); END. 通过的方案2:PROGRAM EX01; V AR a,b,c; BEGINa:=8;b:=4;a-=b;WRITE(a);a--;WRITE(a);--b;WRITE(b); END.不通过的方案1:PROGRAM EX01; V AR a,b;BEGINa:=2;++a++;WRITE(a);4++;END. 不通过的方案2:PROGRAM EX01; V AR a,b;BEGINa:=2;--a--;WRITE(a);4--;END.3、增加条件语句的ELSE子句的测试方案:通过的方案:PROGRAM EX01; V AR A,B,C; BEGINA:=8;READ(B);IF B<>1 THENC:=A+B*(3+B); ELSEC:=A+10; WRITE(C); END. 不能通过的方案:PROGRAM EX01; V AR A,B,C; BEGINA:=8;READ(B); WHILE B<>1 DOC:=A+B*(3+B); ELSEC:=A+10; WRITE(C); END.4、FOR——TO\DOWNTO的测试方案:通过的方案1:PROGRAM EX01;V AR a,B,C;BEGINa:=1;B:=2;FOR C:=1 TO 3 DOBEGINa+=B*(3+B);WRITE(a);END;END. 通过的方案2:PROGRAM EX01;V AR a,B,C;BEGINa:=1;B:=2;FOR C:=3 DOWNTO 1 DOBEGINa+=B*(3+B);WRITE(a);END;END.不能通过的方案1:PROGRAM EX01; V AR a,B;BEGINa:=1;B:=2;FOR 1 TO 3 DOBEGINa+=B*(3+B);WRITE(a); ENDEND. 不能通过的方案2:PROGRAM EX01;V AR a,B,C;BEGINa:=1;B:=2;FOR C:=3 DOWNTO 1BEGINa+=B*(3+B);WRITE(a);ENDEND.三、题目分析与设计(40%)对题目各项要求自行分点论述设计修改过程。

编译原理课设报告版

编译原理课设报告版

一、设计目的研究、改进或自行设计、开发一个简单的编译程序或其部分功能,加深对编译理论和编译过程的理解。

编程语言不限。

二、设计任务扩展 PL/0 编译程序功能目的: 扩充 PL/0 编译程序功能要求: (1)阅读、研究 PL/0 编译程序源文件。

(2)在上述工作基础上,可有选择地补充、完善其中词法分析、语法分析、语义分析、目标代码生成、目标代码解释执行等部分的功能。

如以语法分析部分为例,则可以增加处理更多语法成分的功能,如可处理一维数组、++、--、+=、-=、*=、/=、%(取余)、!(取反)、repeat、for、else、开方、处理注释、错误提示、标示符或变量中可以有下划线等。

还可以增加类型,如增加字符类型、实数类型; 扩充函数如有返回值和返回语句的,有参数函数等;(3)设计编制典型的运行实例,以便能反映出自己所作的改进。

三、设计思想:PL/0 语言可以看成PASCAL 语言的子集,它的编译程序是一个编译解释执行系统。

PL/0 的目标程序为假想栈式计算机的汇编语言,与具体计算机无关。

PL/0的编译程序和目标程序的解释执行程序都是用PASCAL语言书写的,因此PL/0 语言可在配备PASCAL 语言的任何机器上实现。

其编译过程采用一趟扫描方式,以语法分析程序为核心,词法分析和代码生成程序都作为一个独立的过程,当语法分析需要读单词时就调用词法分析程序,而当语法分析正确需要生成相应的目标代码时,则调用代码生成程序。

用表格管理程序建立变量、常量和过程表示符的说明与引用之间的信息联系。

当源程序编译正确时,PL/0 编译程序自动调用解释执行程序,对目标代码进行解释执行,并按用户程序的要求输入数据和输出运行结果。

四、设计内容:1扩充语句for(<语句>;<条件>;<语句>)<语句>;2扩充语句if <条件> then <语句> else <语句>;3扩充语句repeat <语句>;until <条件>;4增加自增自减运算++和—和+=,-=运算;5修改不等号#,为!=;6增加一维数组声明格式:<ident>[<ident>/<number>:<ident>/<number>]; 赋值格式:<ident>[<index>]:=<表达式>; 调用格式:<ident>[<index>]五、程序结构:PL/0源程序图1 编译程序结构 图2功能模块调用1.功能模块作用如下:Pl0.c :主程序Error :出错处理,打印出错位置和错误编码 Getsym :词法分析,读取一个单词 Getch :漏掉空格,读取一个字符Gen :生成目标代码,并送入目标程序区 Test :测试当前符号是否合法Block :分程序分析处理过程,词法语法分析 Enter :登陆名字表Position :查找标识符在名字表中的位置Constdeclaration:常量定义处理Vardeclaraction:变量说明处理Listcode:列出目标代码清单Statement:语句处理Expression:表达式处理Term:项处理Factor:因子处理Condition:条件处理Interpret:对目标代码的解释执行程序Base:通过静态链求出数据取得基地址增加两个功能:Arraydeclaration:数组声明处理Arraycoef:数组索引计算和“虚拟机”动作生成2.保留字:enum symbol {nul, ident, number, plus, minus, times, slash, oddsym, eql, neq,lss, leq, gtr, geq, lparen,rparen, comma, semicolon, period, becomes,beginsym, endsym, ifsym, thensym,elsesym,forsym, inc, dec, whilesym, writesym,readsym, dosym, callsym, constsym,varsym,procsym, repeatsym, untilsym, plusbk, minusbk,lbrack, rbrack, colon,}共43个,其中补充保留字为:else, for, repeat, until, plusbk, minusbk,Lbrack, rbrack, colon3.名字表中的类型enum object{ constant, variable, procedure, arrays, }共4个,扩充arrays,以便实现数组4.虚拟机代码enum fct { lit, opr, lod, sto, cal, inte, jmp, jpc, lda, sta, }共10个,补充的lda,sta用于数组操作6.错误信息(1)const,var,procedure后应为标识符(2) 常数说明中的=后应是数字(3)常数说明中的标识符后应是=(4)常数说明中的=写成了:=(5)漏掉了,或;(6)过程说明后的符号不正确(应是语句开始符,或过程定义符)(7)应是语句开始符(8)标识符未说明(9)程序结尾丢了句号。

编译原理PL0课程设计报告

编译原理PL0课程设计报告

课程设计班级:21301学号:1361080108姓名:马瑞泽百度一.课程设计目的在分析理解一个教学型编译程序(如PL/0)的基础上,对其词法分析程序、语法分析程序和语义处理程序进行部分修改扩充。

达到进一步了解程序编译过程的基本原理和基本实现方法的目的。

二.课程设计要求1. 基本内容(1)扩充赋值运算:+= 和 -=(2)扩充语句(Pascal的FOR语句):①FOR <变量>:=<表达式> TO <表达式> DO <语句>②FOR <变量>:=<表达式> DOWNTO <表达式> DO <语句>其中,语句①的循环变量的步长为2,语句②的循环变量的步长为-2。

2. 选做内容(1)增加运算:++ 和 --。

(2)增加类型:①字符类型;②实数类型。

(3)扩充函数:①有返回值和返回语句;②有参数函数。

(4)增加一维数组类型(可增加指令)。

(5)其他典型语言设施。

3.本人在课程设计中已实现的功能(1)增加单词:保留字 ELSE,FOR,TO,DOWNTO, REPEAT, UNTIL, RETURN运算符 +=,-=,++,--(2)修改单词:不等号# 改为 <>(3)增加条件语句的ELSE子句(4)扩充赋值运算:+= 和 -=(5)扩充语句①FOR <变量>:=<表达式> TO <表达式> DO <语句>②FOR <变量>:=<表达式> DOWNTO <表达式> DO <语句>(6)增加运算:++ 和 --(包括前后++、--运算)(7)增加一维数组类型(8)其他典型语言设施:REPEAT 语句 UNTIL 语句三.课程设计环境与工具(1)计算机及操作系统:PC机,Win7(2)实现工具:VC++ 6.0, C语言(3)教学型编译程序:PL/0四.结构设计说明1)PL/0编译程序的结构图2)PL/0编译程序的过程或函数的功能表4) 词法分析词法分析是编译的第一个阶段,它的主要任务是从左向右逐个字符地对源程序进行扫描,产生一个个单词序列用于语法分析。

PL0语言编译器分析实验报告

PL0语言编译器分析实验报告

PL0语言编译器分析实验报告1. 引言1.1 PL0语言简介PL0语言是一种早期的程序设计语言,由瑞士计算机科学家尼克劳斯·沃斯(Niklaus Wirth)于1970年左右设计。

它是为了教学目的而设计的,具有简单、清晰、易于理解的特点。

PL0语言是一种过程式编程语言,不支持面向对象编程。

它的语法与Pascal语言相似,是许多编程语言教材中的入门语言。

1.2 编译器概述编译器是一种将高级编程语言源代码转换为低级机器语言或中间代码的程序。

它主要包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等阶段。

编译器的主要目的是提高程序的可移植性、执行效率和开发效率。

1.3 实验目的与意义本次实验通过对PL0语言编译器的分析,旨在让学生深入了解编译器的工作原理和实现方法,提高编程实践能力。

实验的意义在于:1.加深对编译原理的理解,掌握编译器各阶段的基本任务和关键技术;2.培养学生独立分析问题、解决问题的能力;3.提高学生的编程技巧,为后续学习更高级的编程语言打下基础;4.通过实验,使学生了解编译器在软件开发中的重要作用,为今后从事软件开发工作奠定基础。

2 PL0语言编译器原理2.1 编译器的工作流程编译器的工作流程主要包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等阶段。

1.词法分析:将源程序中的字符序列转换为记号(Token)序列。

2.语法分析:根据语法规则,将记号序列转换为抽象语法树(AST)。

3.语义分析:检查源程序是否有语义错误,如类型检查、作用域检查等。

4.中间代码生成:将AST转换为中间代码,方便后续优化和目标代码生成。

5.代码优化:对中间代码进行优化,提高目标代码的执行效率。

6.目标代码生成:将优化后的中间代码转换为特定平台的目标代码。

2.2 PL0语言的词法、语法和语义1.词法:PL0语言的词法规则包括标识符、常数、运算符和界限符等。

2.语法:PL0语言的语法规则定义了各种语句和表达式的结构,如条件语句、循环语句、赋值语句等。

编译原理课程设计报告

编译原理课程设计报告

编译原理课程设计题目一个PASCAL语言子集(PL/0)编译器的设计与实现专业班号学号姓名指导老师答辩日期2014年1月1设计的题目一个PASCAL语言子集(PL/0)编译器的设计与实现2课程设计的要求PL/0语言可以看成PASCAL语言的子集,它的编译程序是一个编译解释执行系统。

PL/0的目标程序为假想栈式计算机的汇编语言,与具体计算机无关。

PL/0的编译程序和目标程序的解释执行程序都是用C语言书写的,因此PL/0语言可在配备C语言编译器的任何机器上实现。

其编译过程采用一趟扫描方式,以语法分析程序为核心,词法分析和代码生成程序都作为一个独立的过程,当语法分析需要读单词时就调用词法分析程序,而当语法分析正确需要生成相应的目标代码时,则调用代码生成程序。

用表格管理程序建立变量、常量和过程标示符的说明与引用之间的信息联系。

用出错处理程序对词法和语法分析遇到的错误给出在源程序中出错的位置和错位性质。

当源程序编译正确时,PL/0编译程序自动调用解释执行程序,对目标代码进行解释执行,并按用户程序的要求输入数据和输出运行结果。

3设计任务:PL/0语言文法的EBNF(巴克斯-瑙尔范式)表示〈表达式〉::=[+|-]〈项〉{〈加法运算符〉〈项〉}〈项〉::=〈因子〉{〈乘法运算符〉〈因子〉}〈因子〉::=〈标识符〉|〈无符号整数〉|‘(’〈表达式〉‘)’〈加法运算符〉::=+|-〈乘法运算符〉::=*|/〈关系运算符〉::==|#|<|<=|>|>=〈条件语句〉::=IF〈条件〉THEN〈语句〉〈过程调用语句〉::=CALL〈标识符〉〈当型循环语句〉::=WHILE〈条件〉DO〈语句〉〈读语句〉::=READ‘(’〈标识符〉{,〈标识符〉}‘)’〈写语句〉::=WRITE‘(’〈表达式〉{,〈表达式〉}‘)’〈字母〉::=a|b|…|X|Y|Z〈数字〉::=0|1|…|8|9PL/0语言可以看成PASCAL语言的子集,它的编译程序是一个编译解释执行系统。

广东工业大学编译原理实验报告

广东工业大学编译原理实验报告

实验报告课程名称____ 编译原理__________ 题目名称_ PL/0编译程序的修改扩充_ 学生学院______计算机学院__ 专业班级_______ ________ 学号学生姓名______ ________ 指导教师____ _________ __20年月日一、课内实验要求对PL/0作以下修改扩充:增加单词:保留字ELSE,FOR,TO,DOWNTO,RETURN运算符*=,/=,++,--,&,||,!修改单词:不等号# 改为<>增加条件语句的ELSE子句,要求:写出相关文法,语法图,语义规则。

二、实验环境与工具计算机及操作系统:PC机,Windows2000,WindowsXP程序设计语言:C教学型编译程序:PL/0设计方案概述:源、目标语言,实现工具(平台),运行平台源语言:PASCAL目标语言:假想栈式计算机的汇编语言,可称为类PCODE指令代码实现工具:Visual C++ 6.0运行平台:Windows 7三、设计方案1.结构设计说明(1)PL/0 语言编译器PL/0语言可看成是PASCAL语言的子集,它的编译程序是一个编译解释执行系统。

PL/0的目标程序为假想栈式计算机的汇编语言,与具体计算机无关。

(2)PL/0编译程序的语法分析过程BLOCK是整个编译过程的核心。

这里根据编译程序的总体流程图,来弄清BLOCK 过程在整个编译程序中的作用。

总流程图如下图所示:PL/0 的编译程序采用一趟扫描方式,以语法分析程序为核心,词法分析程序和代码生 成程序都作为一个独立的过程,当语法分析需要读单词时就用词法分析程序,而当语法分析 正确需生成相应的目标代码时,则调用代码生成程序。

此外,用表格管理程序建立变量,常 量和过程标识符的说明与引用之间的信息联系。

用出错处理程序对词法和语法分析遇到的错 误给出在源程序中出错的位置和错误性质。

PL/0语法调用关系图2、主要成分描述○1符号表为了组成一条指令,编译程序必须知道其操作码及其参数(数或地址)。

编译原理PL0课程设计报告材料

编译原理PL0课程设计报告材料

课程设计班级:21301学号:1361080108姓名:马瑞泽百度一.课程设计目的在分析理解一个教学型编译程序(如PL/0)的基础上,对其词法分析程序、语法分析程序和语义处理程序进行部分修改扩充。

达到进一步了解程序编译过程的基本原理和基本实现方法的目的。

二.课程设计要求1. 基本内容(1)扩充赋值运算:+= 和 -=(2)扩充语句(Pascal的FOR语句):①FOR <变量>:=<表达式> TO <表达式> DO <语句>②FOR <变量>:=<表达式> DOWNTO <表达式> DO <语句>其中,语句①的循环变量的步长为2,语句②的循环变量的步长为-2。

2. 选做内容(1)增加运算:++ 和 --。

(2)增加类型:①字符类型;②实数类型。

(3)扩充函数:①有返回值和返回语句;②有参数函数。

(4)增加一维数组类型(可增加指令)。

(5)其他典型语言设施。

3.本人在课程设计中已实现的功能(1)增加单词:保留字 ELSE,FOR,TO,DOWNTO, REPEAT, UNTIL, RETURN运算符 +=,-=,++,--(2)修改单词:不等号# 改为 <>(3)增加条件语句的ELSE子句(4)扩充赋值运算:+= 和 -=(5)扩充语句①FOR <变量>:=<表达式> TO <表达式> DO <语句>②FOR <变量>:=<表达式> DOWNTO <表达式> DO <语句>(6)增加运算:++ 和 --(包括前后++、--运算)(7)增加一维数组类型(8)其他典型语言设施:REPEAT 语句 UNTIL 语句三.课程设计环境与工具(1)计算机及操作系统:PC机,Win7(2)实现工具:VC++ 6.0, C语言(3)教学型编译程序:PL/0四.结构设计说明1)PL/0编译程序的结构图2)PL/0编译程序的过程或函数的功能表4)GETSYM的NUM中,单词,常量Getch,并把拼成SYM置成NUL。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计
班级:21301
学号:1361080108
姓名:马瑞泽
百度
一.课程设计目的
在分析理解一个教学型编译程序(如PL/0)的基础上,对其词法分析程序、语法分析程序和语义处理程序进行部分修改扩充。

达到进一步了解程序编译过程的基本原理和基本实现方法的目的。

二.课程设计要求
1. 基本内容
(1)扩充赋值运算:+= 和 -=
(2)扩充语句(Pascal的FOR语句):
①FOR <变量>:=<表达式> TO <表达式> DO <语句>
②FOR <变量>:=<表达式> DOWNTO <表达式> DO <语句>
其中,语句①的循环变量的步长为2,
语句②的循环变量的步长为-2。

2. 选做内容
(1)增加运算:++ 和 --。

(2)增加类型:①字符类型;②实数类型。

(3)扩充函数:①有返回值和返回语句;②有参数函数。

(4)增加一维数组类型(可增加指令)。

(5)其他典型语言设施。

3.本人在课程设计中已实现的功能
(1)增加单词:保留字 ELSE,FOR,TO,DOWNTO, REPEAT, UNTIL, RETURN
运算符 +=,-=,++,--
(2)修改单词:不等号# 改为 <>
(3)增加条件语句的ELSE子句
(4)扩充赋值运算:+= 和 -=
(5)扩充语句
①FOR <变量>:=<表达式> TO <表达式> DO <语句>
②FOR <变量>:=<表达式> DOWNTO <表达式> DO <语句>
(6)增加运算:++ 和 --(包括前后++、--运算)
(7)增加一维数组类型。

相关文档
最新文档