实验一文法分析方法及其应用文档格式.docx
- 文档编号:19834313
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:14
- 大小:181.30KB
实验一文法分析方法及其应用文档格式.docx
《实验一文法分析方法及其应用文档格式.docx》由会员分享,可在线阅读,更多相关《实验一文法分析方法及其应用文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
输入是一个文本文件,里面的内容是符合某个语言语法、词法要求的源代码(语法可参考课本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<
fstream>
接下来,在函数中,分别进行相应的操作,其中ofstream类型为写入文件中,ifstream为读出文件操作。
2.如何分词?
第一部分实验要求进行分词,源代码中的单词可以分成3类,一类是约定的保留字,一类是普通标识符,最后一类是数字
2.1如何识别保留字?
建立一个数组存储保留字,把读取到的字符串与数组中的的每个保留字进行比较,若相等的则为保留字,否则不是。
2.2如何识别标识符?
先对其他的类型(除数字和标识符)的保留字进行判断,如果以上全都不满足,那么对剩下的进行判断,如果首个字符为字母或者下划线,则为标识符。
2.3如何识别数字?
对以上所有的类型判断完之后,如果都不满足,则对剩下的判断,如果首个为数字,则该字符串为数字。
3.如何产生符合要求的随机停用词和待处理文本
第二部分实验要求先产生随机的停用词和待处理文本,主要是如何产生符合要求的这些词或文本?
3.1如何产生随机停用词?
用rand()函数得到随机数除以2取余数将产生的字符分为大小写两种情况
其中,大写为:
char(rand()%26+'
A'
);
小写为:
a'
然后进行循环。
3.2如何控制随机停用词的平均长度(而不是固定长度)?
用rand()%d来进行产生,即可得到。
3.3如何产生待处理文本中的“段落”?
在循环过程中,每产生5个停用词就进行换行。
3.4如何控制待处理文本的长度?
通过产生的行数来控制。
4.如何过滤停用词
第二部分实验最后要求把待处理文本中出现的停用词替换为“**”,那你如何准确、快速判断出文本中的停用词?
将所有停用词读出来放进一个字符串数组,然后逐一读出文本中的字符串与停用词数组中的所有元素进行比较,如果找到相同的则该字符串为停用词,与此同时跳出循环。
5.如何设计文法类?
文法类里面,有3个集合,1个特别的非终结符——开始符号。
集合应如何表示?
Set<
aType>
是常见的范型,可使用例如Set<
Production>
来表示产生式的集合。
也可直接采用数组等形式来表示,那种方法更好?
分析并做出你的设计。
我认为采用数组更好,因为这样在接下来的字符串操作中,我们可以通过循环,直接对产生式进行操作,然后进行判断即可。
6.如何实现无用文法的化简算法?
算法2.1、2.2课本已经给出了说明,那你如何将算法说明变成代码?
有什么主要内容?
讲一个产生式分成三部分,分别为终结符,非终结符和产生式符号,产生式符号左面的为非终结符,右面的为终结符或者非终结符。
实验过程及内容:
实验过程及内容,处理代码设计说明、代码及其注释外,特别关注编程过程。
要求,至少有一张照片,照片上出现你(正面)+正在写的代码(电脑要有外观)
实验1.1
#include<
iostream>
string>
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("
ofstreamout("
jieguo.txt"
while(infile.good()){
infile>
>
str;
//读出字符串
if(str==fuzhi)//与前面建立的保留字字符串数组比较
out<
(赋值运算符,"
<
str<
)\n"
//识别保留字
elseif(str==jiafa)
out<
(加法运算符,"
elseif(str==chengfa)
(乘法运算符,"
elseif(str==fenge)
(分隔符,"
elseif(str==guanjian[0]||str==guanjian[1])
(关键字,"
elseif(str==kuohao[0]||str==kuohao[1])
(括号,"
elseif(str==guanxi)
(关系符,"
elseif(str==zizeng)
(自增运算符,"
elseif((str[0]>
='
&
str[0]<
z'
)||(str[0]>
Z'
)||str[0]=='
_'
)//识别标识符
out<
(标识符,"
elseif(str[0]>
0'
9'
)//识别整数
(整数,"
}
out.close();
infile.close();
}
实验1.2
inti,j,k,n=0,m=0;
stringtingyong[500];
stringwenzhang[500];
tingyong.txt"
//写入停用词表
for(j=0;
j<
500;
j++)
{
for(i=0;
i<
=rand()%8;
i++)//生成单词
if(rand()%2)//生成单个字母
outfile<
else
\n"
}
wenzhang.txt"
//写入文章文本
for(k=0;
k<
100;
k++)//生成文章
{for(j=0;
5;
j++)//生成段落
out<
}
out.close();
//读出停用词
tingyong[n];
//将停用词放进数组
n++;
}
infile.close();
ifstreamin("
//读出文章
while(in.good()){
in>
wenzhang[m];
//将文章字符串放进数组
m++;
in.close();
for(m=0;
m<
m++)
for(n=0;
n<
n++)
if(wenzhang[m]==tingyong[n])//将文章字符串与停用词进行比较
{wenzhang[m]="
**"
//改写文章字符串
break;
ofstreamot("
//写入文章
m=0;
j++)
{for(i=0;
i++)
{ot<
wenzhang[m]<
ot<
ot.close();
实验1.3
实验结论:
1.测试用例的设计与说明
对每部分的实验,你分别设计了什么测试数据(测试用例)进行测试,你设计测试数据的出发点是什么,有什么目的?
出发点:
对包括3个语句的语法进行识别
目的:
输出文本
对文章内的停用词进行替换.
输出文本.
停用词表
未修改文章
修改后的文章
出发点:
与课本一样的话,方便自己进行判断和操作。
验证自己的操作与算法是否一致,通过课本例题,可以大大节省我们的时间。
输出产生式
2.测试结果的说明与分析
对测试(实验)结果进行分析说明
1.1得到了预想中的文本,对文本中语句的保留字,标识符和整数进行了识别和输出.
1.2生成了随机的停用词表和文章,并将文章中的停用词进行了替换.
1.3对产生式进行了相应的化简和删除,得到了我们最终锁期望的结果。
心得体会:
除了实验的心得体会外,
还要额外增加说明你对文法、直接推导、推导、句型、句子、语言这些概念的理解。
指导教师批阅意见:
成绩评定:
指导教师签字:
蔡树彬
2014年11月5日
备注:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 文法 分析 方法 及其 应用