视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
编译原理实验3 语义分析 报告
2025-09-25 21:36:38 责编:小OO
文档
南华大学

计算机科学与技术学院

实 验 报 告 

( 2008  ~  2009  学年度     第  一  学期 )

课程名称

编译原理

实验名称

语义分析

姓名李顺利学号200440150
专业计算机科学与技术专业班级计算机科学与技术专业061班

地点寝室教师陈星
1.实验目的及要求

目的:

要求: 

软件、硬件环境

软件: 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. 实验总结分析

这次实验是在最后一次实验,是在前面两次实验的基础上进一步地学习。通过词法分析出来的二元式,在通过语法分析,检查后在翻译成相应的四元式,并输入三地址代码序列。 

做这次实验的目的真的为了课程设计,毕竟课程设计是一个完整的程序编译的过程,还是尽量学习更多的方法,后面几周的课程设计也许就没有那么麻烦了。

还是感谢老师给了我们很多的伪代码。下载本文

显示全文
专题