zoukankan      html  css  js  c++  java
  • 实验报告(3)-语法分析

    实验三:递归下降语法分析实验

    一、    实验目的

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

    二、    实验内容和要求

    输入:算术表达式;

    输出:判断结果(输入正确/错误)。

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

    1.源程序名:递归下降语法分析.c

       可执行程序名:递归下降语法分析.exe

    2. 原理分析及流程图

         采用递归子程序方法进行语法分析,对文法中的每个非终结符号按其产生式结构产生相应的语法分析子程序,完成相应的识别任务。其中终结符产生匹配命令,非终结符则产生调用命令。

    流程图:

    3. 主要程序段及其解释:

    #include<stdio.h>
    #include<string.h>
    
    char prog[100],token[8],ch; 
    char *rwtab[6]={"begin","if","then","while","do","end"};  
    int syn,p,m,n,sum;
    
    void E();            //E->TE1;
    void E1();           //E1->+TE1|-TE1|ε
    void T();            //T->FT1
    void T1();            //T1->*FT1 |/FT1|ε
    void F();            //F->(E) | i
    
    error();
    void scaner();
    
    int main()  
    {  
        
        p=0;  
        printf("
    please input a string (end with '#'): 
    ");  
      
       do  
        {  
            scanf("%c",&ch);  
            prog[p++]=ch;  
        }while(ch!='#'); 
        
        p=0;
        scaner();
        E();
    
    }  
    
    
    void E()
    {
        T();
        E1();  
    }
    
    void E1()
    {
        if((syn==13)||(syn==14))
        {
            scaner();
            T();
            E1();
            
        }
        else 
        {
            if(syn!=28 && syn!=0)
            error();
        }
    }
    
    void T()
    {
        F();
        T1();
    }
    void T1()
    {
        if((syn==15)||(syn==16))
        {
           scaner();
           F();
           T1();
        }
        else 
        {
            if(syn!=28 && syn!=0 && syn!=13)
            error();
        }
        
    }
    void F()
    {
        if(syn==27)
        {
            scaner();
            E();
            if(syn==28)
            {
                scaner();
                E();
                if(syn==0)
                    printf("
    True!
    ");
            }
            else
            error();
        }
        else if(syn==11||syn==10)
            scaner();
    }
    
    error()
    {
        printf("
     Syn Error!
    ");
    }
    
    void scaner()  
    {  
        sum=0;  
      
        for(m=0;m<8;m++)  
            token[m++]=NULL;  
          
        m=0;  
        ch=prog[p++];  
          
        while(ch==' ')  
            ch=prog[p++];  
          
        if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))  
        {   
            while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))  
            {  
                token[m++]=ch;  
                ch=prog[p++];  
            }  
            p--;  
            syn=10;  
            token[m++]='';  
            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;  
                ch=prog[p++];  
                if(ch=='>')  
                {   
                    syn=21;  
                }  
                else if(ch=='=')  
                {   
                    syn=22;  
                }  
                else  
                {   
                    syn=20;  
                    p--;  
                }  
            break;  
              
            case '>':  
                m=0;  
                ch=prog[p++];  
                if(ch=='=')  
                {   
                    syn=24;  
                }  
                else  
                {  
                    syn=23;  
                    p--;  
                }  
            break;  
              
            case ':':  
                m=0;  
                ch=prog[p++];  
                if(ch=='=')  
                {  
                    syn=18;  
                }  
                else  
                {  
                    syn=17;  
                    p--;  
                }  
                break;  
                  
            case '+':  
                syn=13;  
            break;  
              
            case '-':   
                syn=14;  
            break;  
              
            case '*':  
                syn=15;  
            break;  
              
            case '/':   
                syn=16;  
            break;  
              
            case '(':   
                syn=27;  
            break;  
              
            case ')':   
                syn=28;  
            break;  
              
            case '=':  
                syn=25;  
            break;  
              
            case ';':   
                syn=26;  
            break;  
              
            case '#':  
                syn=0;  
            break;  
              
            default:  
                syn=-1;  
            break;  
        }  
    }  

    4. 运行结果及分析

  • 相关阅读:
    dp uva1025
    dp uva10003
    dp最优矩阵相乘poj1651
    dp uva11584
    动态规划uva11400
    流形学习 (Manifold Learning)
    tf.nn.embedding_lookup
    word2vec
    word2vec 细节解析1
    collections-Counter
  • 原文地址:https://www.cnblogs.com/ashh/p/6216447.html
Copyright © 2011-2022 走看看