我尝试了不同的方法,并在这里询问了有关我的要求的子问题的几个具体问题.但是我的解决方案并没有像预期的那样真正起作用,所以我退后一步,从更广泛的角度来问这里.请记住,我不是C++专业人士.也不是初学者,但我还在学习语言.
所以,我有以下要求.我需要读入包含条件的文本文件,例如"Greater"或"Equals",所有这些函数都返回布尔值.文本文件还包括这些条件的参数.注意,这些参数可以是不同类型(整数,小数等),并且每个这样的条件可以采用不同数量的参数(例如,"等于"需要2个参数,而"之间"将采用3个参数).因此该文件可能如下所示:
Greater, 2, 3
Greater, 2.4, 1.0
Equals, true, true
Between, 20, 10, 30
Run Code Online (Sandbox Code Playgroud)
读入该文件并解析它的逻辑已经完成.现在我需要将所有这些布尔函数与其参数"连接"并检查它们是否都为真.
所以我想我会用静态方法创建函数或类来表示这些布尔测试函数,然后创建一个函数指针映射到这些函数,由它们的名称映射.在运行时,我会读入文件,调用相应的函数指针并传入paramteres.这对我来说似乎很容易,但实际上我很挣扎的事实是这些布尔函数可以采用不同数量的参数,并且这些参数可以是不同类型的.
你能推荐一种方法来解决C++中的这个问题吗?我不是要求一个完整的解决方案,但是对于一个合适的C++方法,或者我可以遵循的指南.提前致谢!
我正在尝试扩展计算器示例,以便解析器将确定代数语句是否为真,而不是解析和评估代数表达式.我的意思是1 + 5 * 5 - 10 = 19 - 3(期望的解析器结果是true)和3 - 1 = 9(期望的解析器结果false).
我必须承认我是新手,boost::spirit而且现在这一切都是压倒性的.但是,我觉得我理解计算器示例足够好,至少可以取得一些进展.
使用提供的示例作为起点,语法如下所示:
calculator() : calculator::base_type(expression)
{
using qi::uint_;
using qi::_val;
using qi::_1;
expression =
term [_val = _1]
>> *( ('+' >> term [_val = _val + _1])
| ('-' >> term [_val = _val - _1])
);
term =
factor [_val = _1]
>> *( ('*' >> factor [_val = _val * …Run Code Online (Sandbox Code Playgroud) 我想定义一个带有2个参数的函数
double func(double t, double x);
Run Code Online (Sandbox Code Playgroud)
从外部文本文件中读取实际实现的位置.
例如,在文本文件中指定
function = x*t;
Run Code Online (Sandbox Code Playgroud)
功能应该实现的乘法x和t,以便它可以在稍后阶段被调用.我正在尝试使用boost :: spirit来解析函数.但我不知道如何实现它.
下面,我创建了一个实现乘法的简单函数.我将它绑定到boost函数,我可以使用它.我还创建了一个简单的语法,它解析了两个双精度数之间的乘法.
#include <boost/config/warning_disable.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
#include "boost/function.hpp"
#include "boost/bind.hpp"
#include <boost/spirit/include/qi_symbols.hpp>
#include <iostream>
#include <string>
namespace qi = boost::spirit::qi;
namespace ascii=boost::spirit::ascii;
using boost::spirit::ascii::space;
using boost::spirit::qi::symbols;
template< typename Iterator >
struct MyGrammar : public virtual qi::grammar< Iterator, ascii::space_type >
{
MyGrammar() : MyGrammar::base_type(expression)
{
using qi::double_;
//The expression should take x and t as symbolic expressions
expression = (double_ >> '*' …Run Code Online (Sandbox Code Playgroud) boost ×2
boost-spirit ×2
c++ ×2
parsing ×2
boost-bind ×1
c++11 ×1
evaluation ×1
expression ×1
variant ×1