竭诚为您提供优质文档/双击可除编译原理词法分析器实验报告
篇一:编译原理词法分析器实验报告
曲阜师范大学实验报告
计算机系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","int","short","long","signed","unsigned","fl oat","double","const","void","volatile","enum","str uct","union","typedef","auto","extern","static","re gister","if","else","switch","case","default","whil e","do","for","break","continue","goto","return","s izeof","#include","#define"
前面32个是标准c的关键字,后两个是预编译的关键字。
(2)常量分为:小数,整数,浮点数,字符。
本次实
验中,设计了小数,整数和浮点数,但是都没有包含后面的u,L,uL等标识。
而单个字符常量并没有考虑。
也就是‘a’表示的并不是对应的数值。
(3)运算符和界符:本次实验设计的运算符和界符很
多,基本将所有的运算符都设计进去了。
其中包括
+,++,+=,-,-=,->,--,*,*=,/,/=,[,],
,>=,=,==,>>,>>=, 但是还是有个别的运算符没有设计进去,比如?:,这是个三目的运算符,设计起来估计很麻烦,所以就没设计,还有就是强制类型转换(类型),取地址d={0~9};1.
关键字:关键字是最好识别的,他都是由字母组成,在程序中,只要写一个小程
序将设计的34个关键字保存在一个string类型的vector中,然后做一次循环,将字符串逐个与34个关键字对比,相同则取出对应的种别编码,存入事先设计好的vector中。
本次设计中关键字有34个:分别包括
"char","int","short","long","signed","unsigned","fl oat","double","const","void","volatile","enum","str uct","union","typedef","auto","extern","static","re gister","if","else","switch","case","default","whil e","do","for","break","continue","goto","return","s izeof","#include","#define"
前面32个是标准c的关键字,后两个是预编译的关键字。
2.。