实验一文法分析方法及其应用文档格式.docx

上传人:b****5 文档编号:19834313 上传时间:2023-01-10 格式:DOCX 页数:14 大小:181.30KB
下载 相关 举报
实验一文法分析方法及其应用文档格式.docx_第1页
第1页 / 共14页
实验一文法分析方法及其应用文档格式.docx_第2页
第2页 / 共14页
实验一文法分析方法及其应用文档格式.docx_第3页
第3页 / 共14页
实验一文法分析方法及其应用文档格式.docx_第4页
第4页 / 共14页
实验一文法分析方法及其应用文档格式.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

实验一文法分析方法及其应用文档格式.docx

《实验一文法分析方法及其应用文档格式.docx》由会员分享,可在线阅读,更多相关《实验一文法分析方法及其应用文档格式.docx(14页珍藏版)》请在冰豆网上搜索。

实验一文法分析方法及其应用文档格式.docx

输入是一个文本文件,里面的内容是符合某个语言语法、词法要求的源代码(语法可参考课本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模板 > 节日庆典

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1