用递归下降分析求表达式的值

《数据结构》中表达式求值的经典算法是用两个栈,一个存数字,一个存运算符。依次读入表达式中的每个字符,若是数字则进数字栈,若是运算符则和运算符栈的栈顶运算符比较优先权作相应操作,直至整个表达式求值完毕。运算符的优先级表如下

  + - * / ( ) #
+ > > < < < > >
- > > < < < > >
* > > > > < > >
/ > > > > < > >
( < < < < < =  
) > > > >   > >
# < < < < <  
=

学了编译原理后,发现可以用递归下降分析来求表达式的值。表达式的文法如下

<Expr>    ->  <Term> { (+|-) <Term> }
<Term>   ->  <Factor> { (*|/) <Factor> }
<Factor>  ->  (<Expr>) | num

按照递归下降分析的技巧,每一个非终结符写一个函数

#pragma once
#include<string>
using namespace std;

/************************************************************************/
/*
文法如下
<Expr>    ->  <Term> { (+|-) <Term> }
<Term>   ->  <Factor> { (*|/) <Factor> }
<Factor>  ->  (<Expr>) | num

/************************************************************************/

class Calculator
{
public:
    Calculator(string &str);
    ~Calculator();
    double calculate() { return ans; }
    double ans;    //表达式的值
private:
    int cur;    //目前的位置
    string str;
    double expression();
    double term();
    double factor();
};

Calculator.h

#include "Calculator.h"

Calculator::Calculator(string & str) :str(str),cur(0),ans(0)
{
    ans = expression();
}

Calculator::~Calculator()
{
}

double Calculator::expression()
{
    double num1 = term();
    double num2;
    while (str[cur] == ‘+‘ || str[cur] == ‘-‘)
    {
        char op = str[cur++];    //运算符
        num2 = term();
        if (op == ‘+‘)    num1 += num2;
        else if (op == ‘-‘)    num1 -= num2;
    }
    if (str[cur] == ‘)‘)    ++cur;    //factor遇到‘(‘会调用此函数,因此要吃掉‘)‘
    return num1;
}

double Calculator::term()
{
    double num1 = factor();
    double num2;
    while (str[cur] == ‘*‘ || str[cur] == ‘/‘)
    {
        char op = str[cur++] ;
        num2 = factor();
        if (op == ‘*‘)    num1 *= num2;
        else if (op == ‘/‘)    num1 /= num2;
    }
    return num1;
}

double Calculator::factor()
{
    char tmp = str[cur];
    if (cur < str.size() - 1)
        ++cur;
    if (tmp == ‘(‘)
        return expression();
    else
        return tmp -‘0‘;

}

main函数

#include <iostream>
#include "Calculator.h"
using namespace std;

int main()
{
    string str;
    cin >> str;
    Calculator cal(str);
    cout << cal.calculate() << endl;
}

运行结果:

时间: 2024-10-12 15:32:06

用递归下降分析求表达式的值的相关文章

【龙书笔记】用Python实现一个简单数学表达式从中缀到后缀语法的翻译器(采用递归下降分析法)

上篇笔记介绍了语法分析相关的一些基础概念,本篇笔记根据龙书第2.5节的内容实现一个针对简单表达式的后缀式语法翻译器Demo. 备注:原书中的demo是java实例,我给出的将是逻辑一致的Python版本的实现. 在简单后缀翻译器代码实现之前,还需要介绍几个基本概念. 1. 自顶向下分析法(top-down parsing) 顾名思义,top-down分析法的思路是推导产生式时,以产生式开始符号作为root节点,从上至下依次构建其子节点,最终构造出语法分析树.在具体实现时,它会把输入字符串从左到右

递归下降分析-实验报告

实验四:语法分析实验 一.    实验目的 编制一个递归下降分析程序. 二.    实验内容和要求 输入:算术表达式: 输出:判断结果(输入正确/错误). 三.实验方法.步骤及结果测试 1.源程序名:递归下降分析.c    可执行程序名:递归下降分析.exe 2. 原理分析及流程图 3. 主要程序段及其解释: #include<stdio.h> #include<string.h> char str[10]; int index=0; void E(); //E->TX; v

实验三、&#160;递归下降分析程序实验

实验三. 递归下降分析程序实验 专业 软件工程   姓名 麦振澎 学号 201506110162 一.        实验目的           通过设计,编制,调试一个递归下降语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构的分析. 二.        实验内容和要求 输入:源程序字符串 输出:正确或者错误 三.        实验方法.步骤及结果测试             1.      源程序名: 递归下降语法分析程序.c       2.      原理分析及流程图

递归下降分析实验报告

                                                                      实验四:语法分析实验 一.        实验目的   编写递归下降分析语法分析程序. 二.        实验内容和要求 输入:输入算术表达式以"#"结束 输出:是否分析成功 三.        实验方法.步骤及结果测试  1.      源程序名:压缩包文件(rar或zip)中源程序名 语法分析.c 可执行程序名:语法分析.exe 2.    

递归下降分析程序

一.      实验目的 编制一个递归下降分析程序 LL(1)文法: E->TE1 E1->+TE1|-TE1|∑ T->FT1; T1->*FT1|/FT1|∑ F->(E)|i|1 二.      实验内容和要求 输入:LL(1)文法 判断:每遇到一个终结符,则判断当前读入的单词符号是否与该终结符相匹配,若匹配,则继续读取下一个单词符号,若不匹配,则进行错误处理. 每遇到一个非终结符,则调用相应的分析子程序 一.      实验方法.步骤及结果测试   1.   源程序名

实验三 递归下降分析法

实验三递归下降分析程序实验 专业 商软2班   姓名 蓝海鹏  学号 201506110171 一.        实验目的      编制一个使用递归下降分析法实现的语法分析程序. 二.        实验内容和要求 输入:正规式 输出:判断该正规式是否正确. 三.        实验方法.步骤及结果测试 1.      源程序名:171-蓝海鹏.c 可执行程序名:171蓝海鹏.exe 2.      原理分析及流程图 3.      主要程序段: 1 #include<stdio.h> 2

203-陈冠权-递归下降分析

递归下降分析: 对于给定的文法G[E] : E→E+T|E-T|T T→T*F| T/F|F F→(E)|i 消除左递归后的文法是: E→TE' E'→+TE'|-TE'|∑ T→FT' T'→*FT'|/FT'|∑ F→(E)|i 是否是LL(1)文法? select(E→TE')=first(TE')={(,i} select(E'→+TE')=first(+TE')={+} select(E'→-TE')=first(-TE')={-} select(E'→∑)=follow(E')={)

求表达式的值--栈和队列的应用

1 #include<stdio.h> 2 #include<stdlib.h> 3 4 #define OK 1 5 #define ERROR 0 6 #define STACK_SIZE 20 7 #define STACK_INCREMENT 10 8 #define QUEUE_SIZE 20 9 10 typedef int Status; 11 12 typedef char StackElemtype; 13 typedef struct Stack{ 14 Sta

递归下降分析程序报告

实验一.递归下降分析程序实验 专业 商业软件工程   姓名 姓名 学号 201506110148 一.        实验目的   编译递归下降分析程序识别c语言文法 二.        实验内容和要求 简单写出c语言文法 分析c语言文法是否为LL1文法,若不是,修改成LL1文法. 编写程序实现对c语言LL1文法判断是否有语法错误 三.        实验方法.步骤及结果测试  1.      源程序名:递归下降分析程序 源程序名递归下降分析程序.c 可执行程序名:递归下降分析程序.exe 2.