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
  • 相关阅读:
    jsp grid can not be used in this ('quirks') mode
    weblogic stage更改不马上生效
    shell执行class或jar
    java json字符串与对象转换
    js对象及元素复制拷贝
    js中json字符串与对象的转换及是否为空
    js window.open隐藏参数提交
    poi excel文件名或者内容中文乱码
    linux poi生成excel demo调试附调用代码
    PeekMessage与GetMessage的对比
  • 原文地址:https://www.cnblogs.com/mazhuang/p/1641659.html
Copyright © 2011-2022 走看看