`
yesjavame
  • 浏览: 679246 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

用boost::spirit实现的表达式求值

阅读更多

用boost::spirit实现一个表达式求值看上去比较简单。我这个还有点问题,有空格时会解析失败,请大家看看是什么原因?

123*34+2323/324
parsing succeeded
result = 4189
2 + 3
parsing failed

#include <iostream>
#include <stack>
#include <functional>

#include <boost/function.hpp>
// #define BOOST_SPIRIT_DEBUG
#include <boost/spirit.hpp>

using namespace std;
stack<int> evaluationStack;

struct Push
{
void operator()(int d) const
{
evaluationStack.push(d);
}
};

void doOp(boost::function<int(int, int)> op)
{
int rhs = evaluationStack.top();
evaluationStack.pop();
int lhs = evaluationStack.top();
evaluationStack.pop();
int result = op(lhs, rhs);
evaluationStack.push(result);
}

void add2(char const*, char const*) { doOp(std::plus<int>()); }
void sub2(char const*, char const*) { doOp(std::minus<int>()); }
void mul2(char const*, char const*) { doOp(std::multiplies<int>()); }
void div2(char const*, char const*) { doOp(std::divides<int>()); }

int main()
{
using namespace boost::spirit;

/*
group ::= '(' expression ')'
factor ::= integer | group
term ::= factor (('*' factor) | ('/' factor))*
expression ::= term (('+' term) | ('-' term))*

Spirit:
group = '(' >> expression >> ')';
factor = integer | group;
term = factor >> *(('*' >> factor) | ('/' >> factor));
expression = term >> *(('+' >> term) | ('-' >> term));
*/

rule<> group, factor, term, expression;

group = '(' >> expression >> ')';
factor = int_p[Push()] | group;
term = factor
>> *( ('*' >> factor) [&mul2]
| ('/' >> factor) [&div2] )
;
expression = term
>> *( ('+' >> term) [&add2]
| ('-' >> term) [&sub2] )
;

string s;
while (getline(cin, s))
{
if (parse(s.c_str(), expression, space_p).full)
{
cout << "parsing succeeded\n";
cout << "result = " << evaluationStack.top();
evaluationStack.pop();
}
else
{
cout << "parsing failed";
}
cout << endl;
}
}

分享到:
评论

相关推荐

    boost::spirit解析表达式domo

    C++实现的表达式解析,本程序是利用强大的boost::spirit库实现的。这个东西实在是太强大了。 程序运行结果如下: -----------表达式解析--------- 已定义的函数有:PI,SIN,COS,TAN,,ABS,EXP,LOGN,POW,SQRT,FORMAT,...

    boost完美组合(你不用再找其他的boost书籍了)

    这本电子书深入探讨了Boost库如何扩展C++标准库的功能,比如`boost::lambda`库允许在表达式中创建匿名函数,增强函数对象的灵活性;`boost::bind`和`boost::function`提供了函数对象和函数指针的通用接口;`boost::...

    C++标准库Boost程序库导论

    在Boost中,用于字符串及文本处理的库包括`boost::algorithm`和`boost::spirit`等。`boost::algorithm`提供了许多用于字符串操作的算法,如搜索、替换、分割等功能。而`boost::spirit`则是一个基于C++模板的语法解析...

    Boost-C++库_1.42(中文版)

    标题“Boost-C++库_1.42(中文版)”表明本文档是一份关于Boost C++库1.42版本的中文文档。文档中会详细介绍Boost库的各个方面,而由于文件内容的不完整...这部分内容帮助读者了解如何根据不同的需要配置和使用Boost库。

    Boost库学习指南 Boost库学习指南

    - **`boost::regex`**:用于正则表达式的强大库,支持复杂的文本匹配和替换操作。 - **`boost::asio`**:一个跨平台的异步I/O库,非常适合网络编程。 - **`boost::program_options`**:用于解析命令行参数的库,非常...

    正则表达式等价判断

    在C++中,这可能涉及到使用递归下降解析器构建NFA或DFA,或者使用库如`boost::spirit`来解析正则表达式。同时,为了提高效率,可能会使用一些优化技术,如最小化自动机,消除ε-转移,或者使用子集构造法来比较...

    boost详细教程(pdf版)

    通过使用Boost Spirit,我们可以轻松地将这种语言的语法转化为代码,并实现一个解析器,进而能够处理更复杂的编程语言或配置文件等。 #### 五、总结 Boost Spirit 是一个强大且灵活的C++库,它通过提供类似于EBNF...

    使用Boost对Rssxml文件解析

    5. **C++编程实践**:在实际编程中,我们将使用`std::ifstream`来打开和读取XML文件,`std::string`存储文件内容,然后用`std::stringstream`配合`Boost.Spirit`进行解析。正则表达式的操作可以封装在一个函数中,...

    C++ 2008 表达式计算

    总的来说,C++ 2008中的四则表达式计算需要对语言的语法有深入理解,以及熟练使用Boost库,特别是Spirit库。通过编写解析器和构建抽象语法树,可以实现对复杂表达式的高效和准确处理。这种能力对于开发科学计算软件...

    boost库简介

    2.Boost.Spirit 库:是一个多用途的、递归的语法分析器生成框架,允许程序员直接在 C++ 代码里使用(近似于)EBNF 的语法来指定语法规则。它解决了分析器难写和维护的问题,并达到了与手工制作的分析器一样或几乎...

    OpenMVS使用VCPKG编译时需要的boost文件

    8. **Boost.Spirit**:是一个解析表达式模板库,可以用来编写解析器,将输入数据转换为程序内部的数据结构。在OpenMVS中,可能用于解析文件格式或用户输入的指令。 9. **Boost.Metaparse**:是元编程的解析库,用于...

    boost资料boost资料boost资料

    Boost库是C++编程语言中的一个开源库集合,它提供了大量的高效、跨平台的库,旨在提升C++的标准库功能,特别是在模板元编程、泛型编程、算法、容器、智能指针、线程管理等方面。Boost库是C++社区的重要贡献,被广泛...

    基于C++构造小型计算器【100012545】

    在本项目中,我们将探讨如何使用C++编程语言构建一个小型计算器,该计算器具备五种主要功能:向量运算、顺序表上的多项式计算、链表实现的多项式计算、基本表达式求值以及带有变量的表达式求值。下面将详细介绍这五...

    c++ boost 最新文档pdf(1.55)

    Spirit库是一个元编程框架,它允许开发者用C++代码直接定义语法规则,从而创建灵活、高性能的解析器。Spirit库主要分为三个部分:Spirit.Karma用于生成器,Spirit.Qi用于解析器,而Spirit.X3是Spirit的最新版本,...

    boost regex 检测 数学公式

    总结来说,使用Boost.Regex来检测数学公式的正确性涉及构建适当的正则表达式模式,这需要对正则表达式语法有深入理解,并可能结合其他解析技术。虽然正则表达式在很多情况下足够强大,但处理复杂数学公式的完整语义...

    boost帮助文档

    14. **Boost.Spirit**:是一个解析表达式库,可以用来编写解析器,支持上下文无关语法和正则表达式。 通过阅读和理解Boost的帮助文档,开发者可以有效地利用这些库提高代码的效率、可维护性和跨平台兼容性。同时,...

    boost_1_44_0

    5. **正则表达式库**:`boost::regex`提供了强大的正则表达式支持,比C++标准库中的实现更为强大和灵活。 6. **并发与线程**:`thread`库提供了线程管理和同步原语,如互斥量、条件变量和future/promise,帮助...

Global site tag (gtag.js) - Google Analytics