gpt4 book ai didi

c++ - 振奋 spirit : parameter type when using semantic actions and phoenix

转载 作者:搜寻专家 更新时间:2023-10-31 01:55:31 26 4
gpt4 key购买 nike

我使用 boost spirit 来解析数学表达式并遇到了一个问题,我将其提取到以下代码中。

有一个带有一个标记的简单词法分析器,具有一个保存匹配字符串的属性。解析器定义了一个规则,该规则旨在获取 token 的属性并使用它调用函数。函数调用的结果应该是规则的属性值。

编译失败(calc_something:无法将参数 1 从 const boost::spirit::_1_type 转换为 const std::string &)——显然是因为 qi::_1 的类型没有被正确推断。但是,将操作更改为简单的“cout << qi::_1”是可行的。

我是提振 spirit 的新手,但我已经设法让我的语法正确运行。现在我需要获取已解析的值,我被困在这里,希望能得到任何帮助。

// spiritTest.cpp : Defines the entry point for the console application.
//

#include <stdio.h>
#include <tchar.h>

#include <string>
#include <iostream>

#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/lex_lexertl.hpp>

namespace qi = boost::spirit::qi;
namespace lex = boost::spirit::lex;
namespace phoenix = boost::phoenix;

template <typename Lexer>
class TestLexer : public lex::lexer<Lexer>
{
public:
TestLexer()
{
number = "(\\d*\\.)?\\d+([eE][-+]?\\d+)?";
self = number;
}

lex::token_def<std::string> number;
};

int calc_something(const std::string & s)
{
return 5;
}

template <typename Iterator>
class Parser : public qi::grammar<Iterator, int>
{
public:
template <typename TokenDef>
Parser(const TokenDef& tok) : Parser::base_type(value)
{
// the following line causes error C2664: 'calc_something' : cannot convert parameter 1 from 'const boost::spirit::_1_type' to 'const std::string &'
value = tok.number [qi::_val = calc_something(qi::_1)];

// the following line works as expected
//value = tok.number [std::cout << qi::_1 << std::endl];
}

qi::rule<Iterator, int> value;
};

int _tmain(int argc, _TCHAR* argv[])
{
typedef const char* base_iterator_type;
typedef lex::lexertl::token<base_iterator_type> token_type;
typedef lex::lexertl::lexer<token_type> lexer_type;
typedef TestLexer<lexer_type> TestLexer;
typedef TestLexer::iterator_type iterator_type;
typedef Parser<iterator_type> Parser;

TestLexer lexer;
Parser parser(lexer);

const char * formula = "530";
bool result = lex::tokenize_and_parse(formula, formula + strlen(formula), lexer, parser);

return 0;
}

最佳答案

我没有使用 spirit lex 的经验,但我认为它与 qi 类似,因此您需要使用 phoenix 函数 这样做:

#include <boost/spirit/include/phoenix_function.hpp>

struct calc_something_impl
{
template <typename T1>
struct result { typedef int type; };

int operator()(const std::string & s) const
{
return 5;
}
};

boost::phoenix::function<calc_something_impl> calc_something;

关于c++ - 振奋 spirit : parameter type when using semantic actions and phoenix,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8367093/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com