编译原理 词法分析实验报告完整版可运行.docx

上传人:b****6 文档编号:2998720 上传时间:2022-11-17 格式:DOCX 页数:13 大小:134.12KB
下载 相关 举报
编译原理 词法分析实验报告完整版可运行.docx_第1页
第1页 / 共13页
编译原理 词法分析实验报告完整版可运行.docx_第2页
第2页 / 共13页
编译原理 词法分析实验报告完整版可运行.docx_第3页
第3页 / 共13页
编译原理 词法分析实验报告完整版可运行.docx_第4页
第4页 / 共13页
编译原理 词法分析实验报告完整版可运行.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

编译原理 词法分析实验报告完整版可运行.docx

《编译原理 词法分析实验报告完整版可运行.docx》由会员分享,可在线阅读,更多相关《编译原理 词法分析实验报告完整版可运行.docx(13页珍藏版)》请在冰豆网上搜索。

编译原理 词法分析实验报告完整版可运行.docx

编译原理词法分析实验报告完整版可运行

 

中北大学软件学院

 

实验报告

 

专业

课程名称

学号

姓名

辅导教师成绩

实验日期

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;i

if(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、心得

通过本次试验我对编译原理这门课程有了一种不一样的感觉,我发现在编写程序之前应该要有一个整体的规划,然后在考虑细节问题,不断地发现问题,修改程序,使之精益求精。

通过实验,我对词法分析有了更进一步的认识和了解,在实验中还遇到了许多问题,通过不断地解决遇到的问题,我的能力也得到了提高。

另外,编写代码时一定要有耐心,不怕错,只要有了这种精神什么困难都可以克服。

在实验过程中我遇到许多问题,衷心感谢在这过程中帮助我的老师和同学们,谢谢你们,我会更加努力学习这门课程,迎难而上,学好这门课程!

 

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

当前位置:首页 > 农林牧渔 > 水产渔业

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

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