计算机科学与技术学院
实 验 报 告
( 2008 ~ 2009 学年度 第 一 学期 )
课程名称 | 编译原理 |
实验名称 | 语义分析 |
姓名 | 李顺利 | 学号 | 200440150 |
专业 | 计算机科学与技术专业 | 班级 | 计算机科学与技术专业061班 |
地点 | 寝室 | 教师 | 陈星 |
目的:
要求:
软件、硬件环境
软件: Microsoft Visual Studio 2008
Microsoft office word 2007
Microsoft office visio 2007
硬件:处理器 AMD Athlon(tm) X2 Dual Core Processor 4000+ 内存 2030412 KB
操作系统 Microsoft Windows Vista Ultimate (SP1, v.668)
2.实验算法思想(包含主程序的示意图)
3. 实验内容
//程序框架
/*
程序说明
描述:采用递归下降语法制导翻译法,对算术表达式、赋值语句进行语义分析并生成四元式序列
作者:***
时间:年月日
测试输入:、begin a:=2+3*4;x:=(a+b)/c end #
2、begin a:=9;x:=2*3;b:=(a+x end #
测试输出: 1、t1 = 3 * 4
t2 = 2 + t1
a = t2
t3 = a + b
t4 = t3 / c
x = t4
Success!
2、a = 9
t1 = 2 * 3
x = t1
t2 = a + x
error : missing ')' after '(' !
b = t2
*/
#include #include #include char prog[80],token[8]; char ch; int syn,p,m,n,sum,kk,k;//p是缓冲区prog的指针,m是token的指针 char *rwtab[6]={"begin","if","then","while","do","end"};//关键字 void scaner();//词法分析算法 int lrparser();//递归下降分析 int yucu();//语句串分析 int statement();//表达式分析 char* expression();// 表达式运算分析 char* term();//运算符分析 char* factor();//因子分析 char* newtemp();//返回新的临时变量,t1,t2 .... void emit(char *result,char *ag1,char *op,char *ag2); struct { char result[8]; char ag1[8]; char op[8]; char ag2[8]; } quad[20];//四元式的结构 int main() { // int mz; // scanf("%d",&mz);getchar(); // while(mz!=0){ p=0;kk=0;k=0; printf("\\nplease input string :\\n"); do {ch=getchar();//读入源程序的字符串 prog[p++]=ch;//送到缓冲区中 }while(ch!='#'); p=0; scaner(); lrparser(); printf("\\n"); // scanf("%d",&mz);getchar();} return 0; } void scaner() {//实验一中代码,现在就不重复了 } int lrparser()//递归下降分析 { int schain=0; if(syn==1)//begin {scaner();//读下一个二元式 schain=yucu();//调用语句串分析函数进行分析 if(syn==6)//end {scaner();//读下一个二元式 if(syn==0 && kk==0)//# printf("Success!\\n"); } else if(kk!=1) printf("error : missing 'end' !\\n"); } else{printf("error : missing 'begin' !\\n");kk=1;} return schain; } int yucu()//语句串分析 { int schain=0; schain=statement(); while(syn==26)//; {scaner();//读下一个二元式 schain=statement(); } return schain; } int statement()//表达式分析 { char tt[8],eplace[8]; int schain=0; if(syn==10)//ID { strcpy(tt,token); scaner();//读下一个二元式 if(syn==18)// {scaner();//读下一个二元式 strcpy(eplace,expression()); emit(tt,eplace,"",""); schain=0; }else {printf("error : missing '=' after ':' !\\n");kk=1;} } else{printf("expression error !\\n");kk=1;} return schain; } char* expression()// 表达式运算分析 { char *tp,*ep2,*eplace,*tt; tp=(char*)malloc(12); ep2=(char*)malloc(12); eplace=(char*)malloc(12); tt=(char*)malloc(12); strcpy(eplace,term()); while(syn==13)//'+' { strcpy(tt,"+"); scaner();//读下一个二元式 strcpy(ep2,term()); strcpy(tp,newtemp()); emit(tp,eplace,tt,ep2); strcpy(eplace,tp); } while(syn==14)//'-' { strcpy(tt,"-"); scaner();//读下一个二元式 strcpy(ep2,term()); strcpy(tp,newtemp()); emit(tp,eplace,tt,ep2); strcpy(eplace,tp); } return eplace; } char* term()//运算符分析 { char *tp,*ep2,*eplace,*tt; tp=(char*)malloc(12); ep2=(char*)malloc(12); eplace=(char*)malloc(12); tt=(char*)malloc(12); strcpy(eplace,factor()); while(syn==15)//'*' { strcpy(tt,"*"); scaner();//读下一个二元式 strcpy(ep2,factor()); strcpy(tp,newtemp()); emit(tp,eplace,tt,ep2); strcpy(eplace,tp); } while(syn==16)// '/' { strcpy(tt,"/"); scaner();//读下一个二元式 strcpy(ep2,factor()); strcpy(tp,newtemp()); emit(tp,eplace,tt,ep2); strcpy(eplace,tp); } return eplace; } char* factor()//因子分析 { char *fplace; fplace =(char*)malloc(12); strcpy(fplace,""); if(syn==10)//ID { strcpy(fplace,token); scaner();//读下一个二元式 //return; } else if(syn==11)//NUM { itoa(sum,fplace,10); scaner();//读下一个二元式 //return; } else if(syn==27)//( {scaner();//读下一个二元式 fplace=expression(); if(syn==28)//) scaner();//读下一个二元式 else {printf("error : missing ')' after '(' !\\n");kk=1;} } else{printf("expression error !\\n");kk=1;} return fplace; } char* newtemp() { char *p; char m[8]; p=(char*)malloc(8); k++; itoa(k,m,10);//按进制转换字符串(进制) /*itoa(i,num,10); i 需要转换成字符的数字 num 转换后保存字符的变量 10 转换数字的基数(进制)就是说按照进制转换数字。还可以是,等等你喜欢的进制类型*/ strcpy(p+1,m); p[0]='t'; return p; } void emit(char *result,char *ag1,char *op,char *ag2) { printf("%s",result); printf("%s"," = "); printf("%s",ag1); printf("%s"," "); printf("%s",op); printf("%s"," "); printf("%s\\n",ag2); } 4.实验结果 测试1 测试2 5. 实验总结分析 这次实验是在最后一次实验,是在前面两次实验的基础上进一步地学习。通过词法分析出来的二元式,在通过语法分析,检查后在翻译成相应的四元式,并输入三地址代码序列。 做这次实验的目的真的为了课程设计,毕竟课程设计是一个完整的程序编译的过程,还是尽量学习更多的方法,后面几周的课程设计也许就没有那么麻烦了。 还是感谢老师给了我们很多的伪代码。