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

一、    实验目的

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

二、    实验内容和要求

输入:算术表达式;

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

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

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("\nplease input a string (end with '#'): \n");  
  
   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("\nTrue!\n");
        }
        else
        error();
    }
    else if(syn==11||syn==10)
        scaner();
}

error()
{
    printf("\n Syn Error!\n");
}

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++]='\0';  
        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. 运行结果及分析

 

posted on 2016-12-23 23:37  189黄思慧  阅读(3446)  评论(0编辑  收藏  举报