增强精神语义动作

Boost spirit semantic action

本文关键字:语义 增强      更新时间:2023-10-16

我试图使用Boost Spirit将简单的语义动作附加到我的语法上。

这是我的代码:

#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;
}

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

我不确定该示例该怎么做。您将精神"古典" v1(十多年过时)结合在一起,业力标题(这就是Spirit v2 与解析无关),然后是utree(这是仅V2 <strong)> and 弃用。

,然后加强lambda并加强凤凰城,以良好的方式?哦。aaaaand 厨房水槽增强绑定。

然后您使用

混合所有名称空间
using namespace std;
using namespace boost::spirit;

我不确定您期望发生什么。

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


沿路10分钟:


Spirit Qi Demo

我假设您真的想解析这些值,并且您将使用语义动作来存储它们(例如,例如,例如。)。

这是利用的Qi版本

  1. 自动属性传播(增强精神:语义动作是邪恶的?)

  2. 船长(增强精神船长问题)

  3. 列表操作员(%

活在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 succesn";
        for (auto& value : parsed)
        {
            std::cout << " -- " << value << "n";
        }
    } else {
        std::cout << "Parse succesn";
    }
    if (iter != end) {
        std::cout << "Remaining unparsed input: '" << std::string(iter, end) << "'n";
    }
    return ok? 0 : 1;
}

打印

Parse succes
 -- ah
 -- bk
 -- ss