篇一:编译原理词法分析器实验报告
曲阜师范大学实验报告
计算机系20XX年级软件工程一班组日期20XX年10月17日星期日
姓名
陈金金同组者姓名
课程编译原理成绩
实验名称:教师签章词法分析器
一、实验目的:
1·掌握词法分析的原理。
2·熟悉保留字表等相关的数据结构与单词的分类方法。
3·掌握词法分析器的设计与调试。
二、实验内容:
根据编译中的分词原理,编写一个词法分析程序:1.输入:任意一个c语言程序的源代码。
2.处理:对输入进行分析,分离出保留字、标识符、常量、算符和界符。
3.输出:对应的二元式(种别编码自定,可暂编为一类对应一个编码)。
三、实验要求:
1.任选c/c++/Java中的一种高级程序语言编程完成词法分析器。
2.词法分析器应以教材所述分词原理为依据,使用恰当的数据结构和方法,结构清晰、高效。
四、实验环境:
windowsxp操作系统,J2se,eclipse集成开发环境
五、实验分析:
将源代码作为长字符串进行读入,之后通过switch语句,及状态转换图进行词素识别,并对识别的词素进行分类整理以二元式的形式输出。
六、实验过程:
1、建立词法分析器界面,很简单:输入框,输出框,执行分析按钮,清空按钮,退出程序按钮。主要的地方是,考虑mvc开发模式,为model及controller提供接口。实现界面如下所示:
2、核心代码的编写,考虑到需要进行词素的匹配,创建符号表类symTable。提供两个变量,分别存放如下内容:并提供方法insert(),lookup(),分别负责标志符的插入和查找。
3.、根据语法规则书写状态转换图,并用switch语句实现:
需要注意的地方是,begin和forward两个指针的移动:通过swith语句识别词素,并在符号表中进行匹配,匹配成功,则返回相应的记号,否则返回id。
七、实验结论:
实验过程还算顺利,遇到的一系列问题都得到比较好的解决,当然分析器还有很大的改进空间,这里只是简单的实现了词素的识别及简单的判断。下一步的目标是完成界符后注释的判断,几种特殊运算符在不同的上下文中会有不同的含义,瑞和进行判断。例外一个附加功能就是利用浏览的形式直接从文件中读取源文件进行源代码获取,且分析信息可以另存为文本文件。
篇二:编译原理实验报告词法分析
编译原理实验报告
词法分析器
学院:计算机科学与技术
时间:20XX/6/9
一、问题描述选择计算机高级程序语言之一——c语言,运用恰当的词法分析技术线路,设
计和实现其对应的词法分析器
提示:技术线路选择如下两种之一:
正则式→nFA→DFA→minDFA→程序设计
或正则文法→nFA→DFA→minDFA→程序设计。
要求:分析器输出结果存入到磁盘文件中,具有出错处理功能。
二、系统分析
编译原理涉及词法分析,语法分析,语义分析及优化设计等各方面。词法分析阶段是编译过程的第一个阶段,是编译的基础。这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。词法分析程序实现这个任务。从左到右逐个字符对构成源程序的字符串进行扫描,依据词法规则,识别出一个一个的标记(token),把源程序变为等价的标记串序列。执行词法分析的程序称为词法分析器,也称为扫描器。本次实验,我选择用c++来实现这个词法分析器。
程序语言的单词符号一般分为以下六种:关键字、标识符、
常量、运算符、界符、字符串词法分析程序所输出的单词符号常常采用以下二元式
表示:(单词种别,单词自身的值),单词的种别是语法分析所需要的信息,而单词自身的值是编译其他阶段需要的信息。
单词的种别可以用整数编码表示,比如标识符编码为1,程序最后输出的形式应为:
关键字int(2,int)标识符t_val(1,t_val)常量
3.14e+2(3,3.14e+2)其中,本次实验设计的如下:(1)关键字有34个:分别包括
"char
前面32个是标准c的关键字,后两个是预编译的关键字。
(2)常量分为:小数,整数,浮点数,字符。本次实
验中,设计了小数,整数和浮点数,但是都没有包含后面的u,L,uL等标识。而单个字符常量并没有考虑。也就是‘a’表示的并不是对应的数值。
(3)运算符和界符:本次实验设计的运算符和界符很多,基本将所有的运算符都设计进去了。其中包括
+,++,+=,-,-=,->,--,*,*=,/,/=,[,],
,>=,=,==,>>,>>=, 但是还是有个别的运算符没有设计进去,比如?:,这是个三目的运算符,设计起来估计很麻烦,所以就没设计,还有就是强制类型转换(类型),取地址d={0~9};1.
关键字:关键字是最好识别的,他都是由字母组成,在程序中,只要写一个小程
序将设计的34个关键字保存在一个string类型的vector中,然后做一次循环,将字符串逐个与34个关键字对比,相同则取出对应的种别编码,存入事先设计好的vector中。
本次设计中关键字有34个:分别包括
"char
前面32个是标准c的关键字,后两个是预编译的关键字。2.
标识符:标识符的正规式为:(l|_)(l|d|_)*
对应的nFA为:
实际应用到程序上的DFA为:
其中,状态3中代表标识符。事实上,关键字是特殊的标识符,所以首先先将他们归为一类,之后再写程序将其区别,在这里就不画出图了。3.
常量分为:小数,整数,浮点数,字符。本次实验中,设计了小数,整数和浮点
数,但是都没有包含后面的u,L,uL等标识。而单个字符常量并没有考虑。也就是‘a’表示的并不是对应的数值,而是将‘作为符号记录,而将字母a当作了一个标识符,所以程序写的不是很到位,还有很多小细节上没有很好的处理。
而小数,整数,浮点数这三类我又将他归并后分为了无符号数和有符号数两类。在这里先给出无符号数的正规式和DFA。至于有符号数,除了开始有符号外,之后的判断与无符号数是一致的,所以在这里不在重复的给出,到了+号和—号的时候再给出对应的判断。
无符号数正规式:d(d)*|(d(d)*|ε)(.d(d)*(ε
|e(+|-|ε)d(d)*)|e(ε|+|-)d(d)*)下面给出无符号数的DFA:
解释一下上面图的终结状态:状态5:表示整数,如123,78等
状态6:表示错误,包括以数字开头字母结尾的错误标识符,有多个小数点的数字,有多个e或e的数字等,这些都是词法错误。状态10:表示小数,如12.34,7.1等状态13:表示带有指数前面是小数的数,比如1.2e+12,2.34e14等
篇三:编译原理实验报告一简单样本语言的词法分析器昆明理工大学信息工程与自动化学院学生实验报告
(20XX—20XX学年第一学期)
课程名称:开课实验室:20XX年12月03日
一、实验目的及内容
编译技术是理论与实践并重的课程,而其实验课要综合运用所学的多门课程的内容,用来完成
一个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的分析和设计的能力,进一步培养学生的编程能力。
调试并完成一个词法分析程序,加深对词法分析原理的理解。
二、实验原理及基本技术路线图(方框原理图或程序流程图)1、待分析的简单语言的词法
(1)关键字:beginifthenwhiledoend所有关键字都是小写。(2)运算符和界符:
:=+–*/>>==;()#
(3)其他单词是标识符(ID)和整型常数(num),通过以下正规式定义:
ID=letter(letter|digit)*num=digitdigit*
(4)空格由空白、制表符和换行符组成。空格一般用来分隔ID、num,运算符、
界符和关键字,词法分析阶段通常被忽略。
2、
各种单词符号对应的种别码
3、
词法分析程序的功能
输入:所给文法的源程序字符串。
输出:二元组(syn,token或sum)构成的序列。其中:syn为单词种别码;
token为存放的单词自身字符串;sum为整型常数。
二、
所用仪器、材料(设备名称、型号、规格等或使用软件)1台pc以及VIsuALc++6.0软件。三、
实验方法、步骤(或:程序代码或操作过程)
(1)程序代码:#include#include#include
charprog[80],token[8];charch;
intsyn,p,m=0,n,row,sum=0;
char*rwtab[6]={"begin
voidscaner(){
for(n=0;n if((ch>=az)||(ch>=AZ)){}
elseif((ch>=09))
ch=prog[p];p++;
m=0;
while((ch>=09)||(ch>=az)||(ch>=AZ)){}
token[m++]=\\0;p--;syn=10;for(n=0;n
if(strcmp(token,rwtab[n])==0){}
syn=n+1;break;token[m++]=ch;ch=prog[p++];
{{sum=0;
while((ch>=09)){sum=sum*10+ch-0;ch=prog[p++];
}
}p--;syn=11;if(sum>32767)
syn=-1;}
elseswitch(ch)
{case){syn=21;token[m++]=ch;
}
elseif(ch===){syn=22;token[m++]=ch;
}else{syn=23;p--;
}
break;
case>:m=0;token[m++]=ch;ch=prog[p++];if(ch===){syn= 24;token[m++]=ch;
}else{syn=20;p--;}
break;
case::m=0;token[m++]=ch;ch=prog[p++];if(ch===){syn= 18;token[m++]=ch;
}else{syn=17;p--;}
break;
case*:syn=13;token[0]=ch;break;case/:syn=14;token[0 ]=ch;break;case+:syn=15;token[0]=ch;break;case-:syn =16;token[0]=ch;break;case=:syn=25;token[0]=ch;brea k;case;:syn=26;token[0]=ch;break;