编译原理语义分析程序设计
实验3语义分析程序设计 【实验目的】 加深对语法制导翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻 译方法。 【实验内容】 采用递归下降语法制导翻译法,对算术表达式、赋值语句进行语义分析并生成四元式序列。 【设计思路】 1、流程图 置初值 调用scaner读下一个单词符号 调用 Irparser 输出四元式 〔结束J 图2.1递归下降分析程序示意图 2、源程序代码 (1) scan.h〃头文件扫描程序 #include #include char prog[80],token [8]; char ch; int syn,p,m,n,sum;//p是缓冲区prog的指针,m是token的指针 char *rwtab[6]=( ,begin,,;,if“,“then“,“while“,ndon,“end“}; void scanner()〃词法扫描程序 { memset(token, \0 ,sizeof(token));〃清空数组 token m=0; while(ch== *) { ++p;ch=prog[p];〃读下一个字符; } if((ch>= a while((ch>=,a, ++p;ch=prog[p];// 读下一个字符; } token [m++]=*\0 ; syn=10; for(n=0;n= 0 while(ch>=0〃将 ch 转换为数字 ++P; ch=prog[p]; } syn=ll; } else switch(ch)//其他字符情况 ( case v : m=0;token [m++]=ch; ++P; ch=prog[p]; if(ch==,>,) { syn=21; ++m; token[m]=ch; } else if(ch=== ) ( syn=22; ++m; token[m]=ch; } else syn=20; break; case > : token [O]=ch; ++P; ch=prog[p]; if(ch== = ) ( syn=24; token [0]=ch; } else { syn=23; } break; case : : token [0]=ch; ++P; ch=prog[p]; if(ch== = ) ( syn=18; ++m; token [m]=ch; ++P; ch=prog[p]; } else ( syn=17; } break; case*+ : syn=13;token[0]=ch;ch=prog[++p]; break; case -*: syn=14;token[0]=ch;ch=prog[++p]; break; case*: syn= 15 ;token[0]=ch;ch=prog[++p]; break; case / : syn= 16;token[0]=ch;ch=prog [++p]; break; case = : syn=25; token [O]=ch;ch=prog[++p]; break; case ; : syn=26 ;token [0]=ch;ch=prog [++p]; break; case C: syn=27 ;token [0]=ch;ch=prog [++p]; break; case ) : syn=28;token[0]=ch;ch=prog[++p]; break; case # : syn=0; token[0] =ch;ch=prog[++p]; break; default: syn=-l; } } (2) yuyi.cpp //语法分析主程序 #include #includeMscan.h“ int kk=0,q=0,k=0; struct { char result[8]; char agl[8]; char op[8]; char ag2[8]; }quad[20]; int lrparser(); int yucu(); int statement(); char * expression(void); char * term(); char * factor(); char * newtemp(void); void emit(char *result,char *agl,char *op,char *ag2); void main() { kk=0; rewind(stdin); memset(prog, \0 ,sizeof(prog));//清空数组 prog P=0; printf(H\n please stringAn“); do( ch=getchar(); prog[p++]=ch; }while(ch != #*); P=0; ch=prog[0]; scanner(); lrparser(); for(int i=0;ivq;++i) { printf(“%s=%s%s%s\n“,quad[i].result,quad[i].agl,quad[i].op,quad[i].ag2); } ) int lrparser() { int schain=0; kk=0; if(l==syn) ( scanner(); schain=yucu(); if(6==syn) { scanner(); if(O==synllO==kk) ( printf(“success!\n“); } } else { if(kk!=l) (printf(n缺 end!n);kk=l;) } else printf(“缺 begin!“);kk=l; } return schain; ) int yucu()〃语句串分析函数 { int schain=O; schain=statement(); while(26==syn) { scanner(); schain=statement(); } return schain; ) int statement() { char tt[8]