• 实验四、递归下降语法分析实验


    1. 实验目的

      1)掌握自上而下语法分析的要求与特点。

      2)掌握递归下降语法分析的基本原理和方法。

      3)掌握相应数据结构的设计方法。

    2. 实验内容和要求

        编程实现给定算术表达式的递归下降分析器。

      算术表达式文法如下:

       E-->E+T|T

       T-->T*F|F

        F-->(E)|i

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

       

      1. 原理分析及流程图

        1)当遇到终结符a时,则编写语句

        If(当前读到的输入符号==a)读入下一个输入符号

        2)当遇到非终结符A时,则编写语句调用A()

        3)当遇到A-->ε规则时,则编写语句
        If(当前读到的输入符号不属于Follow(A))error()

        4)当某个非终结符的规则有多个候选式时,按LL(1)文法的条件能唯一地选择一个候选式进行推导.

      2. 主要程序段及其解释:

        #include<stdio.h>

        void E();

        void T();

        void E1();

        void T1();

        void F();

        char s[100];

        int i, SIGN;

        int main()

        {

        printf("请输入一个语句#号结束语句直接输入#号推出\n");

        while( 1 )

        {

        SIGN = 0;

        i=0;

        scanf("%s",&s);

        if( s[0] == '#')

        return 0;

        E();

        if(s[i]=='#')

        printf("正确语句\n");

        printf("请输入一个语句#号结束语句\n");

        }

        return 1;

        }

        void E()

        {

        if(SIGN==0)

        {

        T();

        E1();

        }

        }

        void E1()

        {

        if(SIGN==0)

        {

        if(s[i]=='+')

        {

        ++i;

        T();

        E1();

        }

        else if(s[i]!='#'&&s[i]!=')')

        {

        printf("语句有误\n");

        SIGN=1;

        }

        }

        }

        void T()

        {

        if(SIGN==0)

        {

        F();

        T1();

        }

        }

        void T1()

        {

        if(SIGN==0)

        {

        if(s[i]=='*')

        {

        ++i;

        F();

        T1();

        }

        else if(s[i]!='#'&&s[i]!=')'&&s[i]!='+')

        {

        printf("语句有误\n");

        SIGN=1;

        }

        }

        }

        void F()

        {

        if(SIGN==0)

        {

        if(s[i]=='(')

        {

        ++i;

        E();

        if(s[i]==')')

        ++i;

        else if(s[i]== '#')

        {

        printf("语句有误\n");

        SIGN=1;

        ++i;

        }

        }

        else if(s[i]=='i')

        ++i;

        else

        {

        printf("语句有误\n");

        SIGN=1;

        }

        }

        }

      3. 运行结果及分析

      4. 实验总结

        运用递归下降分析法完成了本试验的语法分析构造,并且成功的分析出每种正确的句子和错误的句子。函数的构造是根据文法分析的递归过程,所编写每个函数的功能,以文法的右部为函数名,对应的左部为相应分析过程。此分析法简单,直观,易构造分析程序,但是不适于文法过于复杂的,不易检查出错误。

  • 相关阅读:
    poi 导出Excel
    【EasyUI】combotree和combobox模糊查询
    多线程和Socket套接字
    io流
    前端页面的语法 jquery javascript ajax
    spring+mybatis
    Exchanger 原理
    CountDownLatch、CyclicBarrier和 Semaphore
    sleep() 、join()、yield()有什么区别
    创建线程的方式及实现
  • 原文地址:https://www.cnblogs.com/cs007/p/6188638.html
Copyright © 2020-2023  润新知