编译原理实验1扫描器的设计与实现.docx
- 文档编号:26593454
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:34
- 大小:68.27KB
编译原理实验1扫描器的设计与实现.docx
《编译原理实验1扫描器的设计与实现.docx》由会员分享,可在线阅读,更多相关《编译原理实验1扫描器的设计与实现.docx(34页珍藏版)》请在冰豆网上搜索。
编译原理实验1扫描器的设计与实现
实验1:
扫描器的设计与实现
1.1.目的和要求
1.加深对词法分析理论的理解,培养动手实践的能力。
2.学会从以字符串表示的源程序中识别出具有独立意义的基本语法单位,同时指出它们的属性的方法和技术。
1.2.实验环境
WindowsXP+WinTC191
1.3.实验准备
1、先将课本3.5节词法分析程序的生成认真的学习一遍,理解词法分析程序的构成过程。
2、写出C语言测试程序,分析可能得到的结果。
测试程序:
#definepi3.14
voidmain(){
doubler=2.5;
doubles=0.0;
s=pi*r*r;
printf("%f",s);
}
预测结果:
(513,#)(14,define)(100,pi)(200,3)(514,.)(200,14)(1,void)(2,main)(502,()(503,))
(506,{)(15,double)(100,r)(402,=)(200,2)(514,.)(200,5)(501,;)(15,double)(100,s)
(402,=)(200,0)(514,.)(200,0)(501,;)(100,s)(402,=)(100,pi)(416,*)(100,r)(416,*)
(100,r)(501,;)(12,printf)(502,()(509,")(511,%)(100,f)(509,")(512,,)(100,s)(503,))
(501,;)(507,})
1.4.实验容及步骤
1、输入已给的文本格式的扫描程序Lexical.c文件,然后编译运行,检查修改错误。
2、编译成功后,提示输入C语言测试程序,用回车键查看输出的单词流,即单词符号及其属性。
3、比较自己分析的结果和屏幕上的输出结果。
1.5.实验小结
1、得到的经验。
通过本次实验,我了解了如何设计、编制并调试词法分析程序,加深了对词法分析原理的理解。
同时,在编制和调试程序时要全面考虑,避免漏掉或者错误定义定界符等,造成不必要的错误。
2、遇到的主要问题。
忘记对空格、回车符等定界符进行设置等。
3、改进方案。
(1)char*keywords[15]={"void","main","if","then","break","int","char","float","include","for","while","printf","scanf","define","double"};
(2)case13:
{
flag=14;
status=1;
break;
}
case14:
{
flag=15;
status=1;
break;
}
(3)case'.':
{
words[j]=ch;
words[j+1]='\0';
flag=514;
break;
}
case'':
{
words[j]='';
flag=250;
break;
}
case'\n':
{
flag=251;
break;
}
(4)elseif(flag==250||flag==251){
}
修改前源代码:
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
inti,j,k,flag,number,status;
/*statuswhichisusetojudgethestringiskeywordsornot!
*/
charch;
charwords[10]={""};
charprogram[500];
intScan(charprogram[])
{
char*keywords[13]={"void","main","if","then","break","int","char","float","include","for","while","printf","scanf"};
number=0;
status=0;
j=0;
ch=program[i++];/*Tohandlethelettlespaceandstab*/
/*handleletters*/
if((ch>='a')&&(ch<='z'))
{
while((ch>='a')&&(ch<='z'))
{
words[j++]=ch;
ch=program[i++];
}
i--;
words[j++]='\0';
for(k=0;k<13;k++)
if(strcmp(words,keywords[k])==0)
switch(k)
{
case0:
{
flag=1;
status=1;
break;
}
case1:
{
flag=2;
status=1;
break;
}
case2:
{
flag=3;
status=1;
break;
}
case3:
{
flag=4;
status=1;
break;
}
case4:
{
flag=5;
status=1;
break;
}
case5:
{
flag=6;
status=1;
break;
}
case6:
{
flag=7;
status=1;
break;
}
case7:
{
flag=8;
status=1;
break;
}
case8:
{
flag=9;
status=1;
break;
}
case9:
{
flag=10;
status=1;
break;
}
case10:
{
flag=11;
status=1;
break;
}
case11:
{
flag=12;
status=1;
break;
}
case12:
{
flag=13;
status=1;
break;
}
}
if(status==0)
{
flag=100;
}
}
/*handledigits*/
elseif((ch>='0')&&(ch<='9'))
{
number=0;
while((ch>='0')&&(ch<='9'))
{
number=number*10+(ch-'0');
ch=program[i++];
}
flag=200;
i--;
}
/*opereationandedgehandle*/
elseswitch(ch)
{
case'=':
{
if(ch=='=')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=401;
}
else
{
i--;
flag=402;
}
break;
}
case'>':
{
if(ch=='>')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=403;
}
else
{
i--;
flag=404;
}
break;
}
case'<':
{
if(ch=='<')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=405;
}
else
{
i--;
flag=406;
}
break;
}
case'!
':
{
if(ch=='!
')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=407;
}
else
{
i--;
flag=408;
}
break;
}
case'+':
{
if(ch=='+')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=409;
}
elseif(ch=='+')
{
words[j++]=ch;
words[j]='\0';
flag=410;
}
else
{
i--;
flag=411;
}
break;
}
case'-':
{
if(ch=='-')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=412;
}
elseif(ch=='-')
{
words[j++]=ch;
words[j]='\0';
flag=413;
}
else
{
i--;
flag=414;
}
break;
}
case'*':
{
if(ch=='*')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=415;
}
else
{
i--;
flag=416;
}
break;
}
case'/':
{
if(ch=='/')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=417;
}
else
{
i--;
flag=418;
}
break;
}
case';':
{
words[j]=ch;
words[j+1]='\0';
flag=501;
break;
}
case'(':
{
words[j]=ch;
words[j+1]='\0';
flag=502;
break;
}
case')':
{
words[j]=ch;
words[j+1]='\0';
flag=503;
break;
}
case'[':
{
words[j]=ch;
words[j+1]='\0';
flag=504;
break;
}
case']':
{
words[j]=ch;
words[j+1]='\0';
flag=505;
break;
}
case'{':
{
words[j]=ch;
words[j+1]='\0';
flag=506;
break;
}
case'}':
{
words[j]=ch;
words[j+1]='\0';
flag=507;
break;
}
case':
':
{
words[j]=ch;
words[j+1]='\0';
flag=508;
break;
}
case'"':
{
words[j]=ch;
words[j+1]='\0';
flag=509;
break;
}
case'%':
{
if(ch=='%')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=510;
}
else
{
i--;
flag=511;
}
break;
}
case',':
{
words[j]=ch;
words[j+1]='\0';
flag=512;
break;
}
case'#':
{
words[j]=ch;
words[j+1]='\0';
flag=513;
break;
}
case'':
{
words[j]='#';
flag=0;
break;
}
default:
{
flag=-1;
break;
}
}
returnflag;
}
main()
{
i=0;
printf("pleaseinputaprogramendwith");
do
{
ch=getchar();
program[i++]=ch;
}while(ch!
='');
i=0;
do{
flag=Scan(program);
if(flag==200)
{
printf("(%2d,%4d)",flag,number);
}
elseif(flag==-1)
{
printf("(%d,error)",flag);
}
else
{
printf("(%2d,%4s)",flag,words);
}
}while(flag!
=0);
system("pause");
}
修改后源代码:
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
inti,j,k,flag,number,status;
/*statuswhichisusetojudgethestringiskeywordsornot!
*/
charch;
charwords[10]={""};
charprogram[500];
intScan(charprogram[])
{
char*keywords[15]={"void","main","if","then","break","int","char","float","include","for","while","printf","scanf","define","double"};
number=0;
status=0;
j=0;
ch=program[i++];/*Tohandlethelettlespaceandstab*/
/*handleletters*/
if((ch>='a')&&(ch<='z'))
{
while((ch>='a')&&(ch<='z'))
{
words[j++]=ch;
ch=program[i++];
}
i--;
words[j++]='\0';
for(k=0;k<15;k++)
if(strcmp(words,keywords[k])==0)
switch(k)
{
case0:
{
flag=1;
status=1;
break;
}
case1:
{
flag=2;
status=1;
break;
}
case2:
{
flag=3;
status=1;
break;
}
case3:
{
flag=4;
status=1;
break;
}
case4:
{
flag=5;
status=1;
break;
}
case5:
{
flag=6;
status=1;
break;
}
case6:
{
flag=7;
status=1;
break;
}
case7:
{
flag=8;
status=1;
break;
}
case8:
{
flag=9;
status=1;
break;
}
case9:
{
flag=10;
status=1;
break;
}
case10:
{
flag=11;
status=1;
break;
}
case11:
{
flag=12;
status=1;
break;
}
case12:
{
flag=13;
status=1;
break;
}
case13:
{
flag=14;
status=1;
break;
}
case14:
{
flag=15;
status=1;
break;
}
}
if(status==0)
{
flag=100;
}
}
/*handledigits*/
elseif((ch>='0')&&(ch<='9'))
{
number=0;
while((ch>='0')&&(ch<='9'))
{
number=number*10+(ch-'0');
ch=program[i++];
}
flag=200;
i--;
}
/*opereationandedgehandle*/
elseswitch(ch)
{
case'=':
{
if(ch=='=')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=401;
}
else
{
i--;
flag=402;
}
break;
}
case'>':
{
if(ch=='>')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=403;
}
else
{
i--;
flag=404;
}
break;
}
case'<':
{
if(ch=='<')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=405;
}
else
{
i--;
flag=406;
}
break;
}
case'!
':
{
if(ch=='!
')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=407;
}
else
{
i--;
flag=408;
}
break;
}
case'+':
{
if(ch=='+')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=409;
}
elseif(ch=='+')
{
words[j++]=ch;
words[j]='\0';
flag=410;
}
else
{
i--;
flag=411;
}
break;
}
case'-':
{
if(ch=='-')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=412;
}
elseif(ch=='-')
{
words[j++]=ch;
words[j]='\0';
flag=413;
}
else
{
i--;
flag=414;
}
break;
}
case'*':
{
if(ch=='*')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=415;
}
else
{
i--;
flag=416;
}
break;
}
case'/':
{
if(ch=='/')
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
words[j]='\0';
flag=417;
}
else
{
i--;
flag=418;
}
break;
}
case';':
{
words[j]=ch;
words[j+1]='\0';
flag=501;
break;
}
case'(':
{
words[j]=ch;
words[j+1]='\0';
flag=502;
break;
}
case')':
{
words[j]=ch;
words[j+1]='\0';
flag=503;
break;
}
case'[':
{
words[j]=ch;
words[j+1]='\0';
flag=504;
break;
}
case']':
{
words[j]=ch;
words[j+1]='\0';
flag=505;
break;
}
case'{':
{
words[j]=ch;
words[j+1]='\0';
flag=506;
break;
}
case'}':
{
words[j]=ch;
words[j+1]='\0';
flag=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 扫描器 设计 实现