增强精神语义动作
Boost spirit semantic action
我试图使用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版本
自动属性传播(增强精神:语义动作是邪恶的?)
船长(增强精神船长问题)
列表操作员(
%
)
活在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
相关文章:
- 何时在引用或唯一指针上使用移动语义
- 无法将结构注册为增强几何体3D点
- 如何从具有移动语义的类对象中生成共享指针
- Boost Spirit,获取迭代器内部语义动作
- 可以使用移动语义更改或改进此C++代码吗?
- c++在使用指针时移动语义
- 在C++17中,引用const字符串的语义应该是什么
- 增强基于 XML class_id的反序列化
- 增强精神解析器规则以检测语句中的特殊结尾
- Xcode 语义问题引用或以前定义的代码
- C++ 使用增强正则表达式库时断言崩溃
- 增强精神 X3:错误:在"..."中没有名为"大小"的类型
- 如何包装(撰写)增强 hana 地图并访问括号运算符(运算符 [])?
- 使用移动和复制语义时函数匹配如何工作?
- 有没有办法在C ++中检测汉字?(使用增强)
- 如何将增强MSM与增强信号结合使用?
- 将向量从 N1 缩小到 N2 项,而不触发默认构造函数并仅使用 move 语义
- 使用">"运算符增强语义操作
- 增强精神语义动作
- 使用C++继承来增强具有所有权语义的类