编译原理实验三 递归下降分析法【C语言实现】

实验报告

一、实验目的:

根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。

二、实验内容

(1)功能描述:该程序具有什么功能?

(2)程序结构描述:函数调用格式、参数含义、返回值描述、函数功能;函数之间的调用 关系图。

(3)程序总体执行流程图

三、代码实现

#include <stdio.h>
#include<dos.h>
#include<stdlib.h>
#include<string.h>

char a[50] ,b[50],d[500],e[10];
char ch;
int n1,i1=0,flag=1,n=5;
int E();
int E1();
int T();
int G();
int S();
int F();
void input();
void input1();
void output();
void main()                      
{
    int f,p,j=0;
    char x;
    d[0]='E';
    d[1]='=';
    d[2]='>';
    d[3]='T';
    d[4]='G';
    d[5]='#';
    printf("实验三 递归下降分析:王凯,学号:320202010114,计科2001\n");
    printf("输入一以#结束的符号串(包括+ - * / ( ) i #:");
    do{
        scanf("%c",&ch);
        a[j]=ch;
        j++;
    }while(ch!='#');
    n1=j;
    ch=b[0]=a[0];
    printf("文法\t分析串\t\t\t分析字符\t\t剩余串\n");
    f=E1();
    if(f==0) return ;
    if (ch=='#')  
    {   printf("accept\n");
        p=0;
        x=d[p];
        //    {
        //            printf("%c",x);p=p+1;x=d[p];         
        //        }    
        while(a[p]!='#') 
            printf("%c",a[p++]);
        printf("为合法字符!\n");
    }
    else {
        //    printf("error\n");
        j=0;
        while(a[j]!='#') 
            printf("%c",a[j++]);
        printf("非法字符!\n");
        printf("回车返回\n");
        getchar();getchar(); 
        return; 
    }
    printf("\n");
    printf("回车返回\n");
    getchar();
    getchar();
}
int E1()
{   int f,t;
    printf("E-->TG\t");
    flag=1;
    input();
    input1();
    f=T();
    if (f==0) return(0);
    t=G();
    if (t==0) return(0);
    else return(1);
}

int E()
{   int f,t;
    printf("E-->TG\t");
    e[0]='E';e[1]='=';e[2]='>';e[3]='T';e[4]='G';e[5]='#';
    output();
    flag=1;
    input();
    input1();
    f=T();
    if (f==0) 
        return(0);
    t=G();
    if (t==0) return(0);
    else return(1);
}
int T()
{   int f,t;
    printf("T-->FS\t");
    e[0]='T';e[1]='=';e[2]='>';e[3]='F';e[4]='S';e[5]='#';
    output();
    flag=1;
    input();
    input1();
    f=F();
    if (f==0)
        return(0);
    t=S(); 
    if (t==0) return(0);
    else return(1);
}
int  G()
{   
    int f;
    if(ch=='+')
    {  
        b[i1]=ch;
        printf("G-->+TG\t");
        e[0]='G';e[1]='=';e[2]='>';e[3]='+';e[4]='T';e[5]='G';e[6]='#';
        output();
        flag=0;
        input();input1();
        ch=a[++i1];
        f=T();
        if (f==0)
            return(0);
        f=G();
        if(f==0)
            return 0;
        else return 1;
    }
    else if(ch=='-')
    {  
        b[i1]=ch;
        printf("G-->-TG\t");
        e[0]='G';e[1]='=';e[2]='>';e[3]='-';e[4]='T';e[5]='G';e[6]='#';
        output();
        flag=0;
        input();input1();
        ch=a[++i1];
        f=T();
        if (f==0)
        {
            //            printf("G=%d\n",f);
            return(0);
        }
        f=G();
        if(f==0)
            return 0;
        else return 1;
    }
    else
    {
        printf("G-->^\t");
        e[0]='G';e[1]='=';e[2]='>';e[3]='^';e[4]='#';
        output();
        flag=1; 
        input();input1();
        return(1);
    }
}

int S()
{
    int f,t;
    if(ch=='*')
    { 
        b[i1]=ch;
        printf("S-->*FS\t");
        
        e[0]='S';e[1]='=';e[2]='>';e[3]='*';e[4]='F';e[5]='S';e[6]='#';
        output();
        flag=0;
        input();input1();
        ch=a[++i1];
        f=F();
        if (f==0)
            return(0);
        t=S();
        if (t==0)
            return(0);
        else return(1);}
    else if(ch=='/')
    { 
        b[i1]=ch;
        printf("S-->/FS\t");
        
        e[0]='S';e[1]='=';e[2]='>';e[3]='/';e[4]='F';e[5]='S';e[6]='#';
        output();
        flag=0;
        input();input1();
        ch=a[++i1];
        f=F();
        if (f==0)
            return(0);
        t=S();
        if (t==0)
            return(0);
        else return(1);}
    else
    {
        printf("S-->^\t");
        e[0]='S';e[1]='=';e[2]='>';e[3]='^';e[4]='#';
        output();
        flag=1; 
        a[i1]=ch;
        input();input1();
        return(1);
    }
}
int F()
{   int f;int j;
    if(ch=='(')
    { 
        b[i1]=ch;
        printf("F-->(E)\t");
        e[0]='F';e[1]='=';e[2]='>';e[3]='(';e[4]='E';e[5]=')';e[6]='#';
        output();
        flag=0;
        input();input1();
        ch=a[++i1];
        f=E();
        if (f==0) return(0);
        if(ch==')') 
        {
            b[i1]=ch;
            printf("F-->(E)\t");
            
            flag=0;input();input1();  
            ch=a[++i1];
        }
        else
        {
            printf("error\n");
            j=0;
            while(a[j]!='#') 
                printf("%c",a[j++]);
            printf("非法字符!\n");
            return(0);
        }
    }
    else if(ch=='i')
    { 
        b[i1]=ch;
        printf("F-->i\t");
        e[0]='F';e[1]='=';e[2]='>';e[3]='i';e[4]='#';
        output();
        flag=0;input();input1();
        ch=a[++i1]; 
    }
    else {
        printf("error\n");
        j=0;
        while(a[j]!='#') 
            printf("%c",a[j++]);
        printf("非法字符!\n");
        return(0);
    }
    return(1);
}
void input()                      
{
    int j=0;
    for (;j<=i1-flag;j++)
        printf("%c",b[j]);                    
    printf("\t\t\t");
    printf("%c\t\t\t",ch);                   
}

void input1()
{
    int j;
    for (j=i1+1-flag;j<n1;j++)
        printf("%c",a[j]);                     
    printf("\n");
}
void output(){                             
    int m,k,j,q;
    int i=0;
    m=0;k=0;q=0;
    i=n;
    d[n]='=';d[n+1]='>';d[n+2]='#';n=n+2;i=n;
    i=i-2;
    while(d[i]!='>'&&i!=0) i=i-1;
    i=i+1;
    while(d[i]!=e[0]) i=i+1;
    q=i;
    m=q;k=q;
    while(d[m]!='>')  m=m-1;
    m=m+1;
    while(m!=q) {
        d[n]=d[m];m=m+1;n=n+1;
    }
    d[n]='#';
    for(j=3;e[j]!='#';j++){
        d[n]=e[j];
        n=n+1;
    }
    k=k+1;
    while(d[k]!='=')  {
        d[n]=d[k];n=n+1;k=k+1;
    }
    d[n]='#';
}

运行结果
​​​​​
  • 11
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangkay88

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值