词法分析实验报告Word格式文档下载.docx

上传人:b****7 文档编号:22454843 上传时间:2023-02-04 格式:DOCX 页数:12 大小:55.84KB
下载 相关 举报
词法分析实验报告Word格式文档下载.docx_第1页
第1页 / 共12页
词法分析实验报告Word格式文档下载.docx_第2页
第2页 / 共12页
词法分析实验报告Word格式文档下载.docx_第3页
第3页 / 共12页
词法分析实验报告Word格式文档下载.docx_第4页
第4页 / 共12页
词法分析实验报告Word格式文档下载.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

词法分析实验报告Word格式文档下载.docx

《词法分析实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《词法分析实验报告Word格式文档下载.docx(12页珍藏版)》请在冰豆网上搜索。

词法分析实验报告Word格式文档下载.docx

{

inta,b;

a=10;

b=a+20;

}#

要求输出如右图。

要求:

1、将单词分为五种

识别关键字:

main、if、int、for、while、do、return、break、continue;

单词种别码为1。

标识符;

单词种别码为2。

常数为无符号整形数;

单词种别码为3。

运算符包括:

+、-、*、/、=、>

、<

、>

=、<

=、!

=;

单词种别码为4。

分隔符包括:

、;

、{、}、(、);

单词种别码为5。

2、使用一符一种的分法

关键字、运算符和分界符可以每一个均为一种

标识符和常数仍然一类一种

三、实验内容

1、功能描述

改程序是一个实现词法分析的功能,能识别5种单词,其他单词报错。

2、程序结构描述

intIsKey(char*Word)关键字匹配函数,查询是否为关键字,若是,返回值为1,否则为0。

intIsAlpha(charc)查看是否为字母,若是,返回值为1,否则为0。

intIsNum(charc)查看是否为数字,若是,返回值为1,否则为0。

voidscanner(FILE*fp)扫描函数,扫描程序中的字符串并调用上述三种函数检查是否是字母、数字,是否是关键字,并输出。

fseek(fp,-1,1)回退一个字符。

fgetc(fp)从数据流中区下一个字符。

fopen 

文件打开函数,返回指向文件第一个字符的指针

四、实验结果

测试内容为

b=a+20;

结果

测试代码为

voidmain()

if(a=10;

b+=20;

c=%;

结果为

测试代码

if(a<

="

10"

c=%@;

return0;

五、实验过程记录

1、因为用到回退函数fseek(),而以前没有用过这个函数,所以开始时很苦恼,不知道如何回退一个字符,后来问了同学,才明白原来有这么一个函数,顿时豁然开朗。

2、本次试验中word[20]保存字符串时,不能正确保存,总是出错,原因是while(IsNum(ch)||IsAlpha(ch)){

Word[i]=ch;

i++;

ch=fgetc(fp);

}中,i++与Word[i]=ch;

次序不对,后来多次思索,发现问题。

六、实验总结

本次实验花了将近一个下午才完成。

在纸上设计的时间大约40分钟,剩下的时间是录入和调试。

本次实验使我认识到,一段时间搁置,不编程序,水平会下降,好多有关c语言的知识会忘掉,所以以后我会经常写写程序。

另外,通过本次实验,我又进一步加深对词法分析原理的理解。

总的来说,获益匪浅!

附录

#include<

>

Char*Key[9]={"

void"

"

main"

int"

if"

then"

else"

return"

break"

continue"

};

charch;

//存储识别出的单词流

intIsAlpha(charc){//判断是否为字母

if(((c<

='

z'

)&

&

(c>

a'

))||((c<

Z'

A'

)))return1;

elsereturn0;

}

intIsNum(charc){//判断是否为数字

if(c>

0'

c<

9'

)return1;

}

intIsKey(char*Word){//识别关键字函数

intm,i;

for(i=0;

i<

8;

i++){

if((m=strcmp(Word,Key[i]))==0)

return1;

}

return0;

voidscanner(FILE*fp){//扫描函数

charWord[20]={'

\0'

charch;

inti,c;

ch=fgetc(fp);

//获取字符,指针fp并自动指向下一个字符

if(IsAlpha(ch)){//判断该字符是否是字母

Word[0]=ch;

ch=fgetc(fp);

i=1;

while(IsNum(ch)||IsAlpha(ch)){//判断该字符是否是字母或数字

}

Word[i]='

;

//'

代表字符结束(空格)

fseek(fp,-1,1);

//回退一个字符

c=IsKey(Word);

//判断是否是关键字

if(c==0)cout<

<

"

(2,"

Word<

'

)'

endl;

//不是关键字

elsecout<

(1,"

//输出关键字

else//开始判断的字符不是字母

if(IsNum(ch)){//判断是否是数字

Word[0]=ch;

i=1;

while(IsNum(ch)){

Word[i]=ch;

i++;

ch=fgetc(fp);

}

Word[i]='

fseek(fp,-1,1);

//回退

cout<

(3,"

else//开始判断的字符不是字母也不是数字

{

switch(ch){

case'

['

:

]'

('

{'

}'

'

cout<

(5,"

break;

+'

ch=fgetc(fp);

if(ch=='

||ch=='

){

Word[1]=ch;

cout<

(4,"

//运算符"

+="

或判断结果为"

++"

}

else{

fseek(fp,-1,1);

//判断结果为"

+"

break;

-'

Word[1]=ch;

//判断结果为"

-"

*'

/'

!

if(ch=='

cout<

4\t"

case'

{

fseek(fp,-1,1);

default:

(无法识别字符,"

}

FILE*fp;

fp=fopen("

c:

\\"

r"

);

if(fp==NULL)//读取文件内容,并返回文件指针,该指针指向文件的第一个字符

{cout<

读入文件错误!

exit(0);

*******************词法分析结果如下*******************\n"

while(ch!

#'

if(ch=='

)break;

//文件以#结尾,作为扫描结束条件

elseif(ch=='

'

\t'

\n'

){}//忽略空格,空白,和换行

else{

//回退一个字节开始识别单词流

scanner(fp);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

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

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