实验报告-语法分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验报告-语法分析相关的知识,希望对你有一定的参考价值。

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

一、    实验目的

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

二、    实验内容和要求

输入:算术表达式;

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

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

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. 运行结果及分析

 

技术分享技术分享

以上是关于实验报告-语法分析的主要内容,如果未能解决你的问题,请参考以下文章

递归下降分析-实验报告

java实验报告总结

第一次实验报告:使用Packet Tracer分析HTTP数据包

第一次实验报告:使用Packet Tracer分析HTTP数据包

第二次实验报告:使用Packet Tracer分析应用层协议

第二次实验报告:使用Packet Tracer分析应用层协议