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

合集下载

编译原理 实验报告

编译原理 实验报告

编译原理实验报告编译原理实验报告引言编译原理是计算机科学中的重要课程,它研究的是如何将高级语言程序转化为机器语言程序的过程。

在本次实验中,我们学习了编译原理的基本概念和技术,并通过实践来加深对这些概念和技术的理解。

本报告将对我们在实验中遇到的问题、解决方案以及实验结果进行总结和分析。

实验目的本次实验的主要目的是设计并实现一个简单的编译器,能够将类C语言的源代码翻译成目标代码。

通过这个实验,我们可以更好地理解编译器的工作原理,掌握编译器设计的基本方法和技术。

实验过程在实验中,我们首先对给定的类C语言的语法进行了分析,并根据语法规则设计了相应的语法分析器。

然后,我们使用了自顶向下的递归下降分析法来实现语法分析器。

在实现语法分析器的过程中,我们遇到了一些问题,例如如何处理语法规则中的左递归、如何处理语法规则中的优先级和结合性等。

通过仔细研究相关的文献和资料,我们成功地解决了这些问题,并完成了语法分析器的设计和实现。

接下来,我们对语法分析器进行了测试,并对测试结果进行了分析。

通过测试,我们发现语法分析器在处理简单的源代码时能够正确地识别出语法错误,并给出相应的错误提示。

然而,在处理复杂的源代码时,语法分析器可能会出现一些错误,例如无法正确地处理嵌套的语法结构、无法正确地处理运算符的优先级和结合性等。

为了解决这些问题,我们对语法分析器进行了改进,并进行了多次测试,最终得到了令人满意的结果。

实验结果通过本次实验,我们成功地设计并实现了一个简单的编译器,能够将类C语言的源代码翻译成目标代码。

在实验中,我们对编译器的工作原理有了更深入的了解,掌握了编译器设计的基本方法和技术。

同时,我们也发现了一些问题,并通过不断地改进和测试,最终得到了令人满意的结果。

结论编译原理是一门重要的计算机科学课程,它研究的是如何将高级语言程序转化为机器语言程序的过程。

通过本次实验,我们对编译原理的基本概念和技术有了更深入的了解,并通过实践来加深了对这些概念和技术的理解。

编译原理实验报告

编译原理实验报告

课程实验报告课程名称:《编译原理》专业班级:计算机科学与技术11级10班学号:XXXXXXX姓名:X X指导教师:**报告日期:2014年6月16日计算机科学与技术学院目录目录 (2)1 实验一词法分析 (3)1.1实验目的 (3)1.2实验要求 (3)1.3算法思想 (4)1.4实验程序设计说明 (5)1.5词法分析实现 (6)1.6词法实验结果及结果分析 (12)2 实验二语法分析 (13)2.1 实验目的 (13)2.2 实验要求 (13)2.3 算法思想 (13)2.4 实验程序设计说明 (15)2.5 语法分析实现 (15)4 实验中遇到的问题及解决 (22)参考资料 (23)1 实验一词法分析1.1 实验目的设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。

1.2 实验要求1、待分析的简单的词法(1)关键字:begin if then while do end所有的关键字都是小写。

(2)运算符和界符:= + - * / < <= <> > >= = ; ( ) #(3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义:ID = letter (letter | digit)*NUM = digit digit*(4)空格有空白、制表符和换行符组成。

空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。

2、各种单词符号对应的种别码:3、词法分析程序的功能:输入:所给文法的源程序字符串。

输出:二元组(syn,token或sum)构成的序列。

其中:syn为单词种别码;token为存放的单词自身字符串;sum为整型常数。

例如:对源程序begin x:=9: if x>9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如下序列:(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)……1.3 算法思想算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。

编译原理实验报告

编译原理实验报告

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

广工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。

编译原理实验报告

编译原理实验报告

编译原理实验报告一、实验概述本次实验旨在设计并实现一个简单的词法分析器,即实现编译器的第一个阶段,词法分析。

词法分析器将一段源程序代码作为输入,将其划分为一个个的词法单元,并将其作为输出。

二、实验过程1.设计词法规则根据编程语言的规范和所需实现的功能,设计词法规则,以明确规定如何将源程序代码分解为一系列的词法单元。

2.实现词法分析器采用合适的编程语言,根据所设计的词法规则,实现词法分析器。

词法分析器的主要任务是读入源程序代码,并将其根据词法规则进行分解,生成对应的词法单元。

3.测试词法分析器设计测试用例,用于检验词法分析器的正确性和性能。

测试用例应包含各种情况下的源程序代码。

4.分析和修正错误根据测试过程中发现的问题,分析产生错误的原因,并进行修正。

重复测试和修正的过程,直到词法分析器能够正确处理所有测试用例。

三、实验结果我们设计了一个简单的词法分析器,并进行了测试。

测试用例涵盖了各种情况下的源程序代码,包括正确的代码和错误的代码。

经过测试,词法分析器能够正确处理所有的测试用例。

词法分析器将源程序代码分解为一系列的词法单元,每个词法单元包含了单词的种类和对应的值。

通过对词法单元的分析,可以进一步进行语法分析和语义分析,从而完成编译过程。

四、实验总结通过本次实验,我深入了解了编译原理的词法分析阶段。

词法分析是编译器的第一个重要阶段,它将源程序代码分解为一个个的词法单元,为后续的语法分析和语义分析提供基础。

在实现词法分析器的过程中,我学会了如何根据词法规则设计词法分析器的算法,并使用编程语言实现词法分析器。

通过测试和修正,我掌握了调试和错误修复的技巧。

本次实验的经验对我今后的编程工作有很大帮助。

编译原理是计算机科学与技术专业的核心课程之一,通过实践能够更好地理解和掌握其中的概念和技术。

我相信通过进一步的学习和实践,我能够在编译原理领域取得更大的成果。

编译原理实验报告

编译原理实验报告

编译原理实验报告编译原理实验报告一、实验目的1. 了解编译器的基本原理和工作过程;2. 掌握编译器设计和实现的基本方法和技巧;3. 通过设计和实现一个简单的编译器,加深对编程语言和计算机系统的理解和认识。

二、实验原理编译器是将高级语言程序翻译成机器语言程序的一种软件工具。

它由编译程序、汇编程序、链接程序等几个阶段组成。

本次实验主要涉及到的是编译程序的设计和实现。

编译程序的基本原理是将高级语言程序转换为中间代码,再将中间代码转换为目标代码。

整个过程可以分为词法分析、语法分析、语义分析、代码生成和代码优化几个阶段。

三、实验内容本次实验的设计目标是实现一个简单的四则运算表达式的编译器。

1. 词法分析根据规定的语法规则,编写正则表达式将输入的字符串进行词法分析,将输入的四则运算表达式划分成若干个单词(Token),例如:运算符、操作数等。

2. 语法分析根据定义的语法规则,编写语法分析程序,将词法分析得到的Token序列还原成语法结构,构建抽象语法树(AST)。

3. 语义分析对AST进行遍历,进行语义分析,判断表达式是否符合语法规则,检查语义错误并给出相应的提示。

4. 代码生成根据AST生成目标代码,目标代码可以是汇编代码或者机器码。

四、实验过程和结果1. 首先,根据输入的表达式,进行词法分析。

根据所定义的正则表达式,将输入的字符串划分成Token序列。

例如:输入表达式“2+3”,经过词法分析得到的Token序列为["2", "+", "3"]。

2. 然后,根据语法规则,进行语法分析。

根据输入的Token序列,构建抽象语法树。

3. 接着,对抽象语法树进行语义分析。

检查表达式是否符合语法规则,给出相应的提示。

4. 最后,根据抽象语法树生成目标代码。

根据目标代码的要求,生成汇编代码或者机器码。

五、实验总结通过本次实验,我对编译器的工作原理有了更深入的认识,掌握了编译器设计和实现的基本方法和技巧。

2014年广工编译原理实验报告

2014年广工编译原理实验报告

编译原理实验学院 __________ 专业计算机科学与技术年级班别11 级计科7班学号3111 _____________________学生姓名 ______________________指导教师李小妹_________成绩________________________2014年1月一、实验目的与要求对PL/O作以下修改扩充:(1)增加单词:保留字ELSE , FOR , STEP , UNTIL , DO,RETURN运算符*=,/=,& ,||,!(2)修改单词:不等号#改为<>(3)增加条件语句的ELSE子句,要求:写出相关文法,语法图,语义规则。

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

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

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

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

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

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

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

2、主要成分描述①符号表为了组成一条指令,编译程序必须知道其操作码及其参数(数或地址)。

《编译原理》课程实验报告

《编译原理》课程实验报告

华东交大理工学院《编译原理》课程实验报告题目:词法分析器实验专业:计算机科学与技术班级:1班学号:* * * *****姓名:* * *一、实验目的通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和清楚的理解,并能正确地、熟练地运用。

二、实验内容及要求用VC++/VB/JA V A语言实现对C语言子集的源程序进行词法分析。

通过输入源程序从左到右对字符串进行扫描和分解,依次输出各个单词的内部编码及单词符号自身值;若遇到错误则显示“Error”,然后跳过错误部分继续显示;同时进行标识符登记符号表的管理。

以下是实现词法分析设计的主要工作:(1)从源程序文件中读入字符。

(2)统计行数和列数用于错误单词的定位。

(3)删除空格类字符,包括回车、制表符空格。

(4)按拼写单词,并用(内码,属性)二元式表示。

(属性值——token的机内表示)(5)如果发现错误则报告出错(6)根据需要是否填写标识符表供以后各阶段使用。

单词的基本分类:关键字:由程序语言定义的具有固定意义的标识符。

也称为保留字例如if、for、while、printf ;单词种别码为1。

标识符:用以表示各种名字,如变量名、数组名、函数名;常数:任何数值常数。

如125, 1,0.5,3.1416;运算符:+、-、*、/;关系运算符:<、<=、= 、>、>=、<>;分界符:;、,、(、)、[、];三、实验程序设计说明1.实验方案设计1、主程序设计考虑:程序的说明部分为各种表格和变量安排空间。

在具体实现时,将各类单词设计成结构和长度均相同的形式,较短的关键字后面补空。

k数组------关键字表,每个数组元素存放一个关键字(事先构造好关键字表)。

s 数组------存放分界符表(可事先构造好分界符表)。

为了简单起见,分界符、算术运算符和关系运算符都放在s表中(编程时,应建立算术运算符表和关系运算符表,并且各有类号),合并成一类。

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

实验报告课程名称编译原理题目名称 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.首先考虑需要增加保留字的个数,以及如何命名,再将新增的保留字添加对应的保留字的集合中。

具体实现的语句如下所示: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,ELSESYM, FORSYM, STEPSYM, STEPSYM, RETURNSYM,TIMESBECOMES, SLASHBECOMES, ANDSYM, ORSYM, NOTSYM} SYMBOL;2.这里需要注意,一定要参照已有的保留字,进行相应的命名和添加规范。

具体实现的语句如下所示: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","CONSTSYM", "VARSYM", "PROCSYM", "PROGSYM","ELSESYM", "FORSYM", "STEPSYM", "STEPSYM", "RETURNSYM","TIMESBECOMES", "SLASHBECOMES", "ANDSYM", "ORSYM", "NOTSYM"};3.将新增的保留字按照字母表升序的方式添加,运算符参照已有的运算符来进行添加,注意好符号与SYM的对应。

具体实现的语句如下所示:特别注意点:此处一定要考虑到PLO编译器采用了折半查找算法来进行操作,如果新增的保留字没有按照既定的升序规则来插入,会造成在编译过程中,编译器无法识别某些保留字。

strcpy(KWORD[ 1],"BEGIN"); strcpy(KWORD[ 2],"CALL");strcpy(KWORD[ 3],"CONST"); strcpy(KWORD[ 4],"DO");strcpy(KWORD[ 5],"ELSE");strcpy(KWORD[ 6],"END");strcpy(KWORD[ 7],"FOR");strcpy(KWORD[ 8],"IF");strcpy(KWORD[ 9],"ODD"); strcpy(KWORD[ 10],"PROCEDURE");strcpy(KWORD[ 11],"PROGRAM"); strcpy(KWORD[12],"READ");strcpy(KWORD[13],"RETURN");strcpy(KWORD[14],"STEP");strcpy(KWORD[15],"THEN");strcpy(KWORD[16],"UNTIL");strcpy(KWORD[17],"VAR");strcpy(KWORD[18],"WHILE"); strcpy(KWORD[19],"WRITE");WSYM[ 1]=BEGINSYM; WSYM[ 2]=CALLSYM;WSYM[ 3]=CONSTSYM; WSYM[ 4]=DOSYM;WSYM[ 5]=ELSESYM; /*增加保留字符号elsesym*/WSYM[ 6]=ENDSYM;WSYM[ 7]=FORSYM;WSYM[ 8]=IFSYM;WSYM[ 9]=ODDSYM; WSYM[ 10]=PROCSYM;WSYM[ 11]=PROGSYM; WSYM[12]=READSYM;WSYM[13]=RETURNSYM;WSYM[14]=STEPSYM;WSYM[15]=THENSYM;WSYM[16]=UNTILSYM;WSYM[17]=VARSYM;WSYM[18]=WHILESYM; WSYM[19]=WRITESYM;SSYM['+']=PLUS; SSYM['-']=MINUS;SSYM['*']=TIMES; SSYM['/']=SLASH;SSYM['(']=LPAREN; SSYM[')']=RPAREN;SSYM['=']=EQL; SSYM[',']=COMMA;SSYM['.']=PERIOD;SSYM[';']=SEMICOLON; SSYM['&']=ANDSYM;SSYM['!']=NOTSYM;4.在完成保留字的添加以后,在void STATEMENT(SYMSET FSYS,int LEV,int &TX){}函数中增加相应的语句,注意满足语法规则。

这是用来检验保留字是否添加成功的标志。

具体实现的语句如下所示:case FORSYM:GetSym();Form1->printfs("保留字:FORSYM~~~~");break;case STEPSYM:GetSym();Form1->printfs("保留字:STEPSYM~~~~");break;case UNTILSYM:GetSym();Form1->printfs("保留字:UNTILSYM~~~~");break;case RETURNSYM:GetSym();Form1->printfs("保留字:RETURNSYM~~~~");break;case DOSYM:GetSym();Form1->printfs("保留字:DOSYM~~~~");break;5.新增的运算符需要被编译器识别,必须满足编译器做词法分析时,能够正确得到对于的SYM,因此在GetSym()函数中在相应位置增加相应的运算符分析判断,具体实现如下面所示的语句:elseif (CH==':') {GetCh();if (CH=='=') { SYM=BECOMES; GetCh(); }else SYM=NUL;}elseif(CH == '*'){GetCh();if(CH == '='){SYM = TIMESBECOMES;GetCh();}else SYM=SSYM['*'];}elseif(CH == '/'){GetCh();if(CH == '='){SYM = SLASHBECOMES;GetCh();}else SYM=SSYM['/'];}else /* THE FOLLOWING TWO CHECK WERE ADDEDBECAUSE ASCII DOES NOT HAVE A SINGLE CHARACTER FOR <= OR >= */ if (CH=='<') {GetCh();if (CH=='=') { SYM=LEQ; GetCh(); }else if(CH=='>'){ SYM=NEQ; GetCh(); } //不等号加 else SYM=LSS;}elseif (CH=='>') {GetCh();if (CH=='=') { SYM=GEQ; GetCh(); }else SYM=GTR;}elseif (CH=='&') {SYM=ANDSYM; GetCh();}elseif (CH=='|') {GetCh();if (CH=='|') {SYM=ORSYM; GetCh();}else Error(19);}elseif (CH=='!') {SYM=NOTSYM; GetCh();}else { SYM=SSYM[CH]; GetCh(); }6.完成运算符语义分析之后,按照增加保留字的方法一样,同样在void STATEMENT(SYMSET FSYS,int LEV,int &TX){}函数中增加相应语句,这是用来检验运算符是否添加成功的标志。

相关文档
最新文档