预览加载中,请您耐心等待几秒...
1/7
2/7
3/7
4/7
5/7
6/7
7/7

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

实验二:语法分析(递归下降法) 一、实验目的 1、掌握语法分析的基本原理; 2、掌握递归下降的分析法; 3、熟悉C语言程序设计。 二、实验准备 微机CPU主频1.3G以上,128M内存,安装好C语言,PASCAL语言,或C++。 三、实验时间 2学时 四、实验内容 已给语言文法,写出该文法的递归下降法语法分析器。 输入:源符号串。输出:语法是否合法。 : 文法: (1)<程序>::=begin<语句串>end (2)<语句串>::=<语句>{;<语句>} (3)<语句>::=<赋值语句> (4)<赋值语句>::=ID:=<表达式> (5)<表达式>::=<项>{+<项>|-<项>} (6)<项>::=<因子>{*<因子>|/<因子>} (7)<因子>::=ID|NUM|(<表达式>) 五:源程序: lrparser()对应<程序> yucu()对应<语句串> statement()对应<语句> expression()对应<表达式> term()对应<项> factor()对应<因子> 关键字,数字,字母,符号对应码如下 "begin","if","then","while","do","end"1——6 字母10数字11 +,-,*,/,:,:=,<,<>,<=,>,>=,=,;,(,),#13——28,0 factor() #include"stdio.h" #include"string.h" charprog[80],token[8]; charch; intsyn,p,m,n,sum,kk=0; char*rwtab[6]={"begin","if","then","while","do","end"}; voidscaner(); voidlrparser(); voidyucu(); voidstatement(); voidexpression(); voidterm(); voidfactor(); voidmain() { p=0; printf("Pleaseinputstring:\n"); do { scanf("%c",&ch); prog[p++]=ch; }while(ch!='#');//当遇到‘#’,结束输入 p=0; scaner(); lrparser(); } voidscaner() { for(n=0;n<8;n++)token[n]=NULL; ch=prog[p++]; while(ch==''||ch=='\n')ch=prog[p++]; m=0; if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')) { while((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')||(ch>='0'&&ch<='9')) { token[m++]=ch; ch=prog[p++];//将prog数组的字母复制到ch数组中 } token[m++]='\0';//把token的末尾设置结束符\0 p--;//标记到当前token数组中不是字母的当前位置 syn=10;//标记字母的对应码 for(n=0;n<6;n++) { if(strcmp(token,rwtab[n])==0)//判断token对应rwtab中的哪一个,并进行对应赋对应码 { syn=n+1; break; } } } elseif(ch>='0'&&ch<='9') { sum=0; while(ch>='0'&&ch<='9') { sum=sum*10+ch-'0';//number用来记录所对应的数字 ch=prog[p++]; } p--; syn=11;//标记数字的对应码 } else { switch(ch) { case'<': m=0; token[m++]=ch; ch=prog[p++]; if(ch=='>') { syn=21;//标记”<>”的对应码 token[m++]=ch; } elseif(ch=='=') { syn=22;//标记”<=”的对应码 token[m++]=ch; } else { syn=20;//标记”<”的对应码 p--; } break; case'>': token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=24;//标记”>=”的对应码 token[m++]=ch; } else { syn=23;//标记”>”的对应码 p--; } break; case':': token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=18;//标记”:=”的对应码 token[m++]=ch