编译原理 词法分析实验报告完整版可运行.docx
《编译原理 词法分析实验报告完整版可运行.docx》由会员分享,可在线阅读,更多相关《编译原理 词法分析实验报告完整版可运行.docx(13页珍藏版)》请在冰豆网上搜索。
编译原理词法分析实验报告完整版可运行
中北大学软件学院
实验报告
专业
课程名称
学号
姓名
辅导教师成绩
实验日期
2014.11.26
实验时间
10:
00—11.30
1、实验名称:
词法分析器的设计与实现
2、实验目的
(1)掌握C语言单词符号的划分、正规式、状态转换图及词法分析器的实现。
(2)掌握词法分析程序的作用。
3、实验要求
(1)对任给的一个C语言源程序,能够滤掉空格、回车换行符、tab键及注释。
(2)识别各类单词符号,如关键字、标识符、运算符、常数、界符,结果以二元式形式输出,并构造符号表。
(3)输出有词法错误的单词及所在行号。
(在此阶段只能识别有限的词法错误)
4、实验原理
根据扫描到的单词符号的第一个字符的种类,分别转到相应的程序进行处理。
这些程序的功能就是识别以相应字符开头的各类单词符号。
5、实验步骤
(1)根据C语言各类单词的正规式,构造能识别各类单词的状态转换图。
(2)根据状态转换图,构造识别各类单词的词法分析器。
6、状态转换图及词法分析程序
(1)状态转换图
否
能
是
否
是
是
否
是
否
是
否
否
否
(2)程序源代码
#include
#include
usingnamespacestd;
#defineMAX22
charch='';
stringkey[15]={"begin","end","if","then","else","while","write","read",
"do","call","const","char","until","procedure","repeat"};
intIskey(stringc){//关键字判断
inti;
for(i=0;iif(key[i].compare(c)==0)return1;
}
return0;
}
intIsLetter(charc){//判断是否为字母
if(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A')))return1;
elsereturn0;
}
intIsDigit(charc){//判断是否为数字
if(c>='0'&&c<='9')return1;
elsereturn0;
}
voidanalyse(FILE*fpin){
stringarr="";
while((ch=fgetc(fpin))!
=EOF){
arr="";
if(ch==''||ch=='\t'||ch=='\n'){}
elseif(IsLetter(ch)){
while(IsLetter(ch)||IsDigit(ch)){
if((ch<='Z')&&(ch>='A'))ch=ch+32;
arr=arr+ch;
ch=fgetc(fpin);
}
fseek(fpin,-1L,SEEK_CUR);
if(Iskey(arr)){cout<elsecout<}
elseif(IsDigit(ch)){
while(IsDigit(ch)||ch=='.'&&IsDigit(fgetc(fpin))){
arr=arr+ch;
ch=fgetc(fpin);
}
fseek(fpin,-1L,SEEK_CUR);
cout<}
elseswitch(ch){
case'+':
case'-':
case'*':
case'=':
case'/':
cout<case'(':
case')':
case'[':
case']':
case';':
case'.':
case',':
case'{':
case'}':
cout<case':
':
{ch=fgetc(fpin);
if(ch=='=')cout<<":
="<<"\t$运算符"<else{cout<<"="<<"\t$运算符"<fseek(fpin,-1L,SEEK_CUR);}
}break;
case'>':
{ch=fgetc(fpin);
if(ch=='=')cout<<">="<<"\t$运算符"<if(ch=='>')cout<<">>"<<"\t$输入控制符"<else{cout<<">"<<"\t$运算符"<fseek(fpin,-1L,SEEK_CUR);}
}break;
case'<':
{ch=fgetc(fpin);
if(ch=='=')cout<<"<="<<"\t$运算符"<elseif(ch=='<')cout<<"<<"<<"\t$输出控制符"<elseif(ch=='>')cout<<"<>"<<"\t$运算符"<else{cout<<"<"<<"\t$运算符"<fseek(fpin,-1L,SEEK_CUR);}
}break;
default:
cout<}
}
}
voidmain(){
charin_fn[30];
FILE*fpin;
cout<<"请输入源文件名(包括路径和后缀名):
";
for(;;){
cin>>in_fn;
if((fpin=fopen(in_fn,"r"))!
=NULL)break;
elsecout<<"文件路径错误!
请输入源文件名(包括路径和后缀名):
";
}
cout<<"\n********************分析如下*********************"<analyse(fpin);
fclose(fpin);
getchar();
}
7、测试及结果
8、心得
通过本次试验我对编译原理这门课程有了一种不一样的感觉,我发现在编写程序之前应该要有一个整体的规划,然后在考虑细节问题,不断地发现问题,修改程序,使之精益求精。
通过实验,我对词法分析有了更进一步的认识和了解,在实验中还遇到了许多问题,通过不断地解决遇到的问题,我的能力也得到了提高。
另外,编写代码时一定要有耐心,不怕错,只要有了这种精神什么困难都可以克服。
在实验过程中我遇到许多问题,衷心感谢在这过程中帮助我的老师和同学们,谢谢你们,我会更加努力学习这门课程,迎难而上,学好这门课程!