zoukankan      html  css  js  c++  java
  • 递归下降分析程序

    一、      实验目的

    编制一个递归下降分析程序

    LL(1)文法:

    E->TE1

    E1->+TE1|-TE1|∑

    T->FT1;

    T1->*FT1|/FT1|∑

    F->(E)|i|1

    二、      实验内容和要求

      输入:LL(1)文法

    判断:每遇到一个终结符,则判断当前读入的单词符号是否与该终结符相匹配,若匹配,则继续读取下一个单词符号,若不匹配,则进行错误处理。

           每遇到一个非终结符,则调用相应的分析子程序

    一、      实验方法、步骤及结果测试

     

    1. 1.   源程序名:   

    源程序名

    可执行程序名:

    1. 2.   原理分析及流程图

    /*存储结构以及变量*/

    char character[80];//存放所有输入的字符

    char*rwtab[6]={"begin","if","then","while","do","end"};

    char token[8];//单词自身字符串

    char ch;//单个字符

    int sym;//sym:单词种别码

    int p,m=0,i,row,sum=0;//sum:整型常数 row:记录新读入的字符行的行号

    /*主要算法*/

    void scanner();

    E();

    E1();

    T();

    T1();

    F();

     #include<stdio.h>
    #include<string.h>
    char character[80];//存放所有输入的字符
    char token[8];//单词自身字符串
    char ch;//单个字符
    int sym;//sym:单词种别码
    int p,m=0,i,row,sum=0;//sum:整型常数 row:记录新读入的字符行的行号
    char*rwtab[6]={"begin","if","then","while","do","end"};
    void scanner();
    E();
    E1();
    T();
    T1();
    F();
    error();
    
    
    void main()
    {
        p=0;
        row=1;
        printf("请输入一串字符串
    ");
        do
        {
            ch=getchar();
            character[i++]=ch;
        }while(ch!='#');//输入以#号键结束
    p=0;
    do
    {
      scanner();//识别单词
      switch(sym)
      {
        case 11:printf("(%d,%d)
    ",sym,sum);break;
        case -1:printf("error in row %d!
    ",row);break;
        case -2:row=row++;break;
        default:printf("(%d,%s)
    ",sym,token);break;
      }
    }while(sym!=0);
    printf("
      Token Over. 
    ");
    
        system("pause");
        p=0;
        scanner();
         E();
         if (sym==0)
                  printf("
     Syntax success. 
    ");
         else     printf("
      Syntax fail. 
    ");
    
    }
    
    //词法分析程序
    void scanner()
    {
        for(i=0;i<8;i++)
            token[i]=NULL;
           ch=character[p++];
        while(ch==' ')
        {
            ch=character[p];
            p++;
        }
        if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))//标识符或者变量名
        {
            m=0;
            while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
            {
                token[m++]=ch;
                ch=character[p++];
            }
                token[m++]='';
                p--;
                sym=10;
                for(i=0;i<6;i++)  //将识别出来的字符和已定义的标示符作比较,
                if(strcmp(token,rwtab[i])==0)
                {
                    sym=i+1;
                    break;
                }
        }
        else if((ch>='0'&&ch<='9'))//数字
        {
            sum=0;
            while((ch>='0'&&ch<='9'))
                {
                    sum=sum*10+ch-'0';
                    ch=character[p++];
    
                }
                p--;
                sym=11;
                if(sum>32767)
                    sym=-1;
        }
        else switch(ch)//其他字符
        {
        case'<':m=0;token[m++]=ch;
            ch=character[p++];
            if(ch=='=')
            {
                sym=21;
                token[m++]=ch;
            }
            else if(ch=='>')
            {
                sym=22;
                token[m++]=ch;
            }
            else
            {
                sym=23;
                p--;
            }
            break;
        case'>':m=0;token[m++]=ch;
           ch=character[p++];
           if(ch=='=')
           {
               sym=24;
               token[m++]=ch;
           }
           else
           {
               sym=20;
               p--;
           }
           break;
        case':':m=0;token[m++]=ch;
           ch=character[p++];
           if(ch=='=')
           {
               sym=18;
               token[m++]=ch;
           }
           else
           {
               sym=17;
               p--;
           }
           break;
            case'+':sym=13;token[0]=ch;break;
            case'-':sym=14;token[0]=ch;break;
            case'*':sym=15;token[0]=ch;break;
            case'/':sym=16;token[0]=ch;break;
            case'=':sym=25;token[0]=ch;break;
            case';':sym=26;token[0]=ch;break;
            case'(':sym=27;token[0]=ch;break;
            case')':sym=28;token[0]=ch;break;
            case'#':sym=0;token[0]=ch;break;
            case'
    ':sym=-2;break;
            default:sym=-1;break;
    
        }
    }
    //E程序
    E()
    {
        printf("E ");
        T();
        E1();
    }
    E1()
    {
           printf("E1 ");
        if(sym==13||sym==14 )
        {
        scanner();
        T();
        E1();
        }
        else {
            if (sym!=28 && sym!=0) error();
        }
    }
    T()
    {
           printf("T ");
        F();
        T1();
    
    }
    T1()
    {
           printf("T1 ");
        if(sym==15||sym==16)
        {
            scanner();
            F();
            T1();
        }
        else {
            if (sym!=28 && sym!=0 && sym!=13&& sym!=14) error();
        }
    }
    F()
    {
           printf("F ");
        if(sym==27)
        {
            scanner();
            E();
            if(sym==28)
              scanner() ;
            else error();
        }
        else
        {
            if(sym==10||sym==11)
              scanner();
        }
    }
    error()
    {
        printf("
     (%d,%s)Syntax Error! 
    ",sym, token);
    }

    运行结果:

  • 相关阅读:
    C# 利用VS自带的WSDL工具生成WebService服务类
    七大管理工具
    在线教育系统
    Redis学习一
    酒店管理系统
    大数据学习一
    nginx负载均衡/反向代理学习一
    微服务学习十
    分布式学习一
    Abstract和Virtual和interface , 派生类中重写 override / new关键字
  • 原文地址:https://www.cnblogs.com/yjxblog/p/6212937.html
Copyright © 2011-2022 走看看