网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 交易代码 > 课程设计 > 正文

编译原理语法分析

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务
语法分析-编译原理-语法分析1、 实验内容或题目编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。2、实验目的与要求利用C语言编制递归下降分析程序,并对简单语言进行语法分析。3、 实验步骤与源程序  ⑴ 实验步骤1.待分析的简单语言的语法用扩充的BNF表示如下:①<程序>::=begin<语句串>end  ②<语句串>::=<语句>{;<语句>}  ③<语句>::=<赋值语句>  ④<赋值语句>::=ID:=<表达式>  ⑤<表达式>::=<项>{+<项>|-<项>}  ⑥<项>::=<因子>{*<因子>|/<因子>}  ⑦<因子>::=ID|NUM|(<表达式>)
2.试验要求说明  输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则,输出“error”。  例如:       输入   begin a:=9;x:=2*3;b:= a + x  end  #       输出   success       输入   x:= a + b * c end #       输出   error
3.语法分析程序的算法思想  ①主程序示意图如下图 图C.3语法分析主程序示意图
  ②递归下降分析程序示意图如下图图C.4递归下降分析程序示意图
③语句串分析过程示意图如下图图C.5 语句串分析示意图
  ④statement语句分析函数流程如图C.6、图C.7、图C.8、图C.9所示。图C.9 factory分析函数示意图  ⑵ 源代码# include # include char prog[80],token[8];char ch;int syn,p,m,n,sum=0,kk;char *rwtab[6]={"begin","if","then","while","do","end"};void scaner();Irparser();yucu();statement();expression();term();factor();
void main(){    p=0;    printf("\n please input string:\n");    do{        scanf("%c",&prog[p++]);    }while(prog[p-1]!='#');    p=0;165
 
语法分析kk=0;    scaner();    Irparser();    getch();/*    do{        scaner();        switch(syn)        {        case 11:printf("(11,%d) ",sum);break;        case -1:printf("error! ");break;        default:printf("(%d,%s) ",syn,token);        getch();        }    }while(syn!=0);    */}
void scaner(){    for(n=0;n<8;n++)        token[n]=NULL;    sum=0;    ch=prog[p++];    while(ch==' ')        ch=prog[p++];    if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))    {        m=0;        while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9'))        {                        token[m++]=ch;            ch=prog[p++];        }        token[m++]='\0';        p--;        syn=10;        for(n=0;n<6;n++)            if(strcmp(token,rwtab[n])==0)            {                syn=n+1;                break;            }    }    else    { if(ch>='0'&&ch<='9')        {            while(ch>='0'&&ch<='9')            {                sum=sum*10+(ch-'0');                ch=prog[p++];            }            p--;            syn=11;        }        else        {            switch(ch)            {            case '<':                m=0;                token[m++]=ch;                ch=prog[p++];                if(ch=='>')                {                    syn=21;                    token[m++]=ch;                }                else if(ch=='=')                {                    syn=22;                    token[m++]=ch;                }                else                {                    syn=20;                    p--;                }                break;            case '>':                m=0;                token[m++]=ch;                ch=prog[p++];                if(ch=='=')                {                    syn=24;                    token[m++]=ch;                }                else                {                    syn=23;  p--;                }                break;            case ':':                m=0;                token[m++]=ch;                ch=prog[p++];                if(ch=='=')                {                    syn=18;                    token[m++]=ch;                }                else                {                    syn=17;                    p--;                }                break;            case'+':syn=13;token[0]=ch;break;            case'-':syn=14;token[0]=ch;break;            case'*':syn=15;token[0]=ch;break;            case'/':syn=16;token[0]=ch;break;            case'=':syn=25;token[0]=ch;break;            case';':syn=26;token[0]=ch;break;            case'(':syn=27;token[0]=ch;break;            case')':syn=28;token[0]=ch;break;            case'#':syn=0;token[0]=ch;break;            default:syn=-1;            }        }    }}
Irparser(){    if(syn==1)    {        scaner();        yucu();        if(syn==6)        {            scaner();            if(syn==0&&kk==0)                printf("success\n");        }        else
 
编译原理 语法分析 {            if(kk!=1)                printf("lost 'end'\n");            kk=1;        }    }    else    {        printf("lost 'begin'\n");        kk=1;    }    return;}
yucu(){    statement();    while(syn==26)    {        scaner();        statement();    }    if(syn!=6)    {        printf("error input\n");        kk=1;    }    return;}
statement(){    if(syn==10)    {        scaner();        if(syn==18)        {            scaner();lwfree.cn        printf("error in letter\n");        kk=1;    }    return;}
expression(){    term();    while(syn==13||syn==14)    {        scaner();        term();    }    return;}
term(){    factor();    while(syn==15||syn==16)    {        scaner();        factor();    }    return;}
factor(){    if(syn==10||syn==11)        scaner();    else if(syn==27)    {        scaner();        expression();        if(syn==28)            scaner();        else        {            printf("lost ')'\n");            kk=1;        }    }  else    {        printf("the expression is wrong\n");        kk=1;    }    return;}
4、 测试数据与实验结果(可以抓图粘贴)5、 结果分析与实验体会  本次编译原理是第二次上机实验,实验的内容是语法分析,实现对单词序列语法检查和结构分析。  实验的语法分析利用C语言编制递归下降分析程序,对简单语言进行语法分析。语法分析的任务是在词法分析的基础上,根据语言的语法规则从单词符号串中识别出各种语法单位(如表达式、说明、语句等)并进行语法检查,即检查各种语法结构上的正确性。  通过本次实验,使我更加深入地了解了编译原理的语法分析的意义,为我们帮助理解课本上的知识起了非常重要的作用。
  • 上一篇资讯: vc学生成绩管理系统
  • 下一篇资讯: 编译原理词法分析
  • 设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
    版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师