资源描述:
《实验二:语法分析(递归下降法)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、实验二:语法分析(递归下降法)一、实验目的1、掌握语法分析的基本原理;2、掌握递归下降的分析法;3、熟悉C语言程序设计。二、实验准备微机CPU主频1.3G以上,128M内存,安装好C语言,PASCAL语言,或C++。三、实验时间2学时四、实验内容已给语言文法,写出该文法的递归下降法语法分析器。输入:源符号串。输出:语法是否合法。:文法:(1)<程序>::=begin<语句串>end(2)<语句串>::=<语句>{;<语句>}(3)<语句>::=<赋值语句>(4)<赋值语句>::=ID:=<表达式>(5)<表达式
2、>::=<项>{+<项>
3、-<项>}(6)<项>::=<因子>{*<因子>
4、/<因子>}(7)<因子>::=ID
5、NUM
6、(<表达式>)五:源程序:lrparser()对应<程序>yucu()对应<语句串>statement()对应<语句>expression()对应<表达式>term()对应<项>factor()对应<因子>关键字,数字,字母,符号对应码如下"begin","if","then","while","do","end"1——6字母10数字11+,-,*,/,:,:=,<,<>,<=,>,>=,=
7、,;,(,),#13——28,0factor()#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
8、();7voidmain(){p=0;printf("Pleaseinputstring:");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==''
9、
10、ch=='')ch=prog[p++];m=0;if((ch>='A'&&ch<='Z')
11、
12、(ch
13、>='a'&&ch<='z')){while((ch>='A'&&ch<='Z')
14、
15、(ch>='a'&&ch<='z')
16、
17、(ch>='0'&&ch<='9')){token[m++]=ch;ch=prog[p++];//将prog数组的字母复制到ch数组中}token[m++]=' ';//把token的末尾设置结束符 p--;//标记到当前token数组中不是字母的当前位置syn=10;//标记字母的对应码for(n=0;n<6;n++){if(strcmp(token,rwtab[n])==0)//
18、判断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++];7}p--;syn=11;//标记数字的对应码}else{switch(ch){case'<':m=0;token[m++]=ch;ch=prog[p++];if(ch=='>'){syn=21;//标记”<>”的
19、对应码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=
20、='='){syn=18;//标记”:=”的对应码7token[m++]=ch;}else{syn=17;//标记”:”的对应码p--;}break;case'+':syn=13;//标记”+”的对应码token[m++]=ch;break;case'-':syn=14;//标记”-”的对应码token[m++]=ch;break;case'*':syn=15;//标记”*”的对应码t