码迷,mamicode.com
首页 > 其他好文 > 详细

实验报告(3)-语法分析

时间:2016-12-24 02:23:57      阅读:291      评论:0      收藏:0      [点我收藏+]

标签:print   ges   语法   div   please   http   错误   内容   执行   

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

一、    实验目的

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

二、    实验内容和要求

输入:算术表达式;

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

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

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

 

技术分享技术分享

实验报告(3)-语法分析

标签:print   ges   语法   div   please   http   错误   内容   执行   

原文地址:http://www.cnblogs.com/ashh/p/6216447.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!