编译原理课设报告版
编译原理课设报告
![编译原理课设报告](https://img.taocdn.com/s3/m/36ab73469ec3d5bbfc0a742a.png)
课程设计报告课程名称编译原理课程设计WHILE循环语句的翻译程序设计题目(递归下降法、输出四元式)学院计算机科学与技术班级学号姓名指导教师汪祥莉2019年1月3日课程设计任务书学生姓名:专业班级:指导教师:汪祥莉工作单位:计算机科学与技术学院题目: WHILE循环语句的翻译程序设计(递归下降法、输出四元式)初始条件:理论:学完编译课程,掌握一种计算机高级语言的使用。
实践:计算机实验室提供计算机及软件环境。
如果自己有计算机可以在其上进行设计。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)写出符合给定的语法分析方法的文法及属性文法。
(2)完成题目要求的中间代码四元式的描述。
(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。
(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。
(5)设计报告格式按附件要求书写。
课程设计报告书正文的内容应包括:1 系统描述(问题域描述);2 文法及属性文法的描述;3 语法分析方法描述及语法分析表设计;4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;5 详细的算法描述(流程图或伪代码);6 软件的测试方法和测试结果;7 实践总结(本设计的评价、特点、不足、收获与体会等);时间安排:设计安排一周:周1、周2:完成系统分析及设计。
周3、周4:完成程序调试及测试。
周5:撰写课程设计报告。
设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。
设计报告书收取时间:设计周的次周星期一上午10点。
指导教师签名: 2019年 10月 1日系主任(或责任教师)签名: 2019年 10月 1日一.系统描述设计编写一个常见高级语言while循环语句的词法﹑语法及语义分析程序,语法分析选择递归下降法,使用语法制导的语义计算输出四元式形式的中间代码。
其中,递归下降法使用的是LL(1)文法,必须先消除左递归,使文法符合LL(1)文法。
编译原理课程设计报告
![编译原理课程设计报告](https://img.taocdn.com/s3/m/812c7af3172ded630a1cb601.png)
《编译原理》课程设计报告一、课程设计目的通过课程设计进一步理解高级语言在计算机中的执行过程,了解现代编译器的运作机制,加深对编译原理中重点算法和编译技术的理解,提高自己自学和理解的能力。
学会如何利用已有软件JFLex、Java_cup对词法分析器及语法分析器的构造。
二、设计概述本tiger语言编译器的编译过程涉及到编译五个阶段中的二个,即词法分析器、语法分析器。
其中语法分析后还完成了语法树的打印的构造以及类型检查。
词法分析器由JFLex编译正则式生成,词法分析器编译产生式生成,语法分析器由CUP生成。
结果通过GUI界面呈现在使用者面前。
编译程序需要在单词级别上来分析和翻译源程序,所以首先要识别出单词,而词法分析部分的任务是:从左至右扫描源程序的字符串,按照词法规则(正则文法规则)识别出一个个正确的单词,并转换成该单词相应的二元式(种别码、属性值)交给语法分析使用。
因此,词法分析是编译的基础。
执行词法分析的程序称为词法分析器。
语法分析是编译程序的核心部分,其主要任务是确定语法结构,检查语法错误,报告错误的性质和位置,并进行适当的纠错工作。
三、设计过程(一)设计构思程序主要完成三大功能模块:词法分析器、语法分析器、GUI人机交互界面。
词法分析器由JFLex编译正则式生成,其中必须为外界提供一个获取记号流的接口,实验中定为java_cup.runtime.Symbol next_token。
语法分析器是建立在词法分析器上的,故必须包含词法分析器以便获得记号流,next_token为语法分析器提供TOKEN,语法分析器的对外接口是:java_cup.runtime.Symbol debug_parse(),同时返回语法树的根节点。
GUI 界面是提供人机交互的,它能够依次显示词法分析阶段分析得到的所有TOKEN 的信息,语法阶段生成的语法树,另外对于词法和语法阶段出现的错误在“错误提示”文本框中一一列举出来,提供用户改进代码的信息。
编译原理课程设计报告
![编译原理课程设计报告](https://img.taocdn.com/s3/m/7b0dbb35ef06eff9aef8941ea76e58fafab0459c.png)
课程设计报告( 2021--2022年度第一学期)名称:编译技术课程设计题目:算符优先分析法研究院系:班级:学号:学生姓名:指导教师:设计周数:一周成绩:日期:2021年12 月31日1 课程设计的目的和要求1.1 课程设计的目的本次设计的时间为1周,目的是通过使用高级语言实现部分算法加强对编译技术和理论的理解。
设计的题目要求具有一定的规模,应涵盖本课程内容和实际应用相关的主要技术。
1.2 课程设计的要求1. 文法使用产生式来定义;2. 分别给出每一个非终结符的FIRSTVT和LASTVT集。
3. 画出算符优先关系表;4. 判定给定的文法是否是算符优先文法;5. 给定符号串判定是否是文法中的句子,分析过程用分析表格的方式打印出来。
2 系统描述举例如下:本次实验使用Visual Studio 2019软件,利用只规定终结符之间的优先关系的自底向上移进-规约法实现对算符优先分析法的研究,输出非终结符的FIRSTVT和LASTVT集,算符优先关系表和对句子的分析表格,均在DOS窗口显示。
2.1 文法的描述G[S]: S->#E#;E->E+T|T;F-P!F|P;T->T*F|F;P->(E)|i2.2 属性文法的描述表2-1 条件语句及其语义规则3 概要设计3.1 概要设计(体现系统的设计思路和主要功能)主要步骤包括:用户自己输入文法,实质上是算数表达式的计算。
构建每个非终结符的FirstVT()和LastVT()集。
构建优先关系符号表。
构建词法分析的程序。
编写主函数,用户输入文法对语句利用算符优先文法进行判别。
算法的主体思想:用栈存储已经看到的输入符号,用优先关系指导移动归约语法分析器的动作,如果栈顶的终结符和下一个输入符之间的优先关系是<或=,则语法分析器移动,表示还没有发现句柄的右端,如果是>关系,就调用归约。
3.2 开发环境实验采用C++程序语言进行设计开发工具为Visual Studio 20194 详细设计4.1 系统的类图图4-1 文法类图4.2 主要算法的流程图图4-2 求非终结符的FIRSTVT 和LASTVT 集流程图求LASTVT 集的过程与此类似,但符号串的扫描顺序是从后开始若产生式右部第一个字符为非终结符 则直接将其加入first 集中else first[x].insert(str[0]);寻找该非终结符 的first 集 dfs(y);将该非终结符的first 集也加进去for (; it != first[y].end(); it++)first[x].insert(*it);if (isupper(str[0]))若产生式右部第一个字符为非终结符 string& left = VN_set[x].left;string&str = VN_set[x].right[i];产生产生式左部非终结符的FIRSTVT 集图4-3 构造算符优先关系表流程图图4-4 对输入串进行算符优先分析流程图4.3 数据分析与定义char relation[MAX][MAX]; //算符优先关系表vector<char> VT;vector<WF> VN_set; //类型为文法的数组VN_setmap<string, int> VN_dic; //map映射,一条产生式对应的第几条的序号set<char> first[MAX]; //FIRSTVT集set<char> last[MAX]; //LASTVT集4.4 系统界面设计用户输入文法个数和每条产生式的内容后,输出结果格式如下:分为:产生式、FIRSTVT集、;LASTVT集、算符优先关系表和分析过程图4-5 系统输出界面概况5 测试方法和测试结果5.1 测试用例1输入如程序5-1所示。
编译原理课程设计报告
![编译原理课程设计报告](https://img.taocdn.com/s3/m/11b157785acfa1c7ab00cc03.png)
实验要求✧基本内容1)增加单词:保留字ELSE,REPEAT,DOWHILE,RETURN运算符+=,-=,++,--2)修改单词:不等号# 改为<>3)增加条件语句的ELSE子句4)扩充赋值运算:+= 和-=5)扩充语句(Pascal的FOR语句):①FOR <变量>:=<表达式> TO <表达式> DO <语句>②FOR <变量>:=<表达式> DOWNTO <表达式> DO <语句>其中,语句①的循环变量的步长为2,语句②的循环变量的步长为-2。
✧选做内容1)增加运算:++ 和--。
2)增加类型:①字符类型;②实数类型。
3)扩充函数:①有返回值和返回语句;②有参数函数。
4)增加一维数组类型(可增加指令)。
5)其他典型语言设施。
设计方案1.概述:源、目标语言:编译程序编绎的源程序是PL0,程序产生的目标代码是一个假想栈式计算机的汇编语言.称为类PCODE指令代码 ,指令格式格式如下:F L A其中F代表功能码,L表示层次差,A表示位移量,不同指令其含义有所区别。
PL/0语言是Pascal语言的一个子集,这里分析的PL/0的编译程序包括了对PL/0语言源程序进行分析处理、编译生成类PCODE代码,并在虚拟机上解释运行生成的类PCODE代码的功能。
PL/0语言编译程序采用以语法分析为核心、一遍扫描的编译方法。
词法分析和代码生成作为独立的子程序供语法分析程序调用。
语法分析的同时,提供了出错报告和出错恢复的功能。
在源程序没有错误编译通过的情况下,调用类PCODE解释程序解释执行生成的类PCODE代码。
实现工具(平台),运行平台:编译器实现工具和运行平台程序用C++语言编写,在C++ Builder平台下运行。
2.结构设计说明:PL/0的编译过程采用一趟扫描方式,以语法分析为核心,词法分析程序和代码生成程序都作为一个独立的过程,当语法分析需要读入单词时就调用词法分析程序,而当语法分析正确需生成相应的目标代码时,则调用代码生成程序。
编译原理课程设计报告报告
![编译原理课程设计报告报告](https://img.taocdn.com/s3/m/0ed95669581b6bd97f19ea91.png)
编译原理课程设计报告一、目的与要求目的:在分析理解一个教学型编译程序(如PL/0)的基础上,对其词法分析程序、语法分析程序和语义处理程序进行部分修改扩充。
达到进一步了解程序编译过程的基本原理和基本实现方法的目的。
要求:对PL/0作以下修改扩充:基本内容(成绩范围:“中”、“及格”或“不及格”)(1)扩充赋值运算:+= 和-=(2)扩充语句REPEAT<语句序列>UNTIL <条件>其中,<条件>是循环条件,即条件不成立时,重复执行循环体的< 语句序列>;条件成立时,循环结束。
选做内容(成绩评定范围扩大到:“优”和“良”)(1)增加运算:++ 和--。
(2)增加类型:①字符类型;②实数类型。
(3)扩充函数:①有返回值和返回语句;②有参数函数。
(4)增加一维数组类型(可增加指令)。
(5)其他典型语言设施。
二、实验环境与工具(1)计算机及操作系统:PC机,WindowsXP(2)程序设计语言:C(3)教学型编译程序:PL/0三、设计方案(1)概述:源、目标语言,实现工具(平台),运行平台源语言: PL/0目标语言: 目标代码(生成的文件后缀为*.COD)实现平台: VC++ 6.0运行平台: WindowsXP(2)结构设计说明:各功能模块描述Error()出错处理,打印出错位置和错误编码GetCh()漏掉空格,读取一个字符GetSym()词法分析,读取一个单词GEN()目标代码生成过程,本过程用于把生成的目标代码写入目标代码数组,供后面的解释器解释执行TEST()测试当前单词是否合法过程testENTER()登陆符号表过程enterPOSITION() 在符号表中查找指定符号所在位置的函数position,如果找不到就返回0V ARDECLARATION()变量声明LISTCODE()列出目标代码清单;FACTOR()因子处理过程factorTERM()项处理过程term;EXPRESSION()表达式处理过程CONDITION()条件处理过程STATEMENT()语句处理过程BLOCK()语法分析过程BASE(): 通过静态链求出数据区基地址的函数,INTERPRET ():对目标代码解释运行过程(3)主要成分描述①符号表struct tablestruct{char name[al]; /* 名字*/enum object kind; /* 类型:const ,var ,procedure*/int val; /* 数值,仅const 使用*/int level; /* 所处层,仅const 不使用*/int adr; /* 地址,仅const 不使用*/Int size; /* 需要分配的数据区空间*/};struct tablestruct table[txmax]; /* 名字表*/②运行时存储组织和管理由于编译时目标程序运行的数据空间大小已经规定,所以存储组织属于静态存储。
四川大学-编译原理课程设计报告
![四川大学-编译原理课程设计报告](https://img.taocdn.com/s3/m/e33f29fdf90f76c661371afd.png)
编译原理课程设计报告课题名称:编译原理课程设计C-语言词法与语法分析器的实现提交文档学生姓名:提交文档学生学号:同组成员名单:指导教师姓名:指导教师评阅成绩:指导教师评阅意见:..提交报告时间:年月日C-词法与语法分析器的实现1.课程设计目标(1)题目实用性C-语言拥有一个完整语言的基本属性,通过编写C-语言的词法分析和语法分析,对于理解编译原理的相关理论和知识有很大的作用。
通过编写C-语言词法和语法分析程序,能够对编译原理的相关知识:正则表达式、有限自动机、语法分析等有一个比较清晰的了解和掌握。
(2)C-语言的词法说明①语言的关键字:else if int return void while所有的关键字都是保留字,并且必须是小写。
②专用符号:+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */③其他标记是ID和NUM,通过下列正则表达式定义:ID = letter letter*NUM = digit digit*letter = a|..|z|A|..|Zdigit = 0|..|9注:ID表示标识符,NUM表示数字,letter表示一个字母,digit表示一个数字。
小写和大写字母是有区别的。
④空格由空白、换行符和制表符组成。
空格通常被忽略。
⑤注释用通常的c语言符号/ * . . . * /围起来。
注释可以放在任何空白出现的位置(即注释不能放在标记内)上,且可以超过一行。
注释不能嵌套。
(3)程序设计目标能够对一个程序正确的进行词法及语法分析。
2.分析与设计(1)设计思想a.词法分析词法分析的实现主要利用有穷自动机理论。
有穷自动机可用作描述在输入串中识别模式的过程,因此也能用作构造扫描程序。
通过有穷自动机理论能够容易的设计出词法分析器。
b.语法分析语法分析采用递归下降分析。
递归下降法是语法分析中最易懂的一种方法。
它的主要原理是,对每个非终结符按其产生式结构构造相应语法分析子程序,其中终结符产生匹配命令,而非终结符则产生过程调用命令。
《编译原理》设计方案报告
![《编译原理》设计方案报告](https://img.taocdn.com/s3/m/08f881a28762caaedd33d491.png)
《编译原理》课程设计报告设计题目: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、符号表的组织符号表的组织方式有:线性表、散列表、树结构等,其必须维持源程序中的作用域信息。
编译原理课设报告ll0
![编译原理课设报告ll0](https://img.taocdn.com/s3/m/aab836229a6648d7c1c708a1284ac850ad0204ff.png)
编译原理课设报告ll0编译原理课设报告LL(0)。
一、引言。
编译原理是计算机科学与技术领域的重要课程之一,它研究如何将高级程序语言翻译成机器语言。
LL(0)是一种重要的语法分析方法,它是一种自顶向下的分析方法,通过构建语法树来实现对程序语言的分析和翻译。
本报告将介绍LL(0)语法分析的原理、算法以及课设的设计与实现。
二、LL(0)语法分析原理。
LL(0)语法分析是一种基于预测分析表的自顶向下语法分析方法。
它通过预测下一个输入符号,根据文法规则进行推导,最终构建出语法树。
LL(0)的意思是“左侧扫描、左推导、0个向前看符号”。
LL(0)语法分析的关键是构建预测分析表,该表包含了文法的非终结符和终结符的组合,以及对应的产生式。
通过分析输入串和预测分析表,可以确定下一个推导所使用的产生式,从而构建语法树。
三、LL(0)语法分析算法。
1. 构建First集和Follow集。
在LL(0)语法分析中,需要先构建每个非终结符的First集和Follow集。
First集表示该非终结符能够推导出的终结符集合,Follow集表示在该非终结符的右侧能够出现的终结符集合。
2. 构建预测分析表。
根据文法的产生式和First集、Follow集,构建预测分析表。
预测分析表的行表示文法的非终结符,列表示文法的终结符。
表中的每个格子填写对应的产生式。
3. 进行语法分析。
根据输入串和预测分析表,进行语法分析。
从左到右扫描输入串,根据当前输入符号和栈顶符号,在预测分析表中查找对应的产生式。
将产生式右侧的符号入栈,并将输入串向右移动一个位置。
重复这个过程,直到输入串为空或者出现错误。
四、课设设计与实现。
1. 文法设计。
根据课设要求,设计符合LL(0)语法分析方法的文法。
文法应该满足左递归消除、左因子消除等要求,以便于构建预测分析表。
2. 构建预测分析表。
根据设计的文法,构建预测分析表。
根据文法的非终结符和终结符,填写预测分析表中的产生式。
编译原理课程设计报告模板
![编译原理课程设计报告模板](https://img.taocdn.com/s3/m/eb41b95433d4b14e8424684a.png)
编译原理课程设计与实验安排1.1课程设计的基本要求和方法1课程设计的目的编译原理课程是计算机科学与技术专业学生的重要基础课程。
通过学习该课程,要求学生掌握编译原理的基本原理、方法和技术。
《编译原理》课程是计算机软件学科理论与实践相结合的典范,在教学过程中既要注重该领域在理论上取得的完美结论,也同时强调这些理论在实际中的应用。
学生学习该课程不仅要掌握语法和语义的形式化理论,而且还必须注重在理论指导下的课程实验。
《编译原理》课程设计是计算机科学与技术专业的主要实践性教学环节。
在进行了专业基础课和《编译原理》课程的基础上,设计一个实际的程序语言的编译系统旨在加深对程序语言结构和机器处理方式的理解,初步掌握高级语言到机器指令的转换的基本方法,提高进行工程设计的基本技能及分析、解决实际问题的能力,为毕业设计和以后的工程实践打下良好的基础。
为了使学生从课程设计中尽可能取得比较大的收获,可选择不同的方式进行实现,同时还提供了相关的选作题目。
2课程设计的教学基本要求●巩固和加深对编译原理的理解,提高综合运用本课程所学知识的能力。
●培养学生选用参考书,查阅手册及文献资料的能力。
培养独立思考,深入研究,分析问题、解决问题的能力。
●能够按要求编写课程设计报告书,能正确阐述设计和实验结果,正确绘制系统和程序框图。
●通过课程设计,培养学生严肃认真的工作作风。
3课程设计的教学基本要求●巩固和加深对编译原理的理解,提高综合运用本课程所学知识的能力。
●培养学生选用参考书,查阅手册及文献资料的能力。
培养独立思考,深入研究,分析问题、解决问题的能力。
●能够按要求编写课程设计报告书,能正确阐述设计和实验结果,正确绘制系统和程序框图。
●通过课程设计,培养学生严肃认真的工作作风。
4课程设计的要求●程序实现要求(1)设计符号表确定符号表的组织方式,一般应包括名字栏和信息栏,其中名字栏作为关键字。
要考虑能够存储有关名字的信息,并可以高效地完成如下操作:a.查找:根据给定的名字,在符号表中查找其信息。
编译原理课程设计报告模板
![编译原理课程设计报告模板](https://img.taocdn.com/s3/m/d4206d760b1c59eef8c7b426.png)
《编译原理课程设计》报告MiniC编译器MFC实现分组序号:5设计地点:微机301、401电子邮件:1260815873@ 指导教师:李村合技术支持:CSDN下载:百度文库下载:2011 年 12 月 24 日目录1前言 (1)2课程设计目的 (2)3课程设计内容 (2)4编译器特色 (2)5课程设计原理 (2)6系统需求分析 (6)6.1MiniC编译程序总体流程图 (7)6.2功能需求 (8)6.3主要用到的关键词: (10)6.4汇编成可运行文件 (10)6.5MiniC语言的BNF文法 (10)7系统设计与实现 (12)7.1BY5编译程序主要模块功能 (12)7.2词法分析子程序 (13)7.3语法语义分析子程序 (18)7.3.1分程序处理过程 (18)7.3.2变量定义过程 (19)7.3.3语句处理过程 (19)7.3.4赋值语句的处理 (21)7.3.5read语句的处理 (22)7.3.6write语句的处理 (23)7.3.7call语句的处理 (24)7.3.8if语句的处理 (24)7.3.9while语句的处理 (25)7.3.10表达式、项、因子处理 (25)7.3.11逻辑表达式的处理 (26)7.3.12判断单词合法性与出错恢复过程分析: (29)8系统测试与运行结果分析 (29)8.1.1测试程序: (29)8.1.2测试结果 (33)9心得体会 (35)1前言编译原理是大学计算机课程中比较难的一门课程,理论性相对较强,因而实践很重要,但多年以来国内并未有比较好的开源项目,不免心中可惜。
作者参考陆晓春版的CMinus编译器,制作完成了BY5编译程序。
这是本人的编译原理课程设计程序,现整理开源,以期抛砖引玉,帮助众多的编译器设计爱好者。
本程序据陆晓春的CMinus改编而来,特别感谢他的辛勤付出和无私的贡献,本着GNU 的原则,特公开本程序,供大家能够实现自己的编译程序。
《编译原理》设计方案报告
![《编译原理》设计方案报告](https://img.taocdn.com/s3/m/0b13a37c5627a5e9856a561252d380eb629423f3.png)
《编译原理》设计方案报告一、项目概述二、课程目标本课程的主要目标是使学生能够掌握编译器的设计与实现原理,理解编译过程中的各个环节,以及掌握常见的编译器构建工具和技术。
具体目标如下:1.理解编译器的基本原理和工作流程;2.掌握常见的编译器构建工具和技术;3.能够独立设计和实现简单的编译器;4.培养学生的系统设计和问题解决能力。
三、课程内容本课程的主要内容包括:1.编译器的概念和基本原理;2.词法分析器和语法分析器的设计与实现;3.语义分析和中间代码生成;4.优化和目标代码生成;5.编译器构建工具和技术。
四、教学方法本课程采用以学生为中心的教学方法,主要包括以下几种教学手段:1.模块化教学:将课程内容分为多个模块,每个模块进行独立的教学和实践;2.理论与实践相结合:通过理论课、实验课等形式,使学生能够将理论知识应用到实际中;3.项目驱动教学:引入编译器设计与实现的实际项目,让学生能够在实践中巩固所学的知识;4.小组合作学习:将学生分成小组,进行协作学习,增强学生的团队合作能力。
五、评价方式为了评价学生对课程内容的掌握程度,本课程采用以下评价方式:1.平时成绩:包括课堂表现、作业和实验成绩等;2.项目成果:针对编译器设计与实现的项目,评价学生的项目成果和实现质量;3.期末考试:以闭卷考试形式对学生的总体掌握情况进行评价。
六、项目进度安排本课程的项目进度安排如下:1.第1-2周:介绍编译器的概念和基本原理;2.第3-6周:词法分析器和语法分析器的设计与实现;3.第7-9周:语义分析和中间代码生成;4.第10-12周:优化和目标代码生成;5.第13-14周:编译器构建工具和技术;6.第15-16周:项目演示和总结。
七、教学资源支持为了支持本课程的教学,我们将提供以下教学资源:1.教材:选用经典的编译原理教材,如《编译原理》(龙书)等;2.课件:编写详细的课件,包括理论知识和实践案例;3.实验指导:编写实验指导书,引导学生进行编译器设计与实现的实践;4. 实验环境:提供编译器构建工具和开发环境,如Lex/Flex、Yacc/Bison等。
编译原理课程设计报告
![编译原理课程设计报告](https://img.taocdn.com/s3/m/10a9ab856bec0975f465e2fe.png)
编译技术课程设计——表达式的小型编译器专业:计算机1201学生姓名:贺茂纯指导教师:年轶完成时间:2015年7月2日一、目的 _________________________________________________ 1二、题目 _________________________________________________ 1三、要求 _________________________________________________ 11.词法分析___________________________________________ 12.语法分析___________________________________________ 13.代码生成___________________________________________ 24.错误处理___________________________________________ 2四、实验环境 _____________________________________________ 2五、系统实现 _____________________________________________ 21.词法分析___________________________________________ 22.语法分析___________________________________________ 43.中间代码___________________________________________ 64.错误处理___________________________________________ 8六、程序运行结果 _________________________________________ 91.准确的语句分析______________________________________ 92.错误的算术表达式___________________________________ 13七、总结 ________________________________________________ 16一、目的<<编译技术>>是理论与实践并重的课程,而其课程设计要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。
编译课程设计报告
![编译课程设计报告](https://img.taocdn.com/s3/m/aa8ebad982d049649b6648d7c1c708a1284a0aaa.png)
编译课程设计报告一、教学目标本课程的教学目标是使学生掌握编译原理的基本概念、方法和算法,培养学生运用编译原理解决实际问题的能力。
具体目标如下:1.知识目标:(1)了解编译原理的基本概念,如编译器、源语言、目标语言等。
(2)掌握编译过程中的各个阶段,如词法分析、语法分析、语义分析、中间代码生成、目标代码生成等。
(3)熟悉常见编译优化技术,如代码简化、死代码消除、循环优化等。
(4)了解编译器实现的基本方法,如递归下降分析、LL分析、LR分析等。
2.技能目标:(1)能够使用编译原理相关工具,如lex、yacc等。
(2)具备简单的编译器设计与实现能力。
(3)能够分析程序的性能,并应用编译优化技术进行优化。
3.情感态度价值观目标:(1)培养学生对编译原理的兴趣,提高学生自主学习的积极性。
(2)培养学生团队合作精神,提高学生解决实际问题的能力。
二、教学内容本课程的教学内容主要包括以下几个部分:1.编译原理基本概念:介绍编译器、源语言、目标语言等基本概念。
2.编译过程及其各个阶段:讲解词法分析、语法分析、语义分析、中间代码生成、目标代码生成等阶段。
3.编译优化技术:介绍代码简化、死代码消除、循环优化等优化技术。
4.编译器实现方法:讲解递归下降分析、LL分析、LR分析等实现方法。
5.编译器工具使用:介绍lex、yacc等工具的使用方法。
6.编译器设计与实现:讲解编译器的设计与实现过程。
三、教学方法本课程采用讲授法、讨论法、案例分析法和实验法等多种教学方法,以激发学生的学习兴趣和主动性。
1.讲授法:用于讲解编译原理的基本概念、方法和算法。
2.讨论法:学生针对编译原理中的重点、难点问题进行讨论,提高学生的理解能力。
3.案例分析法:通过分析实际案例,使学生更好地掌握编译原理的应用。
4.实验法:让学生亲自动手实现简单的编译器,提高学生的实践能力。
四、教学资源本课程的教学资源包括教材、参考书、多媒体资料和实验设备等。
1.教材:选用《编译原理》等权威教材,为学生提供系统、科学的学习资料。
编译原理实验报告
![编译原理实验报告](https://img.taocdn.com/s3/m/fb24dc875ff7ba0d4a7302768e9951e79a89694e.png)
编译原理实验报告一、实验目的编译原理是计算机科学中的一门重要课程,通过实验,旨在加深对编译原理相关理论知识的理解,提高实践动手能力和问题解决能力。
具体目标包括:1、熟悉编译程序的基本结构和工作流程。
2、掌握词法分析、语法分析、语义分析及中间代码生成等主要阶段的实现方法。
3、培养运用编程语言实现编译算法的能力。
二、实验环境本次实验使用的编程语言为_____,开发工具为_____,操作系统为_____。
三、实验内容(一)词法分析词法分析是编译过程的第一个阶段,其任务是从输入的源程序中识别出一个个单词符号。
使用正则表达式和有限自动机的理论,设计并实现了词法分析器。
首先,定义了单词的类别,如标识符、关键字、运算符、常量等。
然后,根据不同单词类别的特征,编写了相应的正则表达式模式。
在实现过程中,通过对输入的源程序进行逐字符扫描,利用正则表达式匹配来识别单词,并将其分类存储。
(二)语法分析语法分析是编译过程的核心部分,其目的是确定输入的单词序列是否符合给定的语法规则。
采用了自顶向下的递归下降分析法和自底向上的算符优先分析法。
对于递归下降分析法,根据语法规则编写了相应的递归函数。
每个函数处理一种语法结构,通过递归调用实现对整个语法的分析。
算符优先分析法则通过定义算符的优先级和结合性,构建算符优先关系表,然后依据表进行语法分析。
(三)语义分析语义分析阶段主要检查语法正确的句子是否具有实际的意义,并进行类型检查、语义计算等操作。
在实现中,通过构建符号表来记录变量的信息,包括名称、类型、作用域等。
同时,在语法分析的过程中,根据语义规则进行相应的检查和计算。
(四)中间代码生成中间代码生成是将源程序转换为一种便于优化和目标代码生成的中间表示形式。
选择了三地址码作为中间代码。
在生成中间代码时,根据语法分析和语义分析的结果,按照一定的规则将源程序转换为三地址码的形式。
四、实验步骤1、需求分析仔细研究实验要求,明确各个阶段的任务和目标,确定所需的数据结构和算法。
编译原理课设实验报告
![编译原理课设实验报告](https://img.taocdn.com/s3/m/9e35eb2fbc64783e0912a21614791711cc7979cf.png)
《编译技术》课程设计报告实验名称编译器设计学号班级本课设的任务是达成一个完好的编译器,办理用户提交的切合所定文法的源程序代码,生成四元式中间代码,从而翻译成等价的X86 平台上汇编语言的目标程序。
编译程序的工作过程区分为以下 5 个过程:词法剖析,语法剖析,语义剖析和中间代码生成,代码优化,目标代码生成。
此中,词法剖析阶段的基本任务是从以字符串表示的源程序中辨别出拥有独立意义的单词符号,并以二元组的形式输出,以作为语法剖析阶段的输入。
语法剖析阶段的基本任务是将词法剖析阶段产生的二元组作为输入,依据语言的语法例则,辨别出各样语法成分,并判断该单词符号序列是不是该语言的一个句子。
语义剖析的任务是第一对每种语法单位进行静态的语义审察,而后剖析其含义,并用另一种语言形式(本课设采纳四元式 ) 来描绘这类语义。
代码优化的任务是对前阶段产生的中间代码进行等价变换或改造,以期获取更为高效即省时间和空间的目标代码。
目标代码生成的任务是将中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码(本课设生成汇编指令代码)。
在词法剖析阶段,经过 DOS环境手动输入字符串序列(以’#’作为结束标记)作为带剖析的源程序,调用词法扫描子程序将字符串以二元组的形式输出(如有不属于该语言单词符号出现,则进行犯错办理),词法扫描子程序包含了对源程序的预办理(忽视多余空格、回车换行符等空白字符),以及对单词的辨别和分类,以形成(单词种别,单词自己的值)形式的二元组,并将用户自定义变量信息存入程序变量信息表。
在语法剖析阶段,采纳自上而下的递归降落剖析法,从文法的开始符号出发,依据文法例则正向推导出给定句子。
依据递归降落剖析函数编写规则来编写相应的函数,在各个函数的剖析过程中调用词法剖析程序中的扫描程序,发出“取下一个单词符号”的命令,以获得下一个单词符号作语法剖析。
单词符号词语字符法法字符串表示的源程序分分析析器器取一下个单词符号在语义剖析和中间代码生成阶段,采纳语法制导翻译法,使用属性文法为工具来描绘程序设计语言的语义。
编译原理课程设计报告(一个完整的编译器)
![编译原理课程设计报告(一个完整的编译器)](https://img.taocdn.com/s3/m/919d80cb76eeaeaad1f3307d.png)
编译原理程序设计报告一个简单文法的编译器的设计与实现专业班级:计算机1406班组长姓名:宋世波组长学号: ******** 指导教师:肖桐2016年12月设计分工组长学号及姓名:宋世波20143753 分工:文法及数据结构设计词法分析语法分析(LL1)基于DAG的中间代码优化部分目标代码生成组员1学号及姓名:黄润华20143740 分工:中间代码生成(LR0)部分目标代码生成组员2学号及姓名:孙何奇20143754 分工:符号表组织部分目标代码生成摘要编译器是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。
编译是从源代码(通常为高阶语言)到能直接被计算机或虚拟机执行的目标代码(通常为低阶语言或机器语言)的翻译过程。
一.编译器的概述1.编译器的概念编译器是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。
编译器将原始程序作为输入,翻译产生使用目标语言的等价程序。
源代码一般为高阶语言如Pascal、C++、Java 等,而目标语言则是汇编语言或目标机器的目标代码,有时也称作机器代码。
2.编译器的种类编译器可以生成用来在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码,这种编译器又叫做“本地”编译器。
另外,编译器也可以生成用来在其它平台上运行的目标代码,这种编译器又叫做交叉编译器。
交叉编译器在生成新的硬件平台时非常有用。
“源码到源码编译器”是指用一种高阶语言作为输入,输出也是高阶语言的编译器。
例如: 自动并行化编译器经常采用一种高阶语言作为输入,转换其中的代码,并用并行代码注释对它进行注释(如OpenMP)或者用语言构造进行注释(如FORTRAN的DOALL指令)。
3.本编译器概述编译程序的工作过程一般可以分为五个阶段:词法分析、语法分析、语义分析与中间代码产生、优化、目标代码生成。
每一个阶段在功能上是相对独立的,它一方面从上一个阶段获取分析的结果来进行分析,另一方面由将结果传递给下一个阶段。
编译原理教程实验报告
![编译原理教程实验报告](https://img.taocdn.com/s3/m/02243a6eb80d6c85ec3a87c24028915f804d84c4.png)
一、实验目的本次实验旨在使学生通过编译原理的学习,了解编译程序的设计原理及实现技术,掌握编译程序的各个阶段,并能将所学知识应用于实际编程中。
二、实验内容1. 词法分析2. 语法分析3. 语义分析4. 中间代码生成5. 代码优化6. 目标代码生成三、实验步骤1. 词法分析(1)设计词法分析器,识别输入源代码中的各种词法单元;(2)使用C语言实现词法分析器,并进行测试。
2. 语法分析(1)根据文法规则设计语法分析器,识别输入源代码的语法结构;(2)使用C语言实现语法分析器,并进行测试。
3. 语义分析(1)设计语义分析器,检查语法分析后的语法树,确保语义正确;(2)使用C语言实现语义分析器,并进行测试。
4. 中间代码生成(1)设计中间代码生成器,将语义分析后的语法树转换为中间代码;(2)使用C语言实现中间代码生成器,并进行测试。
5. 代码优化(1)设计代码优化器,对中间代码进行优化,提高程序性能;(2)使用C语言实现代码优化器,并进行测试。
6. 目标代码生成(1)设计目标代码生成器,将优化后的中间代码转换为特定目标机的汇编语言;(2)使用C语言实现目标代码生成器,并进行测试。
四、实验结果与分析1. 词法分析实验结果:成功识别输入源代码中的各种词法单元,包括标识符、关键字、运算符、常量等。
2. 语法分析实验结果:成功识别输入源代码的语法结构,包括表达式、语句、程序等。
3. 语义分析实验结果:成功检查语法分析后的语法树,确保语义正确。
4. 中间代码生成实验结果:成功将语义分析后的语法树转换为中间代码,为后续优化和目标代码生成提供基础。
5. 代码优化实验结果:成功对中间代码进行优化,提高程序性能。
6. 目标代码生成实验结果:成功将优化后的中间代码转换为特定目标机的汇编语言,为程序在目标机上运行做准备。
五、实验心得1. 编译原理是一门理论与实践相结合的课程,通过本次实验,我对编译程序的设计原理及实现技术有了更深入的了解。
编译原理课程设计报告
![编译原理课程设计报告](https://img.taocdn.com/s3/m/ee4d3979ee06eff9aef807dc.png)
编译原理课程设计报告编译原理课程设计——简单编译器的设计与实现班级:组长:组员:指导教师:设计时间: 12月摘要....................................... 错误!未定义书签。
1.概述 ..................................... 错误!未定义书签。
2.课程设计任务及要求 ....................... 错误!未定义书签。
2.1 设计任务............................ 错误!未定义书签。
2.2 设计要求............................ 错误!未定义书签。
3.算法及数据结构 ........................... 错误!未定义书签。
3.1算法的总体思想(流程)............... 错误!未定义书签。
3.2词法分析模块......................... 错误!未定义书签。
3.2.1功能........................... 错误!未定义书签。
3.2.2数据结构 ....................... 错误!未定义书签。
3.2.3算法........................... 错误!未定义书签。
3.3语法分析(含语义分析和中间代码生成)模块错误!未定义书签。
3.3.1功能........................... 错误!未定义书签。
3.3.2数据结构 ....................... 错误!未定义书签。
3.3.3算法........................... 错误!未定义书签。
3.4中间代码优化模块..................... 错误!未定义书签。
3.4.1功能........................... 错误!未定义书签。
3.4.2数据结构 ....................... 错误!未定义书签。
编译原理课程设计报告模板-推荐下载
![编译原理课程设计报告模板-推荐下载](https://img.taocdn.com/s3/m/3527d626cc7931b765ce1590.png)
用 MFC 编写一个可视化的 MiniC 编译器,要求界面美观,使用方便,能够实现自定义 MiniC 语言的编译。 支持的语句和运算: (1)数据类型:int,char,void,float (2)语句:赋值(=),if, while,for (3)数学运算:+,-,*,/ (4)关系运算:==,>,<,>=,<=,!= (5)逻辑运算:&&,||,! (6)支持函数的定义、调用 (7)支持复合语句,即 {} 包含的语句 (8)注释: C 类型的多行注释 /* */ 和 C++ 类型的单行注释 //
目录
1 课程设计目的 ...........................................................................................1
2 课程设计内容 ...........................................................................................1
5 系统设计与实现 .......................................................................................8
5.1 BY13 编译器的主要功能模块....................................................................................................8 5.2 词法分析子程序 ..........................................................................................................................8 5.3 语法语义分析子程序 ..................................................................................................................8
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、设计目的研究、改进或自行设计、开发一个简单的编译程序或其部分功能,加深对编译理论和编译过程的理解。
编程语言不限。
二、设计任务扩展 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)程序结尾丢了句号。
(10)语句之间漏了;(11)call后应为标识符(12)赋值语句中,赋值号左部标识符属性应是变量(13)赋值号左部标识符属性应是赋值号(14)程序体内语句部分的后跟符不正确(15)call后标识符属性应为过程(16)条件语句中丢了then(17)丢了end或;(18)while循环语句中丢了do(19)语句后的符号不正确6.名字表结构struct tablestruct{char name[al];enum object kind;int val;int level;int adr;int size;//扩充名字表结构,增加一个data域保存数组的下界int data; /* 其他数据,对arrays来说是下界*/} 7.语法描述图:图3 程序语法描述图图4 分程序语法描述图图5 语句语法描述图图6条件语法描述图图7 表达式语法描述图图8 项语法描述图图9 因子语法描述图四、功能扩充1.语句处理中加入for循环语句if(sym == forsym){getsymdo;if(sym != lparen) error(34);//没有左括号出错else {getsymdo;statementdo(nxtlev, ptx, lev); //S1代码if(sym != semicolon) error(10); //语句缺少分号出错else{cx1=cx;getsymdo;conditiondo(nxtlev, ptx, lev); //E代码if(sym!=semicolon)error(10);//语句缺少分号出错else {cx2=cx;gendo(jpc,0,0);cx3=cx;gendo(jmp,0,0);getsymdo;cx4=cx;statementdo(nxtlev, ptx, lev); //S2代码if(sym != rparen) error(22);//缺少右括号出错else {gendo(jmp,0,cx1);getsymdo;cx5=cx;statementdo(nxtlev, ptx, lev); //S3代码code[cx3].a=cx5;gendo(jmp,0,cx4);code[cx2].a=cx;} } } } }2.在语句处理中增加repeat-until语句if(sym == repeatsym){cx1 = cx;getsymdo;statementdo(nxtlev, ptx, lev);if(sym == untilsym){getsymdo;conditiondo(nxtlev, ptx, lev);cx2=cx;gendo(jpc, 0, 0);code[cx2].a=cx1; }else error(33); //没有写until出错} }3.扩充++和—运算符对于++和--运算符,扩充时要注意存在两个情况:1)作为语句的时候;2)作为表达式中的因子的时候。
注意:扩充时增加因子开始符facbegsys[incs]=true和facbegsys[decs]=true。
扩充的语法描述见结构设计中的PL/0分程序和主要语句的语法描述中的描述图,详细代码见程序。
1)作为语句的时候,有四种情况:a++; a--; ++a; --a;文法的EBNF表示形式为:<自增自减语句>::=<标识符>[++ |--]|[++|-- ]<标识符>文法分析过程大体如下图:++a 和—a a++和a —生成中间代码对于a++;++a;和a--;--a;语句的处理如下:先将变量的值取出放在栈顶,后将1入栈,后执行加法或减法运算oprv 指令的2(加法)、3(减法),后将运算后的栈顶值存回变量。
a++;和++a;语句的中间代码:lod 0 3;lit 0 1;opr 0 2;sto 0 3;a--;和--a;语句的中间代码:lod 0 3;lit 0 1;opr 0 3;sto 0 3;2)作为因子的时候,有两种情况:a++和a--作为因子,比如:b:=a++*a--;语句++a 和--a 作为因子,比如:b:=--a+2*++a;语句文法的EBNF 表示形式为:<表达式>::=...[ ++|--]<标识符>|<标识符>[++| --]...其中的...表示前后都可以有其他的项或因子生成中间代码A 对于因子++a 和--a 的中间代码生成处理和a++;等语句处理一样;B 对于因子a++和a —的中间代码生成处理如下:a++:lod 0 3;lit 0 1;opr 0 2;sto 0 3;lod 0 3;lit 0 1;opr 0 3;a--:lod 0 3;lit 0 1;opr 0 3;sto 0 3;lod 0 3;lit 0 1;opr 0 2;先将变量的值取出放在栈顶,后将1入栈,后执行加法或减法运算opr 指令的2(加法)、3(减法),后将运算后的栈顶值存回变量,后将变量的值又取出来放入栈顶,后将1入栈,如果是a++就执行减法,如果是a —就执行加法,以实现先用a 的值后再加1。
4.语句处理中加入if-then-else 语句在原有程序if(sym==then){...}后加入下列代码:cx1 = cx;gendo(jpc, 0, 0);statementdo(fsys, ptx, lev);if(sym == elsesym){getsymdo;cx2 = cx;gendo(jmp, 0, 0);code[cx1].a = cx;statementdo(fsys, ptx, lev);code[cx2].a = cx;}elsecode[cx1].a = cx;5.修改不等号#为!=注释源程序中的ssym['#'] = neq语句,在getsym中加入下列代码://修改不等号为!=else if(ch=='!'){getchdo;if(ch=='='){sym=neq;getchdo; }else sym=nul; }6.加入对一维数组的支持本程序将数组看做变量的一种,由var声明函数调用array声明函数完成数组声明,这样就处加入文件输出的相关语句外,可以完全保留block 函数和enter函数;通过改写factor函数使数组因子包括了后缀的索引号,这样就可以调用通用的表达式函数赋值数组了。