广工编译原理实验报告(参考格式)

合集下载

编译原理实验报告

编译原理实验报告

编译原理实验报告一、实验目的和要求本次实验旨在对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语法分析器的词法规则和语法规则。

2015广工编译原理课程设计报告(文档最后含源码下载地址)

2015广工编译原理课程设计报告(文档最后含源码下载地址)

课程设计课程名称___编译原理__________题目名称___PL/0编译器的扩充 __ 学生学院___计算机学院_________专业班级_计算机科学与技术13(9)学号学生姓名指导教师___林志毅________________ 2016 年1 月2 日一、 已完成的内容:(1) 扩充赋值运算:*= 和 /=(2) 扩充语句(Pascal 的FOR 语句)FOR <变量>:=<表达式>STEP<表达式>UNTIL<表达式>Do<语句>(3) 增加类型:①字符类型;②实数类型。

(4) 增加注释; 多行注释由/*和*/包含,单行注释为//二、 实验环境与工具(1)计算机及操作系统:PC 机,Windows7(2)程序设计语言:C++(3)使用软件Borland C++ Builder 6.0(4)教学型编译程序:PL/0三、 具体实现:1. 扩充赋值运算:*= 和 /=(1) 语法树(2) 修改GetSym()方法(写出修改的代码)else if(CH=='*') {GetCh();if(CH=='=') { SYM=TIMESBECOMES; GetCh(); }else SYM=TIMES;} else if(CH=='/') {GetCh();if(CH=='=') { SYM=SLASHBECOMES; GetCh(); }(3) 修改STATEMENT ()方法(写出修改的代码)case IDENT:i=POSITION(ID,TX); if (i==0) Error(11);else if (TABLE[i].KIND==VARIABLE || TABLE[i].KIND==FLOATTYPE) { /*ASSIGNMENT TO NON-VARIABLE*/GetSym();if (SYM==BECOMES|| SYM==TIMESBECOMES || SYM==SLASHBECOMES||SYM==PLUSBECOMES||SYM==MINUSBECOMES) {RELOP=SYM;if(SYM!=BECOMES) { //若为除等于(或其他类似符号)则先把符号左边的变量值放入栈中GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);}GetSym();} else Error(13);EXPRESSION(FSYS,LEV,TX);if(RELOP==TIMESBECOMES) {GEN(OPR,0,4);} else if(RELOP==SLASHBECOMES) {GEN(OPR,0,5);} else if(RELOP==PLUSBECOMES) {GEN(OPR,0,2);} else if(RELOP==MINUSBECOMES) {GEN(OPR,0,3);}GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);}(4)运行测试(测试的PL0源码扩充单词的测试并贴运行结果截图)PL0源码:PROGRAM EX01;VAR A,B,C,D;BEGINA:=16;A/=2;WRITE(A); //结果为8B:=4;B*=2;WRITE(B); //结果为8C:=6;C+=2;WRITE(C); //结果为8D:=10;D-=2;WRITE(D); //结果为8END.(5)运行结果:(6)出现的问题及解决开始时在实现/=和*=操作时,*=的实现很顺利,而/=却一直没有得到理想的结果,通过与同学的讨论得知代码中除号指令的解析中,其实为除余操作,于是将%改为/,但是结果还是错误,经过调试发现是两个相除的数在栈中的位置相反了,正确的状态应该是除数位于次栈顶,而被除数位于栈顶。

编译原理实验报告

编译原理实验报告

编译原理实验报告一、实验目的本次编译原理实验的主要目的是通过实践加深对编译原理中词法分析、语法分析、语义分析和代码生成等关键环节的理解,并提高实际动手能力和问题解决能力。

二、实验环境本次实验使用的编程语言为 C/C++,开发工具为 Visual Studio 2019,操作系统为 Windows 10。

三、实验内容(一)词法分析器的设计与实现词法分析是编译过程的第一个阶段,其任务是从输入的源程序中识别出一个个具有独立意义的单词符号。

在本次实验中,我们使用有限自动机的理论来设计词法分析器。

首先,我们定义了单词的种类,包括关键字、标识符、常量、运算符和分隔符等。

然后,根据这些定义,构建了相应的状态转换图,并将其转换为程序代码。

在实现过程中,我们使用了字符扫描和状态转移的方法,逐步读取输入的字符,判断其所属的单词类型,并将其输出。

(二)语法分析器的设计与实现语法分析是编译过程的核心环节之一,其任务是在词法分析的基础上,根据给定的语法规则,判断输入的单词序列是否构成一个合法的句子。

在本次实验中,我们采用了自顶向下的递归下降分析法来实现语法分析器。

首先,我们根据给定的语法规则,编写了相应的递归函数。

每个函数对应一种语法结构,通过对输入单词的判断和递归调用,来确定语法的正确性。

在实现过程中,我们遇到了一些语法歧义的问题,通过仔细分析语法规则和调整函数的实现逻辑,最终解决了这些问题。

(三)语义分析与中间代码生成语义分析的任务是对语法分析所产生的语法树进行语义检查,并生成中间代码。

在本次实验中,我们使用了四元式作为中间代码的表示形式。

在语义分析过程中,我们检查了变量的定义和使用是否合法,类型是否匹配等问题。

同时,根据语法树的结构,生成相应的四元式中间代码。

(四)代码优化代码优化的目的是提高生成代码的质量和效率。

在本次实验中,我们实现了一些基本的代码优化算法,如常量折叠、公共子表达式消除等。

通过对中间代码进行分析和转换,减少了代码的冗余和计算量,提高了代码的执行效率。

(精选)广工2014编译原理实验报告

(精选)广工2014编译原理实验报告

实验报告课程名称编译原理题目名称 PL/0编译器的扩充学生学院计算机学院专业班级计算机科学与技术12(4)学号 3112005901学生姓名柏石先指导教师李杨程序功能完成情况测试用例全面程度学生对所编程序熟悉程度报告格式是否与要求相符报告内容是否准确、全面2014 年 12 月 20日一、实验目的与要求对PL/0作以下修改扩充:(1)增加单词:保留字 ELSE,FOR,STEP,UNTIL,DO,RETURN运算符 *=,/=,&,||,!(2)修改单词:不等号# 改为 <>(3)增加条件语句的ELSE子句,要求:写出相关文法,语法描述图,语义描述图。

二、实验环境与工具1、源语言:PL/0语言,PL/0语言是PASCAL语言的子集,它的编译程序是一个编译解析执行系统,后缀名为.PL0;2、目标语言:生成文件后缀为*.COD的目标代码3、实现平台:Borland C++Builder 64、运行平台:Windows 8.1三、结构流程1、结构设计说明(1)PL/0 语言编译器PL/0语言可看成是PASCAL语言的子集,它的编译程序是一个编译解释执行系统。

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

2、词法分析程序的设计四、开发过程(一)增加单词:保留字 ELSE,FOR,STEP,UNTIL,DO , RETURN运算符 *=,/=,&,||,!新增6个保留字和5个运算符,合计11个单词。

其中保留字ELSE,FOR,STEP,UNTIL,DO, RETURN分别对应ELSESYM,FORSYM, STEPSYM, UNTILSYM,DOSYM,RETURNSYM;运算符 *= ,/= ,& ,|| ,!分别对应TIMESBECOMES, SLASHBECOMES, ANDSYM, ORSYM, NOTSYM。

注:要求只做词法分析部分,不做语义分析处理,实验的结果只是识别新增的保留字和运算1.首先考虑需要增加保留字的个数,以及如何命名,再将新增的保留字添加对应的保留字的集合中。

广工2014编译原理课程设计报告

广工2014编译原理课程设计报告

课程设计课程名称编译原理题目名称PL/0编译器的扩充学生学院计算机学院专业班级计算机科学与技术12(4) 学号学生姓名柏石先指导教师李杨2014 年12 月28日一、实验目的与要求基本内容(成绩范围:“中”、“及格”或“不及格”)(1)扩充赋值运算:*= 和 /=(2)扩充语句(Pascal的FOR语句):FOR <变量>:=<表达式>STEP<表达式> UNTIL<表达式>Do<语句>选做内容(成绩评定范围扩大到:“优”和“良”)(1)增加类型:①字符类型;②实数类型。

(2)增加注释; 注释由/*和*/包含;(3)扩充函数:①有返回值和返回语句;②有参数函数。

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

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

二、实验环境与工具1、源语言:PL/0语言,PL/0语言是PASCAL语言的子集,它的编译程序是一个编译解析执行系统,后缀名为.PL0;2、目标语言:生成文件后缀为*.COD的目标代码3、实现平台:Borland C++Builder 64、运行平台:Windows 8.1三、设计概述1、结构设计说明(1)PL/0编译系统的结构框架源语言:源语言是基于C语言写的PL/0编译程序——PL0语言(可以看成Pascal 语言的子集)目标语言:假想的栈式计算机计算语言,即类PCODE指令代码。

指令格式如下:其中f代表功能码,l表示层次差,a的含意对不同的指令有所区别。

具体的指令功能表:(一)扩充赋值运算:*= 和/=*= 和/=的语法描述图:(二)扩充语句(Pascal的FOR语句)因为在Pascal中的FOR语句描述为:FOR <变量>:=<表达式> STEP <表达式> UNTIL <表达式> DO <语句> 所以增加FOR,STEP,UNTIL,DOFOR语句语法描述图为:1)增加所需要的保留字和运算符,实现*=和/=,以及FOR语句,应该增加TIMESBECOMES,SLASHBECOMES,FOR,STEP,UNTIL,DO。

编译原理实验报告

编译原理实验报告

编译原理实验报告一、实验目的编译原理是计算机科学中的重要学科,它涉及到将高级编程语言转换为计算机能够理解和执行的机器语言。

本次实验的目的是通过实际操作和编程实践,深入理解编译原理中的词法分析、语法分析、语义分析以及中间代码生成等关键环节,提高我们对编译过程的认识和编程能力。

二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。

此外,还使用了一些相关的编译工具和调试工具,如 GDB 等。

三、实验内容(一)词法分析器的实现词法分析是编译过程的第一步,其任务是将输入的源程序分解为一个个单词符号。

在本次实验中,我们使用有限自动机的理论来设计和实现词法分析器。

首先,定义了各种单词符号的类别,如标识符、关键字、常量、运算符等。

然后,根据这些类别设计了相应的状态转换图,并将其转换为代码实现。

在实现过程中,使用了正则表达式来匹配输入字符串中的单词符号。

对于标识符和常量等需要进一步处理的单词符号,使用了相应的规则进行解析和转换。

(二)语法分析器的实现语法分析是编译过程的核心环节之一,其任务是根据给定的语法规则,分析输入的单词符号序列是否符合语法结构。

在本次实验中,我们使用了递归下降的语法分析方法。

首先,根据实验要求定义了语法规则,并将其转换为相应的递归函数。

在递归函数中,通过对输入单词符号的判断和处理,逐步分析语法结构。

为了处理语法错误,在分析过程中添加了错误检测和处理机制。

当遇到不符合语法规则的输入时,能够输出相应的错误信息,并尝试进行恢复。

(三)语义分析及中间代码生成语义分析的目的是对语法分析得到的语法树进行语义检查和语义处理,生成中间代码。

在本次实验中,我们使用了三地址码作为中间代码的表示形式。

在语义分析过程中,对变量的定义和使用、表达式的计算、控制流语句等进行了语义检查和处理。

对于符合语义规则的语法结构,生成相应的三地址码指令。

四、实验步骤(一)词法分析器的实现步骤1、定义单词符号的类别和对应的正则表达式。

编译原理课程试验报告

编译原理课程试验报告
int id;//指向符号表的元素的下标
}
2.符号表:
数组string[MAX],用于存储符号。
3.符号映射:
map<string, int> SM;
用于判断符号是否在符号表中存在,若存在返回此符号在符号表中的位置下标。
(4)错误处理
1.显示错误行数,状态0发生错误,非法的开始字符
2.显示错误行数,装态5发生错误,浮点数分析时发生错误
编译原理课程实验报告
实验1:词法分析
姓名
院系
软件学院
学号
任课教师
指导教师
实验地点
实验时间
2008-12-1
实验课表现
出勤、表现得分
实验报告
得分
实验总分
操作结果得分
一、实验目的
实验目的:
1.巩固对词法分析的基本功能和原理的认识。通过看书和实践来达到目的。
2.能够应用自动机的知识进行词法分析。通过画出状态转换图达到目的。
3.理解并处理词法分析中的异常和错误。通过编写代码处理达到目的。
二、实验内容
要求:对如下工作进行展开描述
(1)给出语言的词法规则描述
记号
属性
关键字
本身
_
标识符
IDN
指向符号表中与*相关的表项的指针
整常数
INUM
数值
浮点常数
FNUM
数值
字符常数
CH
字符
字符串常数
STR
字符串
单界符
SC
字符(+,-,*,/,=,{,},;)
指导教师评语:
日期:
IDN变量: f
SC单界符: =
FNUM浮点数: -2.01

编译原理实习报告

编译原理实习报告

一、实习背景与目的随着计算机技术的飞速发展,编译原理作为计算机科学的重要基础理论之一,其研究与应用越来越受到重视。

为了更好地理解和掌握编译原理的基本原理和方法,提高自己的编程能力和设计能力,我参加了编译原理的实习课程。

本次实习旨在通过设计和实现一个简单的编译程序,加深对编译原理的理解,掌握编译程序的设计与实现方法,提高自己的编程能力,并培养自己的计算思维。

二、实习内容本次实习主要分为以下几个部分:1. 词法分析:识别源程序中的单词,将其转换为对应的词法单元。

2. 语法分析:根据文法规则,分析源程序的语法结构,生成抽象语法树(AST)。

3. 语义分析:检查AST的语义正确性,进行类型检查等。

4. 中间代码生成:将AST转换为中间代码。

5. 代码优化:对中间代码进行优化,提高程序性能。

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

三、实习过程1. 词法分析:- 首先,分析源程序的文法规则,确定需要识别的单词种类和对应的正则表达式。

- 然后,设计状态转换图,实现词法分析器。

- 最后,编写测试用例,验证词法分析器的正确性。

2. 语法分析:- 分析文法规则,确定语法结构,设计抽象语法树(AST)。

- 选择合适的语法分析方法,如递归下降分析、LL分析、LR分析等。

- 实现语法分析器,将词法分析器生成的词法单元转换为AST。

3. 语义分析:- 根据AST,检查语义正确性,如类型检查、作用域分析等。

- 实现语义分析器,处理语义错误,并给出错误信息。

4. 中间代码生成:- 根据AST,生成中间代码,如三地址代码、四元式等。

- 实现中间代码生成器,将AST转换为中间代码。

5. 代码优化:- 分析中间代码,找出可优化的部分。

- 实现代码优化器,优化中间代码,提高程序性能。

6. 目标代码生成:- 根据目标平台的指令集,生成目标代码。

- 实现目标代码生成器,将优化后的中间代码转换为目标代码。

四、实习成果通过本次实习,我成功地设计和实现了一个简单的编译程序,实现了词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等功能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在过程返回时,解释程序通过返回地址恢复指令指针的值到调用前的地址,通过当前段
基址恢复数据段分配指针,通过动态链恢复局部段基址指针。实现子过程的返回。对于主程 序来说,解释程序会遇到返回地址为 0 的情况,这时就认为程序运行结束。
解释程序过程中的 base 函数的功能,就是用于沿着静态链,向前查找相差指定层数的 局部数据段基址。这在使用 sto、lod、stoArr、lodArr 等访问局部变量的指令中会经常用 到。
1、增加单词:保留字 ELSE,FOR,TO,DOWNTO,RETURN 运算符 *= ,/= ,& ,|| , !
1.1 单词的加入
新增 5 个保留字和 5 个运算符,合计 10 个单词。 其中保留字ELSE,FOR,TO,DOWNTO,RETURN 分别对应 ELSESYM,FORSYM,TOSYM,DOWNTOSYM,RETURNSYM; 运算符 *= ,/= ,& ,|| , ! 分别对应
ADDEQ,DIVEQ ,AND, OR , NOT;
修改前 typedef enum { NUL, IDENT, NUMBER, PLUS, MINUS, TIMES,
SLASH, ODDSYM, EQL, NEQ, LSS, LEQ, GTR, GEQ, LPAREN, RPAREN, COMMA, SEMICOLON, PERIOD, BECOMES, BEGINSYM, ENDSYM, IFSYM, THENSYM, WHILESYM, WRITESYM, READSYM, DOSYM, CALLSYM, CONSTSYM, VARSYM, PROCSYM, PROGSYM } SYMBOL; char *SYMOUT[] = {"NUL", "IDENT", "NUMBER", "PLUS", "MINUS", "TIMES", "SLASH", "ODDSYM", "EQL", "NEQ", "LSS", "LEQ", "GTR", "GEQ", "LPAREN", "RPAREN", "COMMA", "SEMICOLON", "PERIOD", "BECOMES", "BEGINSYM", "ENDSYM", "IFSYM", "THENSYM", "WHILESYM", "WRITESYM", "READSYM", "DOSYM", "CALLSYM",
四、测试用例.............................................9 1、关于 IF ELSE 功能的测试.............................10 2、关于不等号“#”替换为“<>”的测试..................10
五、开发过程和完成情况...................................11 六、心得体会............................................16
类 PCODE 代码解释执行的部分通过循环和简单的 case 判断不同的指令,做出相应的动 作。当遇到主程序中的返回指令时,指令指针会指到 0 位置,把这样一个条件作为终至循环 的条件,保证程序运行可以正常的结束。
○3 语法分析方法
语法分析子程序采用了自顶向下的递归子程序法,语法分析同时也根据程序的语义生成 相应三元代码,并提供了出错处理的机制。语法分析主要由分程序分析过程(BLOCK)、参 数变量分析过程(ParaDeclaration)、参数变量处理过程(ParaGetSub)、数组处理过程 ( ParaGetSub ) 、 常 量 定 义 分 析 过 程 ( ConstDeclaration ) 、 变 量 定 义 分 析 过 程 (Vardeclaration)、语句分析过程(Statement)、表达式处理过程(Expression)、项 处理过程(Term)、因子处理过程(Factor)和条件处理过程(Condition)构成。这些过 程在结构上构成一个嵌套的层次结构。除此之外,还有出错报告过程(Error)、代码生成 过程(Gen)、测试单词合法性及出错恢复过程(Test)、登录名字表过程(Enter)、查询 名字表函数(Position)以及列出类 PCODE 代码过程(Listcode)作过语法分析的辅助过 程。
(2)PL/0 编译程序的语法分析过程 BLOCK 是整个编译过程的核心。这里根据编 译程序的总体流程图,来弄清 BLOCK 过程在整个编译程序中的作用。总流程图如 下图所示:
(3)各功能模块描述
过程或函数名 pl0 error
简要功能说明 主程序 出错处理,打印出错位置和错误编码
getsym getch gen test block enter position(函数) constdeclaration vardeclaration listode statement expression term factor condition interpret base(函数)
四、测试用例
1.关于 IF ELSE 功能的测试,测试文件为 E0101.PL0
2.关于不等号“#”替换为“<>”的测试,测试文件为 E01.PL0 (1)首先验证“#”是否已失去不等号的作用,显然是失效的。结果如图:
(2)测试“<>”的不等号功能是否有效,事实证明是有效的。结果如图:
五、开发过程和完成情况
实验报告
课程名称
编译原理
学生学院
计算机学院
专业班级 2010 级计算机科学与技术四班
学号
3110006015
学生姓名
张法光
指导教师
李杨
2013 年 1 月 07 日
目录
一、实验概述.............................................5 1、实验目的...........................................5 2、实验内容...........................................5 3、实验概述...........................................5
三、主要成分描述.........................................7 ① 符号表...........................................7 ② 运行时存储组织和管理.............................7 ③ 语法分析方法.....................................8 ④ 中间代码表示.....................................8
○4 中间代码表示
中间代码是是源程序的一种内部表示,复杂性介于源语言和目标机语言之间。 中间代码的表示方法有逆波兰式、三元式、树形、四元式等。 (1) 逆波兰记号是最简单的一种中间代码表示形式,早在编译程序出现之前,它就用于表示 算术表达式。 后缀表示法表示表达式,其最大的优点是易于栈式计算机处理表达式。 (2) 每个三元式由三个部分组成: A. 算符 op B. 第一运算对象 ARG1 C. 第二运算对象 ARG2 运算对象可能是源程序中的变量,也可能是某个三元式的结果,用三元式的编号表示。 (3) 树形表示是三元式表示的翻版。 (4) 四元式是一种比较普遍采用的中间代码形式: 算符 op,运算对象 ARG1,运算对象 ARG2,运算结果 RESULT
○2 运行时存储组织和管理
对于源程序的每一个过程(包括主程序),在被调用时,首先在数据段中开辟三个空间, 存放静态链 SL、动态链 DL 和返回地址 RA。静态链记录了定义该过程的直接外过程(或主程 序)运行时最新数据段的基地址。动态链记录调用该过程前正在运行的过程的数据段基址。 返回地址记录了调用该过程时程序运行的断点位置。对于主程序来说,SL、DL 和 RA 的值均 置为 0。静态链的功能是在一个子过程要引用它的直接或间接父过程(这里的父过程是按定 义过程时的嵌套情况来定的,而不是按执行时的调用顺序定的)的变量时,可以通过静态链, 跳过个数为层差的数据段,找到包含要引用的变量所在的数据段基址,然后通过偏移地址访 问它。
词法分析,读取一个单词 漏掉空格,读取一个字符 生成目标代码,并送入目标程序区 测试当前单词符号是否合法 分程序分析处理过程 登录名字表 查找标识符在名字表中的位置 常量定义处理 变量说明处理 列出目标代码清单 语句处理 表达式处理 项处理 因子处理 条件处理 对目标代码的解释执行程序 通过静态链求出数据区的基地址
二、结构设计说明.........................................5 1、PL/0 语言编译器....................................6 2、总流程图...........................................6 3、各功能模块描述.....................................7
二、结构设计说明
(1)PL/0 语言编译器
PL/0 语言可看成是 PASCAL 语言的子集,它的编译程序是一个编译解释执行系统。PL/0 的目标程序为假想栈式计算机的汇编语言,与具体计算机无关。
PL/0 源程序

目标代码生成程序
相关文档
最新文档