www.pudn.com > bianyi.rar > bianyi.cpp
#include#include /*定义的原始产生式的类型号,以后程序通过它进行检索 #define id 1 #define const 10 #define := 2 #define + 3 #define - 4 #define * 5 #define / 6 #define ( 21 #define ) 22 #define > 23 #define < 24 #define = 25 #define if 100 #define then 101 #define while 102 #define do 103 #define else 104 #define S->id:=E 1 #define E->E+E 2 #define E->E-E 3 #define E->E*E 4 #define E->E/E 5 #define E->-E 6 #define E->(E) 7 #define E->id 8 #define E->num 9 #define C->E>E 10 #define C->E if C then S 12 #define C->E=E 13 #define S->if C then S else S 14 #define S->while C do S 15*/ int lookhead; //当前待分析的单词 /*保存语法分析产生的树结构数组,在构造分析树的过程中为 每个产生式赋予一个唯一的编号,该数组的 www[][1]第一唯数表示哪个编号的产生式 www[][2]……右部第一个非终结符产生的产生式编号,第二个……产生式编号*/ int w[20][20]; /*保存各产生式的有关标号 [][0]begin,[][1]next,[][2]true,[][3]false标号的符号表序号*/ int label[20][4]; /*符号表,数组中每一个元素存储输入的标识符和数字,以及在程序中产生的 临时变量newtemp()和标号newlabel()的字符串表示形式,可通过序号检索*/ char chart[70][40]; int number, //产生式的编号 code=0, //符号表序号 /*生新的临时变量名中起作用chart[30]~char[50]保存产生的临时变量名*/ temp=30, temp1='0', //用来生成不同临时变量的chart[][*] /*在新的标号名中起作用,同temp,temp1*/ stemp=50,stemp1='0'; /*====================词法分析子程序==================*/ /*每次调用可以从输入流中划分出一个单词 返值int:单词的属性值 结尾返回 0 错误字符返回-1 输入ch: 当前读入字符*/ int cifa() //这是一个全局函数 { int ch,i=0; int isletter(int); int isdigit(int); int rightchar(char); int key(char *a); ch=getc(stdin); while ((ch==' ')||(ch==10)) ch=getc(stdin); if(ch==-1) return(0); if ((!rightchar(ch))&&(ch!=-1)) { cout<<"\nerror %c isn't in my language"< ') return (23); if(ch=='<') return (24); if(ch=='=') return (25); } //--------------cifa()的子函数-------------- int isletter(int ch) //是否为字母 true 1 false 0 { if(((ch>='a')&&(ch<='z'))||((ch>='A')&&(ch<='Z'))) return(1); else return(0); } int isdigit(int ch) //是否为数字 true 1 false 0 { if((ch>='0')&&(ch<='9')) return(1); else return(0); } int rightchar(char ch) //是否合法的字符 true 1 false 0 { if (((ch>='0')&&(ch<='9')) ||((ch>='a')&&(ch<='z')) ||((ch>='A')&&(ch<='Z')) ||(ch==10)||(ch==':')||(ch=='=') ||(ch=='+')||(ch=='-')||(ch=='*')||(ch=='/') ||(ch=='(')||(ch==')')||(ch=='>')||(ch=='<')) return(1); else return(0); } int key(char *a) //是否关键字 true 关键字属性值 false 1 { if ((a[0]=='i')&&(a[1]=='f')&&(a[2]==0))//if return(100); if ((a[0]=='t')&&(a[1]=='h')&&(a[2]=='e')&&(a[3]=='n')&&(a[4]==0)) return(101); //then if ((a[0]=='w')&&(a[1]=='h')&&(a[2]=='i')&&(a[3]=='l')&&(a[4]=='e')&&(a[5]==0)) return(102); //while if ((a[0]=='d')&&(a[1]=='o')&&(a[2]==0)) return(103); //else if ((a[0]=='e')&&(a[1]=='l')&&(a[2]=='s')&&(a[3]=='e')&&(a[4]==0)) return(104); return(1); } /*=====================语法分析======================*/ /*匹配一个单词,并且调用下一个单词 参数:匹配的单词——用属性值表示 返值:成功 1 失败 0*/ int match(int t) //全局函数! { int cifa(); if (lookhead==t) { lookhead=cifa(); return(1); } else return(0); } //语法分析递归子程序之一 int s1() { int c1(); int e1(); //int match(int); int a,b,c,d,a1,i,j; switch(lookhead) { case 1: a1=code; a=match(1); b=match(2); c=e1(); number++; if(a&&b&&c) { /*cout<<("S->id:=E");*/ w[number][0]=1; w[number][1]=c; w[number][2]=a1; w[number][3]=0; /*cout<<(" number=%d, style=%d, next1=%d, id=%s\n", number,1,c,chart[a1]);*/ if((lookhead==0)||(lookhead==104)) return(number); else return(0); } else return(0); case 100: a=match(100); b=c1(); c=match(101); d=s1(); if (lookhead!=104) { if(lookhead!=0) return(0); number++; if(a&&b&&c&&d) { /*cout<<("S->if C then S");*/ w[number][0]=12; w[number][1]=b; w[number][2]=d; w[number][3]=0; /*cout<<(" number=%d, style=%d, next1=%d, next2=%d\n",number,12,b,d);*/ return(number); } else return(0); } else { i=match(104); if (lookhead==0) return(0); j=s1(); number++; if(a&&b&&c&&d&&i&&j) { if(lookhead!=0) return(0); /*cout<<("S->if C then S else S");*/ w[number][0]=14; w[number][1]=b; w[number][2]=d; w[number][3]=j; w[number][4]=0; /*cout<<(" number=%d, style=%d, next1=%d,next2=%d,next3=%d\n",number,14,b,d,j);*/ return(number); } else return(0); } case 102: a=match(102); b=c1(); c=match(103); d=s1(); number++; if(a&&b&&c&&d) { /*cout<<("S->while C do S");*/ w[number][0]=15; w[number][1]=b; w[number][2]=d; w[number][3]=0; /*cout<<(" number=%d, style=%d, next1=%d, next2=%d\n",number,15,b,d);*/ return(number); } else return(0); } return(0); } int c1() { int e1(); //int match(); int a=0,c=0,d=0,i1=0,i2=0,i3=0; a=e1(); if((lookhead==23)||(lookhead==24)||(lookhead==25)) { d=lookhead; if(lookhead==23) i1=match(23); if(lookhead==24) i2=match(24); if(lookhead==25) i3=match(25); c=e1(); if((i1==0)&&(i2==0)&&(i3==0)||(c==0)) return(0); if(d==23) { number++; /*cout<<("C->E>E");*/ w[number][0]=10; w[number][1]=a; w[number][2]=c; w[number][3]=0; } if(d==24) { number++; /*cout<<("C->E E=E");*/ w[number][0]=13; w[number][1]=a; w[number][2]=c; w[number][3]=0; } return(number); } } int e1 () { int t1(); //int match(); int a,b=0,c,d,g=0,k=1,h=0; if(lookhead!=4) { a=t1(); if(a==0) return (0); } else a=0; while((lookhead==3)||(lookhead==4)) { d=lookhead; if(lookhead==3) g=match(3); if(lookhead==4) b=match(4); c=t1(); if(((g==0)&&(b==0))||(c==0)) return(0); if(d==3) { number++; /*cout<<("E->E+E");*/ w[number][0]=2; if(k==1) { w[number][1]=a; k++; } else w[number][1]=h; w[number][2]=c; w[number][3]=0; h=number; /*cout<<(" number=%d, style=%d, next1=%d, next2=%d\n",number,2,w[number][1],c);*/ } if(d==4) { number++; if(a!=0) { /*cout<<("E->E-E");*/ w[number][0]=3; if(k==1) { w[number][1]=a; k++; } else w[number][1]=h; w[number][2]=c; w[number][3]=0; h=number; /*cout<<(" number=%d, style=%d, next1=%d, next2=%d\n",number,3,w[number][1],c);*/ } else { /*cout<<("E->-E");*/ w[number][0]=6; w[number][1]=c; w[number][2]=0; h=number; k++; a=1; /*cout<<(" number=%d, style=%d, next1=%d\n",number,6,w[number][1]);*/ } } } return(number); } int t1() { int f1(); //int match(); int a,b=0,c,d,g=0,k=1,h=0; a=f1(); if(a==0) return(0); while((lookhead==5)||(lookhead==6)) { d=lookhead; if(lookhead==5) g=match(5); if(lookhead==6) b=match(6); c=f1(); if(((g==0)&&(b==0))||(c==0)) return(0); if(d==5) { number++; /*cout<<("E->E*E");*/ w[number][0]=4; if(k==1) { w[number][1]=a; k++; } else w[number][1]=h; w[number][2]=c; w[number][3]=0; h=number; /*cout<<(" number=%d, style=%d, next1=%d, next2=%d\n",number,4,w[number][1],c);*/ } if(d==6) { number++; /*cout<<("E->E/E");*/ w[number][0]=5; if(k==1) { w[number][1]=a; k++; } else w[number][1]=h; w[number][2]=c; w[number][3]=0; h=number; /*cout<<(" number=%d, style=%d, next1=%d, next2=%d\n",number,5,w[number][1],c);*/ } } return(number); } int f1() { int e1(); //int match(); int a,b,c,a1; switch(lookhead) { case 1: a1=code; a=match(1); number++; if(a) { /*cout<<("E->id");*/ w[number][0]=8; w[number][1]=a1; w[number][2]=0; /*cout<<(" number=%d, style=%d, id=%s\n",number,8,chart[a1]);*/ return(number); } else return(0); case 21: a=match(21); b=e1(); c=match(22); number++; if(a&&b&&c) { /*cout<<("E->(E)");*/ w[number][0]=7; w[number][1]=b; w[number][2]=0; /*cout<<(" number=%d, style=%d, next1=%d\n",number,7,b);*/ return(number); } else return(0); case 10: a1=code; a=match(10); number++; if(a) { /*cout<<("E->num");*/ w[number][0]=9; w[number][1]=a1; w[number][2]=0; /*cout<<(" number=%d, style=%d, num=%s\n",number,9,chart[a1]);*/ return(number); } else return(0); } return(0); } /*====================语义分析=====================*/ /*语义分析递归子程序之一 参数:第一个参数为该产生式的编号 第二个参数为该产生式父产生式的编号 返值:临时变量的符号表入口序号*/ int s2(int m,int m1) { int e2(int,int); int a; int newlabel(); switch(w[m][0]) { case 1: a=e2(w[m][1],0); cout< "<