gpt4 book ai didi

c++ - boost spirit 语义行动

转载 作者:行者123 更新时间:2023-12-01 14:44:46 26 4
gpt4 key购买 nike

我正在尝试使用Boost精神将简单的语义 Action 附加到我的语法中。

这是我的代码:

#define  BOOST_SPIRIT_NO_REGEX_LIB

#include "regex.h"
#include "spirit.hpp"
#include "spirit/actor/assign_actor.hpp"
#include <boost/spirit/include/karma.hpp>
#include <boost/spirit/include/support_utree.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/fusion/include/std_pair.hpp>
#include <boost/config/warning_disable.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/bind.hpp>
#include <iostream>
#include <string>


using namespace std;
using namespace boost::spirit;
using boost::phoenix::bind;



// A plain function
void dummy( )
{
int i=20;
std::cout << i << std::endl;
}





struct my_enum : public grammar<my_enum>
{

template <typename ScannerT>
struct definition
{
definition(my_enum const& self)
{

enum_specifier = enum_p >> '{' >> enum_list >> '}' [boost::phoenix::bind(dummy)];
enum_p = str_p("enum");
enum_list = +id_p >> *(',' >> +id_p);
id_p = range_p('a','z');
}

rule<ScannerT> enum_specifier, enum_p, enum_list, id_p;
rule<ScannerT> const& start() const { return enum_specifier; }
};
};

string input = "enum { ah, bk, ss }";

int main ()
{
my_enum e;
int status = parse(input.c_str(), e, space_p).hit;
cout << status << endl;
return 0;
}

我收到一个无法理解的无限错误。
有人可以给我一些有关如何映射语义函数的建议/示例吗?

最佳答案

我不确定该例的内容。您需要组合一些Spirit“Classical” v1(已过时十年),Karma header (即Spirit V2,并且与解析无关),然后组合一些Utree(即不推荐使用V2的)。

然后,Boost Lambda和Boost Phoenix也可以使用吗?哦。 Aaaa和厨房水槽Boost Bind。

然后您使用混合所有 namespace

using namespace std;
using namespace boost::spirit;

我不确定您会发生什么。

让我阅读您的样本,看看是否可以提出固定版本。

沿途行驶10分钟:

精神气演示

我假设您确实要解析这些值,并且您将使用语义 Action 来存储它们(例如,在 vector 中)。

这是利用了Qi版本
  • 自动属性传播(Boost Spirit: "Semantic actions are evil"?)
  • 队长(Boost spirit skipper issues)
  • List operator ( % )

  • Live On Coliru
    #include <boost/spirit/include/qi.hpp>

    namespace qi = boost::spirit::qi;

    template<typename Iterator, typename Skipper = qi::space_type>
    struct my_enum : public qi::grammar<Iterator, std::vector<std::string>(), Skipper> {

    my_enum() : my_enum::base_type(enum_specifier)
    {
    id_p = +qi::alpha;
    enum_specifier = qi::lit("enum") >> '{' >> (id_p % ',') >> '}';
    }

    private:
    qi::rule<Iterator, std::vector<std::string>(), Skipper> enum_specifier;
    // lexeme (no skipper):
    qi::rule<Iterator, std::string()> id_p;
    };

    int main() {
    typedef std::string::const_iterator Iterator;

    std::string const input = "enum { ah, bk, ss }";
    my_enum<Iterator> parser;

    std::vector<std::string> parsed;

    Iterator iter = input.begin(), end = input.end();
    bool ok = qi::phrase_parse(iter, end, parser, qi::space, parsed);
    if (ok) {
    std::cout << "Parse succes\n";
    for (auto& value : parsed)
    {
    std::cout << " -- " << value << "\n";
    }
    } else {
    std::cout << "Parse succes\n";
    }

    if (iter != end) {
    std::cout << "Remaining unparsed input: '" << std::string(iter, end) << "'\n";
    }

    return ok? 0 : 1;
    }

    版画
    Parse succes
    -- ah
    -- bk
    -- ss

    关于c++ - boost spirit 语义行动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38116889/

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