词法分析实验报告Word格式.docx
- 文档编号:22744780
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:20
- 大小:80.79KB
词法分析实验报告Word格式.docx
《词法分析实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《词法分析实验报告Word格式.docx(20页珍藏版)》请在冰豆网上搜索。
实验一词法分析
1、实验目的
运用理论课中的知识编写一段程序,此程序能对于给定的源程序,从组成源程序的字符行中寻找出单词,并给出它们的种别和属性——输出二元组序列。
以便提供给语法分析的时候使用。
要求能识别所有的关键字,标志符等,并且能够对出先的一些词法规则的错误进行判断和必要的处理。
通过此次试验能对实验环境更加熟悉,对程序的编写和调试更加熟练,能把理论知识和代码相结合。
2、实验设计
1.原理:
读入源程序,得到单词表如图所示
词法分析器
源程序单词表
2.设计方法:
在扫描源程序字符串时一旦识别出关键字、分隔符、标识符、无符号之一,即以单词形式,各类单词均采用相同的结构,即二元式编码形式存储。
每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直至整个源程序全部扫描完毕并形成相应的单词表。
3.设计过程:
通过test语言的词法规则,把规则转化为一种方法,再将此方法用代码编写出来。
4.设计结果:
得到一个能识别test语言词法的源程序代码,可以通过此代码分析由test语言编写的源程序是否有语法错误,并且指出错误位置。
最终得到与源程序代码对应的单词表,为接下来的语法分析和语义分析奠基。
三、实验过程
过程:
1.根据书中test语言代码,得到一个基本的词法分析代码。
2.根据实验要求,修改词法分析代码得到符合要求的代码。
3.修改过程中遇到问题,及时更正。
4.测试数据,若测试不通过则通过调试等手段找出错误进行修改
实验中遇到的问题:
1.当标识符为数字开头时,无法识别
2.文件中末尾空行导致程序出错
3.write后面跟一串字符时程序遇到无法辨认字符
4.标识符过长导致程序出错
5.记录出错代码行
解决方案:
1.定义一个字符串来记录上一个单词,当上一个单词为数字,而此时的单词为字母,
且是标识符,则是标识符错误。
2.经过调试,文件末尾空行的值为“-1”,所以当文件读到值为“-1”的字符时,文件
结束。
3.新建一个名为“STR”的类型,用来存储write后面引号里面的内容,若遇到换行
时未出现结束引号,则词法分析错误。
4.用变量j来记录标识符的长度,若长度超过预定范围则标识符定义错误。
5.可通过记录文件读取时换行符出现的次数来记录当前代码行,从而得到错误代码
行
4、实验结果
测试代码:
测试结果:
通过结果可以看出,数据中的标识符定义过长,在读取的时候程序自动报错,程序停止执行
测试代码:
测试结果:
通过结果可以看出,源文件中有非法标识符,程序运行时发现错误,程序停止执行
通过结果可以看出,源代码中的非法字符被程序发现,并报错,程序停止执行。
通过结果可以看出,源文件中的符号错误,被程序发现并找出,程序停止执行。
通过测试结果可以看出,源代码中的全部数据都转化为了一个单词表。
测试数据:
通过测试结果可以看出,源文件中的注释部分都没有出现在单词表中,虽然这样会有语法错误,但是这不是词法分析的范围。
通过测试数据可以看出,文件中虽然想要注释掉部分内容,但是由于注释符号的错误,使得注释失败,引起源文件错误。
通过测试结果可以看出,此源代码中虽然有复合语句,但是词法分析只分析词法构造是否正确,所以全部数据均转化到单词表中。
通过测试结果可以看出,write后面的一串字符被转化为了STR类型,并存入到单词表中。
通过测试结果可以看出,这组数据和上一组数据一样,均无错误。
4、讨论与分析
通过实验,可以看出,很多书中的理论知识完全可以通过一定的手段转化为代码,进行很多操作,也可以看出理论和实践是很容易结合在一起的,主要是看你能否想到一种很好的手段和方式。
而能否得到一种很好的手段,就需要大量的知识积累和不断的思考,更重要的是不断的实践和努力。
通过实验测试数据和结果,可以看出,很多时候没有想到的错误不代表就没有错误,很多错误隐性存在,只是无法想到。
所以,我们在分析问题的时候需要多思考,更全面的去想问题。
5、附录:
while(ch!
=EOF)
{
//遇到空格,换行继续读取下一个字符
while(ch=='
'
||ch=='
\n'
||ch=='
\t'
)
{
//当遇到换行时,记录行数
if(ch=='
line++;
ch=getc(fin);
}
//标识符判断,判断是否为字母
if(isalpha(ch))
token[0]=ch;
j=1;
//判断是否为字母或数字
while(isalnum(ch))
{
//标识符长度判断
if(j>
=39)
{
cout<
<
"
第"
<
line<
行"
标示符超出!
"
endl;
fclose(fin);
fclose(fout);
return1;
}
token[j++]=ch;
ch=getc(fin);
}
token[j]='
\0'
;
n=0;
//关键字判断
while((n<
keywordSum)&
&
strcmp(token,keyword[n]))
n++;
if(n>
=keywordSum)
//判断是否为非法标识符
if(strcmp(ch2,"
NUM"
)==0)
标示符定义错误!
strcpy(ch2,"
ID"
);
fprintf(fout,"
%s\t%s\n"
ch2,token);
}
else
strcpy(ch2,token);
token,token);
}
//数字判断
elseif(isdigit(ch))
while(isdigit(ch))
strcpy(ch2,"
fprintf(fout,"
//单分解符判读
elseif(strchr(singleword,ch)>
0)
token[1]='
strcpy(ch2,token);
token,token);
//双分界符
elseif(strchr(doubleword,ch)>
if(ch=='
='
token[1]=ch;
token[2]='
token[1]='
token,token);
//注释
elseif(ch=='
/'
*'
charch1;
ch1=getc(fin);
do
ch=ch1;
ch1=getc(fin);
}while((ch!
='
||ch1!
)&
ch1!
=EOF);
token[0]='
//write字符串判断
'
intj=0;
strcpy(str,"
0"
while(ch!
if(ch=='
缺少引号!
str[j++]=ch;
str[j]='
"
STR"
str);
//非正常字符
else
//判断是否遇到文件末端的空行
if(ch==-1)
break;
cout<
非法字符"
ERROR"
token);
es=3;
break;
}
六、实验者自评(主要从实验态度、方法、效果上给一个客观公正的自我评价)
注:
每个部分根据情况可以再分子标题,前提是层次清晰、逻辑性强。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 词法 分析 实验 报告