编译原理实验五
编译原理实验报告

编译原理实验报告一、实验目的本次编译原理实验的主要目的是通过实践加深对编译原理中词法分析、语法分析、语义分析和代码生成等关键环节的理解,并提高实际动手能力和问题解决能力。
二、实验环境本次实验使用的编程语言为 C/C++,开发工具为 Visual Studio 2019,操作系统为 Windows 10。
三、实验内容(一)词法分析器的设计与实现词法分析是编译过程的第一个阶段,其任务是从输入的源程序中识别出一个个具有独立意义的单词符号。
在本次实验中,我们使用有限自动机的理论来设计词法分析器。
首先,我们定义了单词的种类,包括关键字、标识符、常量、运算符和分隔符等。
然后,根据这些定义,构建了相应的状态转换图,并将其转换为程序代码。
在实现过程中,我们使用了字符扫描和状态转移的方法,逐步读取输入的字符,判断其所属的单词类型,并将其输出。
(二)语法分析器的设计与实现语法分析是编译过程的核心环节之一,其任务是在词法分析的基础上,根据给定的语法规则,判断输入的单词序列是否构成一个合法的句子。
在本次实验中,我们采用了自顶向下的递归下降分析法来实现语法分析器。
首先,我们根据给定的语法规则,编写了相应的递归函数。
每个函数对应一种语法结构,通过对输入单词的判断和递归调用,来确定语法的正确性。
在实现过程中,我们遇到了一些语法歧义的问题,通过仔细分析语法规则和调整函数的实现逻辑,最终解决了这些问题。
(三)语义分析与中间代码生成语义分析的任务是对语法分析所产生的语法树进行语义检查,并生成中间代码。
在本次实验中,我们使用了四元式作为中间代码的表示形式。
在语义分析过程中,我们检查了变量的定义和使用是否合法,类型是否匹配等问题。
同时,根据语法树的结构,生成相应的四元式中间代码。
(四)代码优化代码优化的目的是提高生成代码的质量和效率。
在本次实验中,我们实现了一些基本的代码优化算法,如常量折叠、公共子表达式消除等。
通过对中间代码进行分析和转换,减少了代码的冗余和计算量,提高了代码的执行效率。
电子科大-编译原理实验报告(得分80分)

电子科技大学实验报告学生姓名:爸爸学号:2222222222222 指导教师:陈昆实验地点:科研楼A-506 实验时间:2017-04-28一、实验项目名称:词法分析器的设计与实现二、实验学时:4学时三、实验原理1.编译程序要求对高级语言编写的源程序进行分析和合成,生成目标程序。
词法分析是对源程序进行的首次分析,实现词法分析的程序为词法分析程序或词法分析器,也称扫描器。
2.词法分析的功能是:从左到右逐个地扫描源程序字符串,按照词法规则,识别出单词符号作为输出,对识别过程中发现的词法错误,输出相关的错误信息。
3.识别出来的单词会采用某种中间表现形式,通常一个单词用一个二元式来表示:(单词类别,单词的属性)。
4.状态转换图简称转化图,是有限有向图,是设计词法分析器的有效工具。
四、实验目的通过该实验,让同学们自己独立自主的设计词法分析器,使得同学们可以更好的掌握词法分析程序设计的原理及相应的程序设计方法,对编译这门课程也可以有更加深刻理解,同时还可以锻炼编程能力。
五、实验内容实现求n!的极小语言的词法分析程序,返回二元式作为输出。
六、实验器材(设备、元器件)1.操作系统:Windows XP2.开发工具:VS2013七、实验步骤(1)在VS2013中创建工程;(2)编写输入输出,初始化,错误处理等函数;(3)建立相应的单词符号与种别对照表,根据状态转换图编写相应的处理函数;(4)运行代码进行调试;(5)编写测试需要的输入文件:.pas文件;(6)生成.dyd文件。
八、实验数据及结果分析编码完成后将测试程序放入debug文件夹中,测试程序如下图:代码运行成功后在debug文件夹中会产生对应的exe,在cmd中运行后,会在debug文件夹中生成后缀为dyd和err的文件,打开dyd如下图所示:因为没有错误,所以对应的test1.err的文件为空可以对源程序进行词法分析,如果有错给出出错信息和所在行数,如果无错则生成二元式文件。
编译原理实验报告

编译原理实验报告编译原理实验报告一、实验目的1. 了解编译器的基本原理和工作过程;2. 掌握编译器设计和实现的基本方法和技巧;3. 通过设计和实现一个简单的编译器,加深对编程语言和计算机系统的理解和认识。
二、实验原理编译器是将高级语言程序翻译成机器语言程序的一种软件工具。
它由编译程序、汇编程序、链接程序等几个阶段组成。
本次实验主要涉及到的是编译程序的设计和实现。
编译程序的基本原理是将高级语言程序转换为中间代码,再将中间代码转换为目标代码。
整个过程可以分为词法分析、语法分析、语义分析、代码生成和代码优化几个阶段。
三、实验内容本次实验的设计目标是实现一个简单的四则运算表达式的编译器。
1. 词法分析根据规定的语法规则,编写正则表达式将输入的字符串进行词法分析,将输入的四则运算表达式划分成若干个单词(Token),例如:运算符、操作数等。
2. 语法分析根据定义的语法规则,编写语法分析程序,将词法分析得到的Token序列还原成语法结构,构建抽象语法树(AST)。
3. 语义分析对AST进行遍历,进行语义分析,判断表达式是否符合语法规则,检查语义错误并给出相应的提示。
4. 代码生成根据AST生成目标代码,目标代码可以是汇编代码或者机器码。
四、实验过程和结果1. 首先,根据输入的表达式,进行词法分析。
根据所定义的正则表达式,将输入的字符串划分成Token序列。
例如:输入表达式“2+3”,经过词法分析得到的Token序列为["2", "+", "3"]。
2. 然后,根据语法规则,进行语法分析。
根据输入的Token序列,构建抽象语法树。
3. 接着,对抽象语法树进行语义分析。
检查表达式是否符合语法规则,给出相应的提示。
4. 最后,根据抽象语法树生成目标代码。
根据目标代码的要求,生成汇编代码或者机器码。
五、实验总结通过本次实验,我对编译器的工作原理有了更深入的认识,掌握了编译器设计和实现的基本方法和技巧。
编译原理实验

实验一:词法分析器一、实验目的通过编写词法分析程序,了解词法分析的过程。
二、实验内容编写能识别给定的程序设计语言的词法规则,输出单词流的识别程序。
三、实验设备及工具1.硬件:PC机Pentium100以上。
2.软件:Win2000或WinXP、BC++、VC++或JA VA开发环境。
四、实验说明以下所给文法是进行词法分析和语法分析的依据,并将该文法中涉及到的单词信息提取到了单词符号与种别对照表中。
本次实验要求编写符合该文法构词规则的词法分析器。
1. 文法G(<程序>)<程序>→BEGIN <语句表> END.<语句表>→<语句>|<语句>;<语句表><语句>→<赋值语句>︱<条件语句>︱<WHILE语句>︱<复合语句><赋值语句>→<变量>=<算术表达式><条件语句>→IF <关系表达式> THEN <语句> ELSE <语句><WHILE语句>→WHILE <关系表达式> DO <语句><复合语句>→BEGIN <语句表> END<算术表达式>→<项>|<算术表达式>+<项>|<算术表达式>-<项><项>→<变量>|<整数><关系表达式>→<算术表达式><关系运算符><算术表达式><关系运算符>→<︱= =︱><变量>→<标识符><标识符>→<标识符><字母>|<标识符><数字>|<字母><整数>→<数字>|<数字><整数><字母>→A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z<数字>→0|1|2|3|4|5|6|7|8|9注意阴影部分,其中<整数>和<标识符>被看作最小词法单位。
编译原理实验报告(手打)

《编译原理》实验报告班级:计C104姓名:李云霄学号:108490实验一词法分析程序实现一、实验目的与要求通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符形式的源程序流转化为一个由各类单词符号组成的流的词法分析方法。
二、实验内容选取无符号数的算术四则运算中的各类单词为识别对象,要求将其中的各个单词识别出来。
输入:由无符号数和+,-,*,/, ( , ) 构成的算术表达式,如1.5E+2-100。
输出:对识别出的每一单词均单行输出其类别码(无符号数的值暂不要求计算)。
三、实现方法与环境1、首先设计识别各类单词的状态转换图。
描述无符号常数的确定、最小化状态转换图如图1所示。
其中编号0,1,2,…,6代表非终结符号<无符号数>、<余留无符号数>、<十进小数>、<小数部分>、<指数部分>、<整指数>及<余留整指数>, 1,2和6为终态,分别代表整数、小数和科学计数的识别结束状态。
图1 文法G[<无符号数>]的状态转换图其中编号0,1,2,…,6代表非终结符号<无符号数>、<余留无符号数>、<十进小数>、<小数部分>、<指数部分>、<整指数>及<余留整指数>, 1,2和6为终态,分别代表整数、小数和科学计数的识别结束状态。
在一个程序设计语言中,一般都含有若干类单词符号,为此可首先为每类单词建立一张状态转换图,然后将这些状态转换图合并成一张统一的状态图,即得到了一个有限自动机,再进行必要的确定化和状态数最小化处理,最后据此构造词法分析程序。
四则运算算术符号的识别很简单,直接在状态图的0状态分别引出相应标记的矢根据描述语言中各类单词的文法状态转换图或状态矩阵,利用某种语言(C语言或JAVA语言)直接编写词法分析程序。
《编译原理》实验报告

ch2=='e'||ch2=='$' )
zf=1; elsh
zf=0; } if(ch1=='e'){ if(ch2>='0' && ch2<='9' && h<=1||ch2=='+'||ch2=='-')
zf=1; else zf=0; } if(ch1=='+' || ch1=='-'){
if(i==0) break; if(ch2>='0' && ch2<='9'||ch2=='$') zf=1; else zf=0; } if (zf==0) break; else i++; } if(zf==0) printf("Input number are error!\n"); else printf("Input number are right!\n"); }
编译原理实验大纲

编译原理实验大纲1.实验简介-介绍编译原理实验的目的和意义。
-解释编译原理实验的基本原理和流程。
2.实验环境搭建-说明实验所需的软件工具和开发环境。
-指导学生安装和设置实验环境。
3.实验一:词法分析器设计-介绍词法分析器的作用和原理。
-分析需求,设计词法分析器的数据结构和算法。
-实现基于所设计算法的词法分析器。
-编写测试用例,验证词法分析器的功能和正确性。
4.实验二:语法分析器设计-介绍语法分析器的作用和原理。
-分析需求,设计语法分析器的数据结构和算法。
-实现基于所设计算法的语法分析器。
-编写测试用例,验证语法分析器的功能和正确性。
5.实验三:语义分析器设计-介绍语义分析器的作用和原理。
-分析需求,设计语义分析器的数据结构和算法。
-实现基于所设计算法的语义分析器。
-编写测试用例,验证语义分析器的功能和正确性。
6.实验四:中间代码生成-介绍中间代码生成的作用和原理。
-分析需求,设计中间代码生成的数据结构和算法。
-实现基于所设计算法的中间代码生成器。
-编写测试用例,验证中间代码生成器的功能和正确性。
7.实验五:目标代码生成-介绍目标代码生成的作用和原理。
-分析需求,设计目标代码生成的数据结构和算法。
-实现基于所设计算法的目标代码生成器。
-编写测试用例,验证目标代码生成器的功能和正确性。
8.实验六:优化与调试-介绍编译优化和调试的基本概念。
-分析已实现的编译器的性能和问题。
-提出优化方案,并实现相应的优化功能。
-进行性能测试和调试,验证优化效果和解决问题。
9.实验七:实验报告撰写-分析实验过程和结果,总结经验和收获。
-撰写实验报告,包括实验目的、原理、实现过程、结果分析等内容。
-提交实验报告并进行评分评比。
10.总结与展望-对实验进行总结,回顾实验目标和实现情况。
-展望未来的发展方向和对编译原理的深入研究。
以上为编译原理实验的大纲,通过完成这些实验,学生可以深入理解编译原理的基本原理和算法,并掌握编译器的设计与实现方法。
《编译原理》实验教学大纲

《编译原理》实验教学大纲一、实验目的和任务编译原理是计算机科学与技术专业的一门重要课程,它主要研究的是将高级语言程序翻译成机器语言程序的方法和技术。
通过本实验课程的学习,旨在使学生掌握编译原理的基本原理和方法,培养学生对编译器结构与构造技术的专门知识和技能,为学生今后进行编译器设计与实现打下基础。
二、实验设备和工具1.计算机和相关硬件设备2. 编程语言的开发环境,如C/C++或Java三、实验内容1.实验一:词法分析器设计与实现a)实验目的:学习词法分析器的原理和设计方法,掌握正则表达式、DFA和NFA的转换方法。
b)实验任务:i.设计并实现一个词法分析器的原型,能够正确地识别出给定的程序中的词法单元。
ii. 使用给定的正则表达式设计并实现识别给定程序中的关键字、标识符、常量等的词法分析器。
2.实验二:语法分析器设计与实现a)实验目的:学习语法分析器的原理和设计方法,掌握上下文无关文法和LR分析表的构造方法。
b)实验任务:i.学习并理解上下文无关文法和LR分析表的构造方法。
ii. 设计并实现一个简单的递归下降语法分析器。
3.实验三:语义分析器设计与实现a)实验目的:学习语义分析器的原理和设计方法,掌握语义动作的定义和处理方法。
b)实验任务:i.学习并理解语义分析器的原理和设计方法。
ii. 设计并实现一个简单的语义分析器,能够对给定的程序进行语义分析和语义动作的处理。
4.实验四:中间代码生成器设计与实现a)实验目的:学习中间代码生成器的原理和设计方法,掌握中间代码的生成和优化方法。
b)实验任务:i.学习并理解中间代码生成器的原理和设计方法。
ii. 设计并实现一个简单的中间代码生成器,能够将给定的程序翻译成中间代码。
5.实验五:目标代码生成器设计与实现a)实验目的:学习目标代码生成器的原理和设计方法,掌握目标代码的生成和优化方法。
b)实验任务:i.学习并理解目标代码生成器的原理和设计方法。
ii. 设计并实现一个简单的目标代码生成器,能够将中间代码翻译成目标代码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
成绩:
指导教师:
批阅时间: 年 月 日
1、 实验内容或题目
掌握并实现识别程序中关键字的方法,并编程实现。为词法分析打 基础。
2、 实验目的与要求
任意输入一段C语言程序,字符串中的每个单词用空格分隔,要求 识别出程序中的关键字。
3、 实验步骤与源程序
⑴ 实验步骤 1. 定义关键字表。可以考虑用字符数组定义。 2. 定义一个输出关键字的缓冲区。用字符数组实现即可。长度 可暂定为40。 3. 打开代码文件。 4. 从文件中读入单词 5. 判断单词是否是关键字
if ((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) //如果ch是 字母,则进行标识符处理
{ id[0]=ch; j=1;
//从文件中读入下一个字符 ch=getc(fin); while(isalnum(ch)) //如果是字母数字则组合标识符;如果
不是则标识符组合结束 {
电子信息学院 实验报告书
课 程 名: 《编译原理》 题 目: 实验五 词法分析(一) 实验类别 【设计】 班 级: 学 号: 姓 名:
评语:
实验态度:认真( ) 一般( ) 差( ) 实验结果:正确( ) 部分正确( )错( ) 实验理论:掌握( ) 熟悉( ) 了解( ) 不懂( ) 操作技能:强( ) 一般( ) 差( ) 实验报告:好( ) 一般( ) 差( )
int es=0,j,n; //es错误代码,0表示没有错误。j,n为临时变量, 控制组合单词时的下标等
printf("请输入源程序文件名(包括路径):"); scanf("%s",PL0Scanin);
if ((fin=fopen(PL0Scanin,"r"))==NULL) //判断输入文件名是否 正确
⑵ 源代码
#include <stdio.h>
#include <ctype.h>
# include <iostream>
//下面定义保留,为简化程序,使用字符指针数组保存所有保留字。
//如果想增加保留字,可继续添加,并修改保留字数目
#define keywordSum 3
//可根据需要添加保留字列表
if (n>=keywordSum) //不是保留字,输出标识符
符号
printf("%s\t%d\t%s\n",id,0,"IDENT"); //输出标识符
\t%d\t%s\n",strlwr(id),0,strlwr(id)); // 输出保留字符号
{ printf("\n打开词法分析输入文件出错!\n"); return(1);//输入文件出错返回错误代码1
} ch=getc(fin); while(ch!='\0'){//未读到文件结束
while (ch==' '||ch=='\n'||ch=='\t') ch=getc(fin); if (ch==EOF) break;
}
}
fclose(fin);//关闭输入输出文件
//fclose(fout);
return(es); //返回主程序
}
4、 测试数据与实验结果(可以抓图粘贴)
5、 结果分析与实验体会
//将读入的字符存放在id数组中,同时将数组下标增加1,准备容纳下 一个字符。
id[j++]=ch; ch=getc(fin); //读下一个字符
}
id[j]='\0'; //标识符组合结束
//查保留字
n=0;
//z在保留子表中查找保留字
while
((n<keywordSum)
&&
strcmp(strlwr(id),keyword[n])) n++;
char *keyword[keywordSum]={ "begin","main","void"};
char PL0Scanin[300];//用于接收输入输出文件名
FILE *fin; //用于指向输入输出文件的指针
int main()//词法分析函数
{
char ch,id[40]; //ch为每次读入的字符,id用于保存识别出的单 词