编译原理实验1扫描器的设计与实现.docx
《编译原理实验1扫描器的设计与实现.docx》由会员分享,可在线阅读,更多相关《编译原理实验1扫描器的设计与实现.docx(29页珍藏版)》请在冰豆网上搜索。
![编译原理实验1扫描器的设计与实现.docx](https://file1.bdocx.com/fileroot1/2022-12/30/2b902dc1-6f03-4823-825b-99ae231f1796/2b902dc1-6f03-4823-825b-99ae231f17961.gif)
编译原理实验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、改进方案。
〔1char*keywords[15]={"void","main","if","then","break","int","char","float","include","for","while","printf","scanf","define","double"};
〔2case13:
{
flag=14;
status=1;
break;
}
case14:
{
flag=15;
status=1;
break;
}
〔3case'.':
{
words[j]=ch;
words[j+1]='\0';
flag=514;
break;
}
case'':
{
words[j]='';
flag=250;
break;
}
case'\n':
{
flag=251;
break;
}
〔4elseif{
}
修改前源代码:
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
inti,j,k,flag,number,status;
/*statuswhichisusetojudgethestringiskeywordsornot!
*/
charch;
charwords[10]={""};
charprogram[500];
intScan
{
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<='a'>&&>
{
while<='a'>&&>
{
words[j++]=ch;
ch=program[i++];
}
i--;
words[j++]='\0';
for
if==0>
switch
{
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
{
flag=100;
}
}
/*handledigits*/
elseif<='0'>&&>
{
number=0;
while<='0'>&&>
{
number=number*10+;
ch=program[i++];
}
flag=200;
i--;
}
/*opereationandedgehandle*/
elseswitch
{
case'=':
{
if
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if
{
words[j++]=ch;
words[j]='\0';
flag=401;
}
else
{
i--;
flag=402;
}
break;
}
case'>':
{
if'>
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if
{
words[j++]=ch;
words[j]='\0';
flag=403;
}
else
{
i--;
flag=404;
}
break;
}
case'<':
{
if
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if
{
words[j++]=ch;
words[j]='\0';
flag=405;
}
else
{
i--;
flag=406;
}
break;
}
case'!
':
{
if'>
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if
{
words[j++]=ch;
words[j]='\0';
flag=407;
}
else
{
i--;
flag=408;
}
break;
}
case'+':
{
if
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if
{
words[j++]=ch;
words[j]='\0';
flag=409;
}
elseif
{
words[j++]=ch;
words[j]='\0';
flag=410;
}
else
{
i--;
flag=411;
}
break;
}
case'-':
{
if
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if
{
words[j++]=ch;
words[j]='\0';
flag=412;
}
elseif
{
words[j++]=ch;
words[j]='\0';
flag=413;
}
else
{
i--;
flag=414;
}
break;
}
case'*':
{
if
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if
{
words[j++]=ch;
words[j]='\0';
flag=415;
}
else
{
i--;
flag=416;
}
break;
}
case'/':
{
if
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if
{
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
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if
{
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=''>;
i=0;
do{
flag=Scan;
if
{
printf<"<%2d,%4d>",flag,number>;
}
elseif
{
printf<"<%d,error>",flag>;
}
else
{
printf<"<%2d,%4s>",flag,words>;
}
}while=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
{
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<='a'>&&>
{
while<='a'>&&>
{
words[j++]=ch;
ch=program[i++];
}
i--;
words[j++]='\0';
for
if==0>
switch
{
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
{
flag=100;
}
}
/*handledigits*/
elseif<='0'>&&>
{
number=0;
while<='0'>&&>
{
number=number*10+;
ch=program[i++];
}
flag=200;
i--;
}
/*opereationandedgehandle*/
elseswitch
{
case'=':
{
if
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if
{
words[j++]=ch;
words[j]='\0';
flag=401;
}
else
{
i--;
flag=402;
}
break;
}
case'>':
{
if'>
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if
{
words[j++]=ch;
words[j]='\0';
flag=403;
}
else
{
i--;
flag=404;
}
break;
}
case'<':
{
if
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if
{
words[j++]=ch;
words[j]='\0';
flag=405;
}
else
{
i--;
flag=406;
}
break;
}
case'!
':
{
if'>
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if
{
words[j++]=ch;
words[j]='\0';
flag=407;
}
else
{
i--;
flag=408;
}
break;
}
case'+':
{
if
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if
{
words[j++]=ch;
words[j]='\0';
flag=409;
}
elseif
{
words[j++]=ch;
words[j]='\0';
flag=410;
}
else
{
i--;
flag=411;
}
break;
}
case'-':
{
if
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if
{
words[j++]=ch;
words[j]='\0';
flag=412;
}
elseif
{
words[j++]=ch;
words[j]='\0';
flag=413;
}
else
{
i--;
flag=414;
}
break;
}
case'*':
{
if
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if
{
words[j++]=ch;
words[j]='\0';
flag=415;
}
else
{
i--;
flag=416;
}
break;
}
case'/':
{
if
words[j++]=ch;
words[j]='\0';
ch=program[i++];
if
{
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;