实验一文法分析方法及其应用.docx
- 文档编号:6812830
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:14
- 大小:181.30KB
实验一文法分析方法及其应用.docx
《实验一文法分析方法及其应用.docx》由会员分享,可在线阅读,更多相关《实验一文法分析方法及其应用.docx(14页珍藏版)》请在冰豆网上搜索。
实验一文法分析方法及其应用
深圳大学实验报告
课程名称:
编译原理
实验项目名称:
文法分析方法及其应用
学院:
数学与计算科学学院
专业:
信息与计算科学
指导教师:
蔡树彬
报告人:
学号:
班级:
息班
实验时间:
2014年9月23日至10月28日
实验报告提交时间:
2014年11月3日
教务处制
实验目的与要求:
目的:
针对分词、停用词过滤等文法分析应用问题,设计并实现相应的解决方案,再通过设计文法相关类族,以及实现文法化简等方法,既加深对抽象的文法、推导、语言等形式语言理论基础概念的理解与掌握,也加强对面向对象程序编写能力和计算思维的培养。
要求:
第一部分:
分词
输入:
输入是一个文本文件,里面的内容是符合某个语言语法、词法要求的源代码(语法可参考课本P104,包括语句表、for循环和赋值语句等),例如“position:
=initial+rate*60;”;
输出:
设计并实现对输入文件的处理(禁用正则表达式),以获得如下输出,输出是一个文本文件,对前面例子,里面内容是:
(标识符,position)
(赋值运算符,:
=)
(标识符,initial)
(加法运算符,+)
(标识符,rate)
(乘法运算符,*)
(整数,60)
(分隔符,;)
第二部分:
停用词过滤,分为“产生随机停用词”、“产生随机待过滤文本”和“过滤停用词”3个小实验。
产生随机停用词:
生成一个文件长度和单词平均长度可控的文本文件,要求字符集为26个字母,每行生产一个单词,每个单词的长度随机,全部单词的平均长度可控制,通常为4、5(非严格要求),总共输出的文件长度可控制。
产生随机待过滤文本:
生成一个文件大小和单词平均长度可控的文本文件,要求
字符集为26个字母+“”(空格)+“\r\n”(回车换行);从文件开始一直到结束,持续输出,不额外换行(除非遇到生成的\r\n),总共输出的文件大小可控制。
过滤停用词:
写一个程序,快速扫描待过滤文本,然后将待过滤文本中出现的所有停用词,替换为“**”,要求禁用正则表达式,不要误杀(例如,若停用词包括“abc”,那么“abcd”等不应该被误杀。
第三部分:
文法化简
设计文法类,实现对文法G[S]=(Vt,Vn,P,S)的文件读写,文法的文件表示形式以及内存表示形式可自定义。
本质上,文法就是3个集合+1个符号,重点(难点)是产生式集合如何处理。
文法的文本形式可根据自己需要自由定义。
在前述的基础上,实现文法化简的无用符号及无用产生式消除算法(即课本算法2.1、2.2)。
方法、步骤:
要完成本实验,依据实验要求进行分解,需要完成的实验步骤是:
1.如何读写文件?
读写文法文件内容,需要用到文件IO,查阅、复习文件IO操作。
首先,在代码的开头申明#include
2.如何分词?
第一部分实验要求进行分词,源代码中的单词可以分成3类,一类是约定的保留字,一类是普通标识符,最后一类是数字
2.1如何识别保留字?
建立一个数组存储保留字,把读取到的字符串与数组中的的每个保留字进行比较,若相等的则为保留字,否则不是。
2.2如何识别标识符?
先对其他的类型(除数字和标识符)的保留字进行判断,如果以上全都不满足,那么对剩下的进行判断,如果首个字符为字母或者下划线,则为标识符。
2.3如何识别数字?
对以上所有的类型判断完之后,如果都不满足,则对剩下的判断,如果首个为数字,则该字符串为数字。
3.如何产生符合要求的随机停用词和待处理文本
第二部分实验要求先产生随机的停用词和待处理文本,主要是如何产生符合要求的这些词或文本?
3.1如何产生随机停用词?
用rand()函数得到随机数除以2取余数将产生的字符分为大小写两种情况
其中,大写为:
char(rand()%26+'A');
小写为:
char(rand()%26+'a');
然后进行循环。
3.2如何控制随机停用词的平均长度(而不是固定长度)?
用rand()%d来进行产生,即可得到。
3.3如何产生待处理文本中的“段落”?
在循环过程中,每产生5个停用词就进行换行。
3.4如何控制待处理文本的长度?
通过产生的行数来控制。
4.如何过滤停用词
第二部分实验最后要求把待处理文本中出现的停用词替换为“**”,那你如何准确、快速判断出文本中的停用词?
将所有停用词读出来放进一个字符串数组,然后逐一读出文本中的字符串与停用词数组中的所有元素进行比较,如果找到相同的则该字符串为停用词,与此同时跳出循环。
5.如何设计文法类?
文法类里面,有3个集合,1个特别的非终结符——开始符号。
集合应如何表示?
Set
也可直接采用数组等形式来表示,那种方法更好?
分析并做出你的设计。
我认为采用数组更好,因为这样在接下来的字符串操作中,我们可以通过循环,直接对产生式进行操作,然后进行判断即可。
6.如何实现无用文法的化简算法?
算法2.1、2.2课本已经给出了说明,那你如何将算法说明变成代码?
有什么主要内容?
讲一个产生式分成三部分,分别为终结符,非终结符和产生式符号,产生式符号左面的为非终结符,右面的为终结符或者非终结符。
实验过程及内容:
实验过程及内容,处理代码设计说明、代码及其注释外,特别关注编程过程。
要求,至少有一张照片,照片上出现你(正面)+正在写的代码(电脑要有外观)
实验1.1
#include
#include
#include
usingnamespacestd;
voidmain(){
stringfuzhi=":
=";
stringjiafa="+";
stringchengfa="*";
stringfenge=";";
stringguanxi="<=";
stringzizeng="++";
stringkuohao[2]={"(",")"};
stringguanjian[2]={"for","if"};//建立保留字字符串数组
stringstr;
ofstreamoutfile("wenfa.txt");//写入wenfa文本
outfile<<"if(initial<=5)\nfor(i;i<=5;i++)\nposition:
=initial+rate*60;";
outfile.close();
ifstreaminfile("wenfa.txt");
ofstreamout("jieguo.txt");
while(infile.good()){
infile>>str;//读出字符串
if(str==fuzhi)//与前面建立的保留字字符串数组比较
out<<"(赋值运算符,"< elseif(str==jiafa) out<<"(加法运算符,"< elseif(str==chengfa) out<<"(乘法运算符,"< elseif(str==fenge) out<<"(分隔符,"< elseif(str==guanjian[0]||str==guanjian[1]) out<<"(关键字,"< elseif(str==kuohao[0]||str==kuohao[1]) out<<"(括号,"< elseif(str==guanxi) out<<"(关系符,"< elseif(str==zizeng) out<<"(自增运算符,"< elseif((str[0]>='a'&&str[0]<='z')||(str[0]>='A'&&str[0]<='Z')||str[0]=='_')//识别标识符 out<<"(标识符,"< elseif(str[0]>='0'&&str[0]<='9')//识别整数 out<<"(整数,"< } out.close(); infile.close(); } 实验1.2 #include #include #include usingnamespacestd; voidmain(){ inti,j,k,n=0,m=0; stringtingyong[500]; stringwenzhang[500]; ofstreamoutfile("tingyong.txt");//写入停用词表 for(j=0;j<500;j++) { for(i=0;i<=rand()%8;i++)//生成单词 if(rand()%2)//生成单个字母 outfile< else outfile< outfile<<"\n"; } outfile.close(); ofstreamout("wenzhang.txt");//写入文章文本 for(k=0;k<100;k++)//生成文章 {for(j=0;j<5;j++)//生成段落 { for(i=0;i<=rand()%8;i++)//生成单词 if(rand()%2)//生成单个字母 out< else out< out<<""; } out<<"\n"; } out.close(); ifstreaminfile("tingyong.txt");//读出停用词 while(infile.good()){ infile>>tingyong[n];//将停用词放进数组 n++; } infile.close(); ifstreamin("wenzhang.txt");//读出文章 while(in.good()){ in>>wenzhang[m];//将文章字符串放进数组 m++; } in.close(); for(m=0;m<500;m++) for(n=0;n<500;n++) if(wenzhang[m]==tingyong[n])//将文章字符串与停用词进行比较 {wenzhang[m]="**";//改写文章字符串 break; } ofstreamot("wenzhang.txt");//写入文章 m=0; for(j=0;j<100;j++) {for(i=0;i<5;i++) {ot< m++; } ot<<"\n"; } ot.close(); } 实验1.3 实验结论: 1.测试用例的设计与说明 对每部分的实验,你分别设计了什么测试数据(测试用例)进行测试,你设计测试数据的出发点是什么,有什么目的? 实验1.1 出发点: 对包括3个语句的语法进行识别 目的: 输出文本 实验1.2 出发点: 对文章内的停用词进行替换. 目的: 输出文本. 停用词表 未修改文章 修改后的文章 实验1.3 出发点: 与课本一样的话,方便自己进行判断和操作。 目的: 验证自己的操作与算法是否一致,通过课本例题,可以大大节省我们的时间。 输出产生式 2.测试结果的说明与分析 对测试(实验)结果进行分析说明 1.1得到了预想中的文本,对文本中语句的保留字,标识符和整数进行了识别和输出. 1.2生成了随机的停用词表和文章,并将文章中的停用词进行了替换. 1.3对产生式进行了相应的化简和删除,得到了我们最终锁期望的结果。 心得体会: 除了实验的心得体会外, 还要额外增加说明你对文法、直接推导、推导、句型、句子、语言这些概念的理解。 指导教师批阅意见: 成绩评定: 指导教师签字: 蔡树彬 2014年11月5日 备注:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 文法 分析 方法 及其 应用