编译原理实验报告实验一编写词法分析程序09123132徐裕.docx
- 文档编号:24314513
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:12
- 大小:103.22KB
编译原理实验报告实验一编写词法分析程序09123132徐裕.docx
《编译原理实验报告实验一编写词法分析程序09123132徐裕.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告实验一编写词法分析程序09123132徐裕.docx(12页珍藏版)》请在冰豆网上搜索。
编译原理实验报告实验一编写词法分析程序09123132徐裕
编译原理实验报告:
实验一编写词法分析程序09123132徐裕
编译原理实验报告
实验名称:
编写词法分析程序
实验类型:
验证型实验
指导教师:
何中胜
专业班级:
09软件Y
姓名:
徐裕
学号:
09123132
电子邮件:
564747336@
实验地点:
秋白楼B720
实验成绩:
日期:
2012年4月18日
一、实验目的
通过设计。
测试词法分析器程序,实现从源程序中分出各种单词的方法,熟悉词法分析程序中的工具自动机,进一步理解自动机理论,掌握文法转换成自动机的技术及有穷自动机实现的方法。
通过本实验,应达到以下目标:
1、掌握从源程序文件中读取有效字符的方法和产生源程序的内容表达式的方法
2、掌握词法分析的试验方法
3、上机测试编出的词法分析程序
二、实验过程
1.首先建好关键字表,分界符表和运算符表。
指针数组k为关键字表,每个数组元素存放一个关键字。
采用不定长的方式。
指针数组P存放分界符。
为了简单起见,分界符、算术运算符和关系运算符都放在p表中,合并成一类。
2.instring数组为输入源程序和输出单词的单词缓存。
3.词法分析过程
根据从文件读到的第一个字符(有时还需读第二个字符),判断单词类,产生类号:
以字符1表示关键字;2表示标识符;3表示常数;4表示分界符;5表示运算符。
4.根据第一个字符来写出相应的处理程序和顺序,流程图如下:
5.编写程序。
三、实验结果
1.运行程序前先建好一个文本文件(09123132.txt),假如内容如图所示。
2.运行程序,分析结果在dos中显示,每一个词都按要求被分析出来,并把每个词的类型也打印出来,如下图所示:
四、讨论与分析
实验内容我通过上网查找各种资料,并逐步的了解题目的要求,之后在编写上面,关键字处理、标识符和数字处理代码写的比较顺,但是还是在各种符号上面吃亏,程序并不是预期的,经过几次更改后,实验达到了要求,程序全部写完。
五、附录:
关键代码(给出适当注释,可读性高)
voidmain()
{
voidlexical(FILE*FP);
inti;
FILE*fp;//指针
//printf("请创建k表:
\n");//创建k表
k[0]="BEGIN";
k[1]="DO";
k[2]="ELSE";
k[3]="END";
k[4]="IF";
k[5]="THEN";
k[6]="VAR";
k[7]="WHILE";
//printf("请创建p表:
\n");//创建p表
p[0]=",";
p[1]=";";
p[2]=".";
p[3]=":
=";
p[4]="(";
p[5]=")";
p[6]="+";
p[7]="-";
p[8]="*";
p[9]="/";
p[10]="<";
p[11]="<=";
p[12]="=";
p[13]=">";
p[14]=">=";
p[15]="<>";
if((fp=fopen("09123132.txt","r"))==NULL)//读取文件夹下的文件
{
printf("Cannotopenthefile\n");
exit(0);
}
charch,ch1;
intn=0;
ch1=ch=fgetc(fp);
do
{
if(ch1>='a'&&ch1<='z'||ch1>='A'&&ch1<='Z')
{
type=1;//处理关键字和标识符
if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z'||ch>='0'&&ch<='9')
{
instring[n++]=ch;
}
else
{
instring[n++]='\0';
strupr(instring);
for(i=0;i<=7;i++)
if(strcmp(instring,k[i])==0)break;
if(i<=7)
type=1;
else
type=2;
printf("%d\t",type);
strlwr(instring);
puts(instring);
n=0;
ch1=ch;
instring[n++]=ch1;
}
}
else
if(ch1>='0'&&ch1<='9')
{
type=3;//处理常数
if(ch>='0'&&ch<='9')
instring[n++]=ch;
else
{if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')
{
instring[n++]=ch;
printf("error!
!
\t");
puts(instring);
n=0;
ch=fgetc(fp);
ch1=ch;
instring[n++]=ch1;
}
else
{
instring[n++]='\0';
printf("%d\t",type);
puts(instring);
n=0;
ch1=ch;
instring[n++]=ch1;
}
}
}
else
{
type=4;//处理其他
if(ch1==''||ch1=='\n'||ch1=='\t')
{n=0;
ch1=ch;
instring[n++]=ch1;
}
else
if(ch1==':
')
{
if(ch=='=')
{
instring[n++]=ch;
instring[n]='\0';
printf("%d\t",type);
puts(instring);
ch=fgetc(fp);
n=0;
ch1=ch;
instring[n++]=ch1;
}
else
{
instring[n]='\0';
printf("error!
\t");
puts(instring);
n=0;
ch1=ch;
instring[n++]=ch1;
}
}
else
if(ch1=='<')
{
type=5;
printf("%d\t",type);
if(ch=='='||ch=='>')
{
instring[n++]=ch;
instring[n]='\0';
puts(instring);
ch=fgetc(fp);
n=0;
ch1=ch;
instring[n++]=ch1;
}
else
{
instring[n]='\0';
puts(instring);
n=0;
ch1=ch;
instring[n++]=ch1;
}
}
else
if(ch1=='>')
{
type=5;
printf("%d\t",type);
if(ch=='=')
{
instring[n++]=ch;
instring[n]='\0';
puts(instring);
ch=fgetc(fp);
n=0;
ch1=ch;
instring[n++]=ch1;
}
else
{
instring[n]='\0';
puts(instring);
n=0;
ch1=ch;
instring[n++]=ch1;
}
}
else
{
instring[n]='\0';
for(i=0;i<=15;i++)
{
if(strcmp(instring,p[i])==0)
{
break;
}
}
if(i<=5)
type=4;
else
if(i<=15)
type=5;
printf("%d\t",type);
puts(instring);
n=0;
ch1=ch;
instring[n++]=ch1;
}
}
ch=fgetc(fp);
}while(!
feof(fp));
if(ch1==''||ch1=='\n'||ch1=='\t')
;
else
{
instring[n]='\0';
printf("%d\t",type);
puts(instring);
)
}
六、实验者自评(主要从实验态度、方法、效果上给一个客观公正的自我评价)
实验达到了预期的效果,做的比较的简单,但是关键字全部能够识别,独立完成本实验,词法分析器可以运行一些简单的程序代码,途中遇到一些小麻烦后来全部在网络上解决了。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 报告 编写 词法 分析 程序 09123132 徐裕