最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

编译原理实验3 语义分析 报告

来源:动视网 责编:小OO 时间:2025-09-25 21:36:38
文档

编译原理实验3 语义分析 报告

南华大学计算机科学与技术学院实验报告(2008~2009学年度第一学期)课程名称编译原理实验名称语义分析姓名李顺利学号200440150专业计算机科学与技术专业班级计算机科学与技术专业061班地点寝室教师陈星1.实验目的及要求目的:要求:软件、硬件环境软件:MicrosoftVisualStudio2008Microsoftofficeword2007Microsoftofficevisio2007硬件:处理器AMDAthlon(tm)X2DualCoreProcessor4000+内
推荐度:
导读南华大学计算机科学与技术学院实验报告(2008~2009学年度第一学期)课程名称编译原理实验名称语义分析姓名李顺利学号200440150专业计算机科学与技术专业班级计算机科学与技术专业061班地点寝室教师陈星1.实验目的及要求目的:要求:软件、硬件环境软件:MicrosoftVisualStudio2008Microsoftofficeword2007Microsoftofficevisio2007硬件:处理器AMDAthlon(tm)X2DualCoreProcessor4000+内
南华大学

计算机科学与技术学院

实 验 报 告 

( 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. 实验总结分析

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

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

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

文档

编译原理实验3 语义分析 报告

南华大学计算机科学与技术学院实验报告(2008~2009学年度第一学期)课程名称编译原理实验名称语义分析姓名李顺利学号200440150专业计算机科学与技术专业班级计算机科学与技术专业061班地点寝室教师陈星1.实验目的及要求目的:要求:软件、硬件环境软件:MicrosoftVisualStudio2008Microsoftofficeword2007Microsoftofficevisio2007硬件:处理器AMDAthlon(tm)X2DualCoreProcessor4000+内
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top