编译原理实验1扫描器的设计与实现.docx

上传人:b****6 文档编号:5672792 上传时间:2022-12-31 格式:DOCX 页数:29 大小:17.96KB
下载 相关 举报
编译原理实验1扫描器的设计与实现.docx_第1页
第1页 / 共29页
编译原理实验1扫描器的设计与实现.docx_第2页
第2页 / 共29页
编译原理实验1扫描器的设计与实现.docx_第3页
第3页 / 共29页
编译原理实验1扫描器的设计与实现.docx_第4页
第4页 / 共29页
编译原理实验1扫描器的设计与实现.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

编译原理实验1扫描器的设计与实现.docx

《编译原理实验1扫描器的设计与实现.docx》由会员分享,可在线阅读,更多相关《编译原理实验1扫描器的设计与实现.docx(29页珍藏版)》请在冰豆网上搜索。

编译原理实验1扫描器的设计与实现.docx

编译原理实验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;

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

当前位置:首页 > 经管营销

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

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