本科毕业设计论文--编译原理课程设计报告

合集下载

编译原理课设报告

编译原理课设报告

课程设计报告课程名称编译原理课程设计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)文法。

编译原理课程设计报告

编译原理课程设计报告

《编译原理》课程设计报告一、课程设计目的通过课程设计进一步理解高级语言在计算机中的执行过程,了解现代编译器的运作机制,加深对编译原理中重点算法和编译技术的理解,提高自己自学和理解的能力。

学会如何利用已有软件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 的信息,语法阶段生成的语法树,另外对于词法和语法阶段出现的错误在“错误提示”文本框中一一列举出来,提供用户改进代码的信息。

编译原理课程设计报告

编译原理课程设计报告

课程设计报告( 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所示。

编译原理课程设计报告报告

编译原理课程设计报告报告

编译原理课程设计报告一、目的与要求目的:在分析理解一个教学型编译程序(如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]; /* 名字表*/②运行时存储组织和管理由于编译时目标程序运行的数据空间大小已经规定,所以存储组织属于静态存储。

编译原理课程设计 报告 论文

编译原理课程设计 报告 论文

目录1 前言 (1)2 报告主体 (1)2.1 设计目的: (1)2.2设计内容及要求: (1)2.2.1 设计符号表 (1)2.2.2 设计词法分析器 (1)2.2.3 语法分析与中间代码产生器 (2)2.2.4 优化器(选做) (2)2.2.5目标代码生成器(选做) (2)2.2.6 测试范例: (2)2.3 实现原理 (3)2.3.1 符号表的设计 (3)2.3.2 词法分析器的设计 (4)2.3.3 语法/语义分析 (5)2.4 算法实现流程图 (8)2.5 测试数据 (17)2.6结果输出及分析 (19)2.7 软件运行环境及限制 (28)2.8 心得体会 (29)2.9参考文献 (30)3 结论 (30)1 前言在网络世界中,我们往往对功能强大的程序叹为观止。

而这些强大程序的背后是编译这些程序的编译软件,是这些编译软件承托起了这些功能强大的运行程序。

我们有不少的同志致其自身于无尽的运行程序上。

而只有很少的人搞编译程序。

这就是为什么中国的可运行程序满天飞,而编译程序却很少。

本课程设计就是在这方面的探索,为你解读编译程序的奥秘。

课程设计题目选择9个题目中的一个,要求根据自己的兴趣和能力,选择一个对自己意义甚大的题目。

课程设计基本原理是在实践上,实现我们在课程上学习到的理论知识。

通过理论联系实践,更好的掌握课本上的理论知识。

2 报告主体2.1设计目的:本次课程设计是作一个集词法分析、语法分析、语义分析和中间代码生成于一体的编译器,它集中了《编译原理》里的几乎所有的思想。

不但加深了学生对编译方法的理解,而且能对学生的编程能力起到进一步提高的作用,培养学生的程序设计风格。

通过某种可视化编程语言的应用,具备初步的Windows环境下的编程思想。

2.2设计内容及要求:2.2.1 设计符号表确定符号表的组织方式,一般应包括名字栏和信息栏,其中名字栏作为关键字。

要考虑能够存储有关名字的信息,并可以高效地完成如下操作:1.查找:根据给定的名字,在符号表中查找其信息。

编译原理课程设计论文

编译原理课程设计论文

编译原理课程设计论文一、教学目标本课程的教学目标是使学生掌握编译原理的基本概念、理论和方法,培养学生运用编译原理解决实际问题的能力。

具体分为以下三个维度:1.知识目标:学生需要掌握编译原理的基本概念、词法分析、语法分析、中间代码生成、代码优化和目标代码生成等核心技术。

2.技能目标:学生能够运用编译原理的方法和技巧,独立完成编译器的设计与实现。

3.情感态度价值观目标:通过本课程的学习,学生能够了解编译原理在软件开发和计算机科学中的重要性,培养对编译技术的兴趣和热情。

二、教学内容根据课程目标,本课程的教学内容主要包括以下几个部分:1.编译原理概述:介绍编译器的功能、编译过程和编译器的分类。

2.词法分析:讲解词法分析的基本概念、词法分析器的实现方法以及词法分析在编译器中的作用。

3.语法分析:介绍语法分析的基本方法、语法分析树的构建以及分析器的实现。

4.中间代码生成:讲解中间代码的概念、生成方法以及中间代码的作用。

5.代码优化:介绍代码优化的基本方法和策略,以及优化在编译器中的重要性。

6.目标代码生成:讲解目标代码生成的方法和技术,以及目标代码生成在编译器实现中的地位。

三、教学方法为了提高教学效果,本课程将采用多种教学方法相结合的方式进行授课:1.讲授法:通过讲解编译原理的基本概念、理论和方法,使学生掌握编译原理的核心知识。

2.讨论法:学生进行课堂讨论,激发学生的思考,培养学生的创新能力和团队合作精神。

3.案例分析法:分析典型的编译器实例,使学生更好地理解编译原理在实际应用中的作用。

4.实验法:安排学生进行编译器设计的实验,提高学生的实际操作能力和解决问题的能力。

四、教学资源为了支持本课程的教学,我们将准备以下教学资源:1.教材:《编译原理》(第三版),作者:Alfred V. Aho、Monica S.Lam、Ravi Sethi、Jeffrey D. Ullman。

2.参考书:《编译原理与实践》,作者:Peyton J. Publications。

编译原理课程设计报告

编译原理课程设计报告

《编译原理》课程设计报告姓名:熊齐超(1208060220)姓名:刘畅(1208060221)姓名:袁青伟(1208060222)姓名:张文(1208060223)班级:软件121班专业:软件工程指导教师:陈晓明时间:2015/6/14项目名称:算术表达式的语法及语义分析贵州大学计算机科学与信息学院目录一、课程设计目的 (3)二、课程设计题目描述和要求 (3)1、算术表达式的文法的描述: (3)2、课程设计的要求描述: (3)3、实现的功能描述: (4)4、分析器的使用描述 (4)三、课程设计实现描述 (4)1、实现平台 (4)2、课程设计的基本思路描述 (5)3、自顶向下与递归下降分析方法的基本原理描述 (5)4、程序运行的最后界面 (6)5、演示分析 (8)四、课程设计总结 (8)五、参考文献及小组分工 (9)六、核心代码 (10)一、课程设计目的通过设计、编制、调试一个算术表达式的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。

加深对文法分析器的知识的掌握,掌握计算机语言的语法分析的过程。

以及掌握计算机语言的语法分析程序设计与文法应用的实现方法。

能够熟练运用一种分析方法,自上而下或自下而上的方法分析一个给定的文法,我使用的是自上而下的分析方法。

以及通过思考以及动手制作分析器的过程来锻炼自己的编程能力和逻辑思维能力,体会计算机编译器的奥妙之处。

二、课程设计题目描述和要求1、算术表达式的文法的描述:〈无符号整数〉∷=〈数字〉{〈数字〉}〈标识符〉∷=〈字母〉{〈字母〉|〈数字〉}〈表达式〉∷=〈项〉{〈加法运算符〉〈项〉}〈项〉∷=〈因子〉{〈乘法运算符〉〈因子〉}〈因子〉∷=〈标志符〉|〈无符号整数〉〈加法运算符〉∷=+|-〈乘法运算符〉∷=*|/〈字母〉∷= a | b | … | z〈数字〉∷= 0 | 1 | … | 92、课程设计的要求描述:1)在递归下降法、LL(1)、算符优先分析法或者LR法中选择其中一种方法完成以上任务,中间代码选用四元式。

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

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

《编译原理》课程设计报告设计题目: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、符号表的组织符号表的组织方式有:线性表、散列表、树结构等,其必须维持源程序中的作用域信息。

编译原理课程设计报告毕业论文

编译原理课程设计报告毕业论文

编译原理课程设计报告一、课程设计目的通过课程设计,可以进一步了解高级语言在计算机中的执行过程,了解现代编译器的运行机制,加深对编译原理中关键算法和编译技术的理解,提高自学和理解能力。

了解如何利用现有软件JFLex和Java_cup构造词法分析器和解析器。

二、设计概述这个tiger语言编译器的编译过程涉及到编译五个阶段中的两个,即词法分析器和语法分析器。

其中,解析后完成语法树打印的构建,以检查类型。

词法分析器由JFLex 编译器正则公式生成,词法分析器由编译器产生式生成,解析器由CUP生成。

结果通过GUI界面呈现给用户。

编译器需要对源程序进行单词级的分析和翻译,所以首先要做的就是识别单词,而词法分析的任务就是从左到右扫描源程序的字符串,根据词法规则(常规语法规则)识别出正确的单词,并转换成单词对应的二进制形式(类别码,属性值)进行语法分析。

所以词法分析是编译的基础。

执行词法分析的程序叫做词法分析器。

语法分析是编译器的核心部分。

它的主要任务是确定语法结构,检查语法错误,报告错误的性质和位置,并进行适当的纠错。

三、设计程序(一)设计构思该程序主要完成三个功能模块:词法分析器、语法分析器和GUI人机界面。

词法分析器由JFLex编译正则公式生成,其中必须为外界提供一个获取令牌流的接口。

实验中命名为Java _ cup . runtime . symbol next _ token。

解析器是建立在词法分析器上的,所以它必须包含词法分析器来获取令牌流。

next_token为解析器提供了令牌。

解析器的对外接口是:Java _ cup . runtime . symbol debug _ parse(),它返回语法树的根节点。

GUI 提供人机交互。

它可以顺序显示词法分析阶段获得的所有标记信息和语法阶段生成的语法树。

此外,词法和语法阶段的错误会在“错误提示”文本框中列出,为用户提供改进代码的信息。

流程图:鲍·阿布辛Print.java//打印出语法树……//Tiger 的抽象语法类数据包错误消息ErrorMsg.java//用于生成包含详细信息的错误消息为cupparser 打包Java _ cup.runtime//support包解析Grm.java//解析分析器MainInterface.java//图形用户界面Sym.java//令牌的十进制表示Yylex.java//莱克斯分析器包装语义Entry.java//用于值环境中的绑定Env.java//保存一个值、类型环境和一个错误打印机ExpTy.java//持有翻译和类型检查的结果FunEntry.java//用于函数绑定程序输入流 词法分析程序 GUI 界面句法分析程序 代币 语法树 标记流 错误的语法和类词汇错误Semant.java//主类型检查模块VarEntry.java//用于变量绑定包装符号Symbol.java//使字符串成为独特的符号对象Table.java//用示波器做环境包翻译包类型//描述tiger _ languagetypes(二)词法分析程序这部分工作主要是通过正则表达式的编写,熟悉使用JFLex正确编写正则表达式,并生成相应的词法分析器。

本科毕业设计论文--编译原理课程设计报告

本科毕业设计论文--编译原理课程设计报告

燕山大学《编译原理课程设计》题目:《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。

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

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

《编译原理》设计方案报告一、项目概述二、课程目标本课程的主要目标是使学生能够掌握编译器的设计与实现原理,理解编译过程中的各个环节,以及掌握常见的编译器构建工具和技术。

具体目标如下: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等。

编译原理课程设计报告

编译原理课程设计报告

编译技术课程设计——表达式的小型编译器专业:计算机1201学生姓名:贺茂纯指导教师:年轶完成时间:2015年7月2日一、目的 _________________________________________________ 1二、题目 _________________________________________________ 1三、要求 _________________________________________________ 11.词法分析___________________________________________ 12.语法分析___________________________________________ 13.代码生成___________________________________________ 24.错误处理___________________________________________ 2四、实验环境 _____________________________________________ 2五、系统实现 _____________________________________________ 21.词法分析___________________________________________ 22.语法分析___________________________________________ 43.中间代码___________________________________________ 64.错误处理___________________________________________ 8六、程序运行结果 _________________________________________ 91.准确的语句分析______________________________________ 92.错误的算术表达式___________________________________ 13七、总结 ________________________________________________ 16一、目的<<编译技术>>是理论与实践并重的课程,而其课程设计要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。

编译原理课程设计报告(一个完整的编译器)

编译原理课程设计报告(一个完整的编译器)

编译原理程序设计报告一个简单文法的编译器的设计与实现专业班级:计算机1406班组长姓名:宋世波组长学号: ******** 指导教师:肖桐2016年12月设计分工组长学号及姓名:宋世波20143753 分工:文法及数据结构设计词法分析语法分析(LL1)基于DAG的中间代码优化部分目标代码生成组员1学号及姓名:黄润华20143740 分工:中间代码生成(LR0)部分目标代码生成组员2学号及姓名:孙何奇20143754 分工:符号表组织部分目标代码生成摘要编译器是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。

编译是从源代码(通常为高阶语言)到能直接被计算机或虚拟机执行的目标代码(通常为低阶语言或机器语言)的翻译过程。

一.编译器的概述1.编译器的概念编译器是将便于人编写,阅读,维护的高级计算机语言翻译为计算机能解读、运行的低阶机器语言的程序。

编译器将原始程序作为输入,翻译产生使用目标语言的等价程序。

源代码一般为高阶语言如Pascal、C++、Java 等,而目标语言则是汇编语言或目标机器的目标代码,有时也称作机器代码。

2.编译器的种类编译器可以生成用来在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码,这种编译器又叫做“本地”编译器。

另外,编译器也可以生成用来在其它平台上运行的目标代码,这种编译器又叫做交叉编译器。

交叉编译器在生成新的硬件平台时非常有用。

“源码到源码编译器”是指用一种高阶语言作为输入,输出也是高阶语言的编译器。

例如: 自动并行化编译器经常采用一种高阶语言作为输入,转换其中的代码,并用并行代码注释对它进行注释(如OpenMP)或者用语言构造进行注释(如FORTRAN的DOALL指令)。

3.本编译器概述编译程序的工作过程一般可以分为五个阶段:词法分析、语法分析、语义分析与中间代码产生、优化、目标代码生成。

每一个阶段在功能上是相对独立的,它一方面从上一个阶段获取分析的结果来进行分析,另一方面由将结果传递给下一个阶段。

毕业论文-编译原理课程设计报告c-语言词法与语法分析器的实现

毕业论文-编译原理课程设计报告c-语言词法与语法分析器的实现

编译原理课程设计报告课题名称:编译原理课程设计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.语法分析语法分析采用递归下降分析。

递归下降法是语法分析中最易懂的一种方法。

它的主要原理是,对每个非终结符按其产生式结构构造相应语法分析子程序,其中终结符产生匹配命令,而非终结符则产生过程调用命令。

编译原理课程设计报告

编译原理课程设计报告

编译原理课程设计报告编译原理课程设计——简单编译器的设计与实现班级:组长:组员:指导教师:设计时间: 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数据结构 ....................... 错误!未定义书签。

编译原理课程设计报告(曹亮)

编译原理课程设计报告(曹亮)

淮阴工学院编译原理课程设计报告选题名称:算符优先分析法系(院):计算机工程学院专业:计算机科学与技术班级:计算机1083班姓名:曹亮学号:1081301301指导教师:杨荣根陈剑洪学年学期:2010 ~ 2011 学年第 1 学期2011年01 月07 日设计任务书指导教师(签章):年月日摘要:编译原理是计算机科学与技术专业最重要的一门专业基础课程,内容庞大,涉及面广,知识点多。

由于该课程教、学难度都非常大,往往费了大量时间而达不到预期教学效果俗语说:学习的最好方法是实践。

本次课程设计的目的正是基于此,力求为学生提供一个理论联系实际的机会,通过布置一定难度的课题,要求学生独立完成。

我们这次课程设计的主要任务是编程实现对输入合法的算符优先文法的相应的字符串进行算符优先分析,并输出算符优先分析的过程。

算符优先分析法特别有利于表达式的处理,宜于手工实现。

算符优先分析过程是自下而上的归约过程,但这种归约未必是严格的规范归约。

而在整个归约过程中,起决定作用的是相继连个终结符之间的优先关系。

因此,所谓算符优先分析法就是定义算符之间的某种优先关系,并借助这种关系寻找句型的最左素短语进行归约。

通过实践,建立系统设计的整体思想,锻炼编写程序、调试程序的能力,学习文档编写规范,培养独立学习、吸取他人经验、探索前言知识的习惯,树立团队协作精神。

同时,课程设计可以充分弥补课堂教学及普通实验中知识深度与广度有限的缺陷,更好地帮助学生从全局角度把握课程体系。

关键字:编译原理;算符优先分析;最左素短语目录1 课题综述 (1)1.1 课题来源 (1)1.2 课题意义 (1)1.3 预期目标 (1)1.4 面对的问题 (1)1.5 需解决的关键技术 (1)2 系统分析 (2)2.1 基础知识 (2)2.2 解决问题的基本思路 (5)2.3 总体方案 (5)3 系统设计 (6)3.1 算法实现 (6)3.2 流程图 (7)4 代码编写 (8)5 程序调试 (14)6 运行与测试 (14)总结 (16)致谢 (17)参考文献 (18)1 课题综述1.1 课题来源算符文法:即它的任一产生式的右部都不含两个相继的非终结符的文法。

编译原理毕业课程设计报告

编译原理毕业课程设计报告

(此文档为word格式,下载后您可任意编辑修改!) 编译原理课程设计报告一、分析通过设计,编制,调试一个语法及语义分析程序,加深对语法及语义分析原理的理解。

IF 〈布尔表达式〉THEN 〈赋值语句〉ELSE 〈赋值语句〉其中(1)、可以选择递归下降法、LL(1)、算符优先分析法、LR法完成以上任务,中间代码选用四元式。

(2)、写出符合分析方法要求的文法,给出分析方法的思想,完成分析程序设计。

(3)、编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。

二、算法设计程序要求有三部分组成,即词法分析、语法分析、以及语义分析。

其中词法分析部分要求完成对输入程序的关键字、标识符、常数、运算符进行识别;并分析词法分析的结果,检查程序输入的关键字是否为符合设计文法的关键字,检查标志符是否是合法标志符,识别运算符的种类。

语法分析部分主要是以算符优先文法的设计思想和步骤完成对词法分析结果的的语法分析工作,判断输入的程序是否符合设计的IF-THEN-ELSE文法。

在语法分析通过的基础上进行语义分析,其主要任务是完成对语法分析后的程序的语义分析,根据语法制导翻译去翻译输入的程序,从而得到程序的中间代码表示形式——四元式。

词法分析、语法分析和语义分析的流程图如下:(1)词法分析A 词法分析器的功能和输出形式输入:所给文法的源程序字符串输出:二元组(单词种别,单词符号的属性值)构成的序列B. 待分析的简单语言的词法因为是模拟简单编译器, 所以就以C语言的小型子集作为模拟编译器的词法.模拟程序语言的单词符号可分为下列五种;关键字: { (相当于Pascal语言中的begin) , if ,else , while , }(相当于Pascal语言中的end ) 所有的关键字都是小写字母 .运算符: + , - , * , , = , < , <= , == , > , >= ,<> , && ,|| , !界符: 逗号 ,分号 ,左圆括号 , 右圆括号 , #常数: 在这里只涉及到int型常量其他单词是标识符(ID)和整形常数(NUM),通过以下正规式定义:ID = letter(letter|digit)*NUM = digit digit *空格由空白,制表符和换行符组成,空格一般用来分隔ID,NUM,运算符,界符和关键字,词法分析阶段通常会被过滤掉。

《编译原理》设计报告

《编译原理》设计报告

表达式计算器这是一款算术表达式计算器,用户通过输入算术表达式达到计算的目的,可代替目前普遍使用的计算器。

一、需求分析需求分析的目标是描述系统应做什么,并使得开发人员和用户就该描述达成共识。

需求分析的任务是找出系统的所有需求并加以描述,同时建立模型。

因此,开发任何一个合格的软件系统,都必须经过需求分析,这样才能使设计出来的软件满足用户的要求,并且解决目标系统“做什么”的问题。

下面是本人对所设计的表达式计算器进行的需求分析。

1、程序的设计要求和功能要求(1)设计要求:①用户从键盘输入算术表达式后,须以#号结束输入,然后按回车键进行计算。

②输入负数时,要用(0-正数)来表示。

③用户能重复多次的使用此计算器进行计算。

(2)功能要求:①能分析、计算任何包括加、减、乘、除、指数、对数、三角函数和括号的数学表达式。

②能得到正确的计算结果。

③能够对错误的计算表达式做出判断,并给出出错原因。

2、程序的各个模块功能描述(1)初始化运算符栈函数(initStackOPTR):对运算符栈OPTR进行初始化工作。

(2)初始化操作数栈函数(initStackOPND):对操作数栈OPND进行初始化工作。

(3)进运算符栈函数(pushOPTR):把输入的运算符按要求压入运算符栈OPTR。

(4)进操作数栈函数(pushOPND):把输入的操作数按要求压如操作数栈OPND。

(5)出运算符栈函数(popOPTR):把栈顶的运算符按要求弹出运算符栈OPTR。

(6)出操作数栈函数(popOPND):把栈顶的操作数按要求弹出运算符栈OPND。

(7)返回运算符栈的栈顶元素函数(getTopOPTR):得到运算符栈OPTR的栈顶元素,但是并不改变栈本身。

(8)返回操作数栈的栈顶元素函数(getTopOPND):得到运算符栈OPND的栈顶元素,但是并不改变栈本身。

(9)判断操作数栈是否为空函数(stackEmptyOPND):若栈为空,函数返回值为1,若栈不为空,函数返回值为0。

编译原理课程设计报告

编译原理课程设计报告

LL(1) 语法分析器一、课程设计的目的通过课程设计进一步理解高级语言在计算机中的执行过程,加深对编译原理中重点算法和编译技术的理解,提高自己的编程能力,培养好的程序设计风格。

同时通过某种可视化编程语言的应用,具备初步的Windows环境下的编程思想。

解和掌握LL(1)语法分析方法的基本原理;根据给出的LL(1)文法,掌握LL(1)分析表的构造及分析过程的实现。

二、课程设计的要求及其方法语法分析程序要求实现sample语言中几种最常见的、基本的语法单位的分析:算术表达式,逻辑表达式,赋值语句,if语句,for语句,while语句,repeat 语句等,各个语法单位的定义如下:Sample语言的定义<字符>::=<字母>|<数字>|<界符><字母>::=a|b|c…|z|A|B|C…|Z<数字>::=0|1|2|3…|9<单界符>::=+|-|*|/|=|<|>|(|)|[|]|:\;|,|’|_|.单词集的定义(1) <单词集>::=<保留字>|<双界符>|<标识符>|<常数>|<单界符>(2) <保留字>::=and|array|begin|bool|call|case|case|char|const|do|dlse|end|false|for|if|input|integer|not |of|or|output|program|read|real|repeat|set|then|to|true|until|var|while|write(3)<双界符>::=/*|*/|<=|>=|<>|:=(4)<标识符>::=<字母>|<标识符><数字>|<标符><字母>(5)<常数>::=<整数>|<布尔常数>|<字符常数>|常数标识符>|<实数>(6)<整数>::=<数字>|<整数><数字>(7)<布尔常数>::=true|false(8)<字符常数>::=’除’以外的任意字符串’(9)<常数标识符>::=<标识符>(10)<实数>::=<整数>.<整数>数据类型的定义(1)<简单类型>:==integer|bool|char|real表达式的定义(1)<表达式>::=<算术表达式>|<逻辑表达式>(2)<算术表达式>::=<项>+-<算术表达式>|+-<项>|<项>(3)<项>:==<项>*<因子>|<项>/<因子>|<因子>(4)<因子>::=<算术量>(5)<算术量>::=<标识符>|<整数>(6)<逻辑表达式>::=<布尔项>or<逻辑表达式>|<布尔项>(7)<布尔项>::=<布尔因子>and<布尔项>|<布尔因子>(8)<布尔因子>::=<布尔量>|not<布尔因子>(9)<布尔量>::=<逻辑表达式>|<布尔常数>|<标识符>|<算术表达式><关系符><算术表达式>(10)<关系符>::=<|>|<>|<=|>=|=语句的定义(1)<语句>::=<说明语句>|<执行语句>(2)<说明语句>::=<常数说明><变量说明>(3)<常量说明>::=const<常数定义>|ε(4)<常数定义>::=标识符=<常数>;<常数定义>|标识符=<常数>;<变量说明>::=var<变量定义>|ε<变量定义>::=<标识符表>:<类型>;|<标识符表>:<类型>;<变量定义><标识符表>::=<标识符>,<标识符表>|<标识符><执行语句>::=<简单句>|<结构句><简单句>::=<赋值句><赋值句>::=<变量>:=<表达式><变量>::=<标识符><结构语句>::=<复合句>|<if语句>|<while语句>|<for语句>|<repeat语句><复合句>::=begin<语句表>end<语句表>::=<执行句>;<语句表>|<执行句><if语句>::=if<布尔表达式>then<执行句><if语句>::=if<布尔表达式>then<执行句1>else<执行句2><while语句>::=while<布尔表达式>do<执行句><for语句>::=for<标识符>::=<算术表达式1>to<算术表达式2>do<执行句> <repeat语句>::=repeat<执行句>until<布尔表达式>程序定义(1)<程序>::=program<标识符>;<分程序>(2)<分程序>::=<常量说明><变量说明><复合句>本次语法分析器课程设计采用LL(1)自顶向下析法来实现。

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

燕山大学《编译原理课程设计》题目:《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。

int getch()说明:读取字符函数,返回字符。

int getsym()说明:读取下一单词符号int position(char* idt,int tx);说明:字符在符号表中位置查询函数返回值:返回标识符在符号表中的索引int gen(enum fct x,int y,int z);说明:生成P代码指令int test(bool* s1,bool* s2,int n);说明:测试当前符号是否合法,若不合法,打印出错信息并进行跳读void enter(enum object k, int* ptx,int lev,int* pdx);说明:在符号表中登录分程序说明部分出现的名字int constdeclaration(int* ptx,int lev,int* pdx);说明:处理常量说明,并将常量名及相应信息填入符号表int vardeclaration(int* ptx,int lev,int* pdx);说明:处理变量说明,并将变量名及相应信息填入符号表int statement(bool* fsys,int* ptx,int lev);说明:分析处理各种语句int condition(bool* fsys,int* ptx,int lev);说明:分析处理条件式返回值:由参数x返回求值结果的类型void listcode(int cx0);说明:打印P代码int block(int lev,int tx,bool* fsys);说明:PL0编译器对外的接口,由main()调用void interpret();说明:解释执行P代码int base(int l,int* s,int b);说明:基地址处理函数返回值:返回变量的基地址值int expression(bool* fsys,int* ptx,int lev)说明:表达式处理,由参数返回结果类型int term(bool* fsys,int* ptx,int lev);说明:项处理,由参数返回结果类型int factor(bool* fsys,int* ptx,int lev);说明:因子处理,由参数返回结果类型int inset(int e,bool* s);int addset(bool* sr,bool* s1,bool*s2,int n);int subset(bool* sr,bool* s1,bool*s2,int n);int mulset(bool* sr,bool* s1,bool*s2,int n);说明:使用数组实现集合的集合运算算法描述:在原算法基础上我进行了一下修改1.增加单词:保留字ELSE2.运算符+=,-=,++,――3.增加条件语句的ELSE子句为此添加了ELSESYM,为了实现如上要求的扩充,必须再正确地添加JIAJIA,JIANJIAN,JIADENG,JIANDENG等几个个SYMBOL,具体必须包括以下三个方面的修改或添加:在枚举变量SYMBOL的定义内添加JIAJIA,JIANJIAN,JIADENG,JIANDENG和ELSESYM;然后在在源程序文件中加上保留字ELSE,为了识别例如A:=++A之类的功能,还需在因子开始符号中加入JIAJIA,JIANJIAN。

这样,我们就正确地加入了五个将用来作为扩充语言功能的SYM。

为了实现功能首先需要在词法分析中加入识别单词功能增加JIAJIA(++)、JIADENG(+=)、JIANJIAN(——)、JIANDENG(—=)的词法分析,代码修改如下:if(ch=='+'){getchdo;if(ch=='='){sym=jiadeng;getchdo;}else{if(ch=='+'){sym=jiajia;getchdo;}else{sym=plus;}}}else{if(ch=='-'){getchdo;if(ch=='='){sym=jiandeng;getchdo;}else{if(ch=='-'){sym=jianjian;getchdo;}else{sym=minus;}}}这样,我们就完成了对词法分析器的修改。

然后JIAJIA.,JIANJIAN操作的语法图有如下两个:语句因子根据以上语法图,我们只要对语句处理程序和因子处理程序进行修改添加,即可实现增加INC和DEC操作,首先对语句处理程序进行如下修改:语句中形如++A,——A修改:if(sym==jiajia||sym==jianjian)//++a,--a{if(sym==jiajia){getsymdo;if(sym==ident){i=position(id,*ptx);if(i==0){error(11);}else{if(table[i].kind!=variable){error(12);i=0;}else{gendo(lod,lev-table[i].level,table[i].adr);//生成指令,将变量放到栈顶gendo(lit,0,1);//生成指令,把常量取到运行栈顶gendo(opr,0,2);//生成指令,栈顶加次栈顶gendo(sto,lev-table[i].level,table[i].adr);//生成指令,结果写回变量地址单元getsymdo;}}}}else//--a{getsymdo;if(sym==ident){i=position(id,*ptx);if(i==0){error(11);}else{if(table[i].kind!=variable){error(12);i=0;}else{gendo(lod,lev-table[i].level,table[i].adr);//生成指令,取变量放大栈顶gendo(lit,0,1);//生成指令,取常数到栈顶gendo(opr,0,3);//生成指令,栈顶减次栈顶gendo(sto,lev-table[i].level,table[i].adr);//生成指令,结果写回变量地址单元getsymdo;}}}}随后修改如A++,A——if(sym==jiajia||sym==jianjian)//a++,a--{addop=sym;gendo(lod,lev-table[i].level,table[i].adr); //把变量的值压入栈gendo(lit,0,1);if(addop==jiajia){gendo(opr,0,2);gendo(sto,lev-table[i].level,table[i].adr);}else{gendo(opr,0,3);gendo(sto,lev-table[i].level,table[i].adr);}getsymdo;}这样,对JIAJIA和JIANJIAN操作就扩充完成。

扩充+=和-=操作这两个操作都是一种对变量进行赋值的形式,其合法的语句形式的语法图如下所示:根据图3,在已经处理部分的基础上,添加对+=运算和-=运算的扩充,相关代码添加如下:if(sym==jiadeng||sym==jiandeng){addop=sym;getsymdo;gendo(lod,lev-table[i].level,table[i].adr); /*把变量的值压入栈*/factordo(nxtlev,ptx,lev);if(addop==jiadeng){gendo(opr,0,2); /*生成加法指令*/}else{gendo(opr,0,3); /*生成减法指令*/}}这样就完成了对+=运算和-=运算的添加。

相关文档
最新文档