• 递归下降分析实验报告


    实验四:语法分析实验

    一、    实验目的

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

    E→TE'

    E'→(+T|-T)E'|ε

    T→FT'

    T'→(*F|/F)T'|ε

    F→(E)|i

    二、    实验内容和要求

    输入:算术表达式;

    判断:每遇到一个终结符,则判断当前读入的单词符号是否与该终结符相匹配,若匹配,则继续读取下一个单词符号,若不匹配,则进行错误处理。

           每遇到一个非终结符,则调用相应的分析子程序

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

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

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

    #include<stdio.h>
    #include<string.h>
    void scaner();
    error();
    E();
    E1();
    T();
    T1();
    F();
    char character[80];//存放所有输入的字符
    char token[8];//单词自身字符串
    char ch;//单个字符
    int p,m=0,i,sum=0,syn;//sum:整型常数 row:记录新读入的字符行的行号,syn:单词种别码
    char *keywords[6]={"begin","if","then","while","do","end"};
    void main(){
    p=0;
    printf("请输入一串字符串:");
    do
    {
    ch=getchar();
    character[i++]=ch;
    }while(ch!='#');//输入以#号键结束
    p=0;
    do
    {
    scaner();//识别单词
    switch(syn)
    {
    case 11:printf("(%d,%d)\n",syn,sum);break;
    case -1: printf("(%s,#)\n",token);break;
    default:printf("(%d,%s)\n",syn,token);break;
    }
    }while(syn!=0);
    p=0;
    scaner();
    E();
    if(syn==0)
    printf("success!\n");
    else
    printf("failure!\n");
    }
    //词法分析程序
    void scaner()
    {
    for(i=0;i<8;i++)
    token[i]=NULL;
    ch=character[p++];
    while(ch==' ')
    {
    ch=character[p];
    p++;
    }
    if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))//标识符或者变量名
    {
    m=0;
    while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
    {
    token[m++]=ch;
    ch=character[p++];
    }
    token[m++]='\0';
    p--;
    syn=10;
    for(i=0;i<6;i++) //将识别出来的字符和已定义的标示符作比较,
    if(strcmp(token,keywords[i])==0)
    {
    syn=i+1;
    break;
    }
    }
    else if((ch>='0'&&ch<='9'))//数字
    {
    sum=0;
    while((ch>='0'&&ch<='9'))
    {
    sum=sum*10+(ch-'0');
    ch=character[p++];

    }
    syn=11;
    p--;
    }
    else switch(ch)//其他字符
    {
    case'<':m=0;token[m++]=ch;
    ch=character[p++];
    if(ch=='=')
    {
    syn=21;
    token[m++]=ch;
    }
    else if(ch=='>')
    {
    syn=22;
    token[m++]=ch;
    }
    else
    {
    syn=23;
    p--;
    }
    break;
    case'>':m=0;token[m++]=ch;
    ch=character[p++];
    if(ch=='=')
    {
    syn=24;
    token[m++]=ch;
    }
    else
    {
    syn=20;
    p--;
    }
    break;
    case':':m=0;token[m++]=ch;
    ch=character[p++];
    if(ch=='=')
    {
    syn=18;
    token[m++]=ch;
    }
    else
    {
    syn=17;
    p--;
    }
    break;
    case'+':syn=13;token[0]=ch;break;
    case'-':syn=14;token[0]=ch;break;
    case'*':syn=15;token[0]=ch;break;
    case'/':syn=16;token[0]=ch;break;
    case'=':syn=25;token[0]=ch;break;
    case';':syn=26;token[0]=ch;break;
    case'(':syn=27;token[0]=ch;break;
    case')':syn=28;token[0]=ch;break;
    case'#':syn=0;token[0]=ch;break;
    default:syn=-1;break;

    }
    }
    error()
    {
    printf("(%d,%s)failure! \n",syn, token);
    }
    E()
    {
    T();
    E1();
    }
    E1()
    {
    if(syn==13||syn==14)
    {
    scaner();
    T();
    E1();
    }

    }
    T()
    {
    F();
    T1();
    }
    T1()
    {
    if(syn==15||syn==16)
    {
    scaner();
    F();
    T1();
    }else if(syn!=28 && syn!=0 && syn!=13 && syn!=14)
    error();

    }
    F()
    {
    if(syn==27)
    {
    scaner();
    E();
    if(syn==28)
    scaner();
    else error();
    }
    else if(syn==10||syn==11)
    scaner();
    }

  • 相关阅读:
    鸽巢原理(The Pigeonhole Principle)(抽屉原理)
    VS2010显示行号
    HDU 2546 饭卡
    组合数学之排列组合(Permutations and Combinations)(四种情况)
    php中的$_SERVER方法初识
    重新认识hasLayout——IE浏览器css bug的一大罪恶根源 转
    javascript实现简单的链式调用
    Javascript 静态类的实现
    Object类相关的属性,方法和操作符
    <转>前端开发中的MCRV模式
  • 原文地址:https://www.cnblogs.com/dengjinxiu/p/6215119.html
Copyright © 2020-2023  润新知