zoukankan      html  css  js  c++  java
  • 语法分析:算术表达式递归下降分析程序设计

    1、实验目的:
    (1)掌握自上而下语法分析的要求与特点。
    (2)掌握递归下降语法分析的基本原理和方法。
    (3)掌握相应数据结构的设计方法。

    2、实验内容:
    编程实现给定算术表达式的递归下降分析器。
    算术表达式文法如下:
    E-->E+T|T
    T-->T*F|F
    F-->(E)|i

    3、设计说明:
    首先改写文法为LL(1)文法;然后为每一个非终结符,构造相应的递归过程,过程的名字表示规则左部的非终结符;过程体按规则右部符号串的顺序编写。

    4、设计分析
    这个题目属于比较典型的递归下降语法分析。需要先将原算术表达式方法改写为LL(1)文法为:
    E-->TE'
    E'-->+TE'|ε
    T-->FT'
    T'-->*FT'|ε
    F-->(E)|i
    然后再为每个非终结符设计一个对应的函数,通过各函数之间的递归调用从而实现递归下降语法分析的功能。
    具体方法为:
    (1)当遇到终结符a时,则编写语句
    If(当前读到的输入符号==a)读入下一个输入符号
    (2)当遇到非终结符A时,则编写语句调用A()。
    (3)当遇到A-->ε规则时,则编写语句
    If(当前读到的输入符号不属于Follow(A))error()
    (4)当某个非终结符的规则有多个候选式时,按LL(1)文法的条件能唯一地选择一个候选式进行推导.

    //源程序代码
    #include<iostream>
    #include<string>
    using namespace std;

    void E();
    void E1();
    void T();
    void T1();
    void F();

    string s;
    int i;
    int ERR;
    int SwitchNum;

    int main()
    {
    do
    {
    s="";
    i=0;
    ERR=0;
    cout<<"Please enter your sentence:"<<endl;
    cin>>s;
    s.resize(s.size()+1);
    s[s.size()-1]='#';

    E();
    if(s[i]=='#')
    cout<<"success"<<endl;
    else
    cout<<endl;
    cout<<"输入一个整数继续,其它类型退出:";
    }while(cin>>SwitchNum);
    return 0;
    }

    void E()
    {
    if(ERR==0)
    {
    T();
    E1();
    }
    }

    void E1()
    {
    if(ERR==0)
    {
    if(s[i]=='+')
    {
    ++i;
    T();
    E1();
    }
    else if(s[i]!='#'&&s[i]!=')')
    {
    cout<<"fail"<<endl;
    ERR=1;
    }
    }
    }

    void T()
    {
    if(ERR==0)
    {
    F();
    T1();
    }
    }

    void T1()
    {
    if(ERR==0)
    {
    if(s[i]=='*')
    {
    ++i;
    F();
    T1();
    }
    else if(s[i]!='#'&&s[i]!=')'&&s[i]!='+')
    {
    cout<<"fail"<<endl;
    ERR=1;
    }
    }
    }

    void F()
    {
    if(ERR==0)
    {
    if(s[i]=='(')
    {
    ++i;
    E();
    if(s[i]==')')
    ++i;
    else if(s[i]== '#')
    {
    cout<<"fail"<<endl;
    ERR=1;
    ++i;
    }
    }
    else if(s[i]=='i')
    ++i;
    else
    {
    cout<<"fail"<<endl;
    ERR=1;
    }
    }
    }



    测试用例
    (1)输入i,预期显示success
    (2)输入iii,预期显示fail
    (3)输入a,预期显示fail
    (4)输入(i),预期显示success
    (5)输入(a),预期显示fail
    (6)输入(i+i),预期显示success
    (7)输入(i+i,预期显示fail
    (8)输入((i*i)+i)*i,预期显示success
    (9)输入((((i+i*i)))),预期显示success
    (10)输入(i+ia,预期显示fail
    (11)输入i+i*i+i*a,预期显示fail
  • 相关阅读:
    stenciljs 学习四 组件装饰器
    stenciljs 学习三 组件生命周期
    stenciljs 学习二 pwa 简单应用开发
    stenciljs ionic 团队开发的方便web 组件框架
    stenciljs 学习一 web 组件开发
    使用npm init快速创建web 应用
    adnanh webhook 框架 hook rule
    adnanh webhook 框架 hook 定义
    adnanh webhook 框架request values 说明
    adnanh webhook 框架execute-command 以及参数传递处理
  • 原文地址:https://www.cnblogs.com/mazhuang/p/1641659.html
Copyright © 2011-2022 走看看