使用BoostSpirit.Qi解析为矢量
use Boost.Spirit.Qi to parse into vector
我对Spirit很陌生。我正在尝试使用Qi来解析嵌入式Tcl解释器中CMD命令的参数。由于某些参数可能会被多次使用,我需要一个向量来存储相同类型的所有参数
这是我的问题的一个简化示例,我试图将整数存储到向量中。
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/spirit/include/phoenix_fusion.hpp>
#include <boost/spirit/include/phoenix_stl.hpp>
#include <boost/spirit/include/support.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
#include <boost/variant/recursive_variant.hpp>
using std::string;
using std::vector;
namespace {
namespace qi = boost::spirit::qi;
namespace phoenix = boost::phoenix;
namespace ascii = boost::spirit::ascii;
struct Argument {
vector<int> svDefine; // macro definitions
};
}
BOOST_FUSION_ADAPT_STRUCT
(
Argument,
(vector<int>, svDefine)
)
namespace {
typedef string::const_iterator SIter;
struct ArgParser : qi::grammar<SIter, Argument(), ascii::space_type> {
qi::rule<SIter, Argument(), ascii::space_type> start;
ArgParser() : ArgParser::base_type(start) {
using phoenix::at_c;
using qi::int_;
using phoenix::push_back;
using namespace qi::labels;
start = +("define" >> int_ [push_back(at_c<0>(_val), _1)]);
}
};
}
用g++4.5.1 boost 1.51编译它会产生错误丢失
In file included from /usr/include/boost/spirit/home/phoenix/container.hpp:10:0,
from /usr/include/boost/spirit/home/phoenix.hpp:12,
from /usr/include/boost/spirit/include/phoenix.hpp:13,
from qi_test.cpp:2:
.....
qi_test.cpp:43:64: instantiated from here
/usr/include/boost/spirit/home/phoenix/stl/container/container.hpp:492:40: error: ‘struct boost::fusion::vector<int>’ has no member named ‘push_back’
/usr/include/boost/spirit/home/phoenix/stl/container/container.hpp:492:40: error: return-statement with a value, in function returning 'void'
qi_test.cpp: In static member function ‘static
.....
qi_test.cpp:43:64: instantiated from here
qi_test.cpp:28:509: error: invalid initialization of reference of type boost::fusion::vector<int>&’ from expression of type ‘std::vector<int>’
基本上我很困惑。不知道出了什么问题。
您在这里混合了两种类型的矢量模板类:
std::vector
和
boost::fusion::vector
如果你只是省略(注释掉)
using std::vector;
事情可能会变得非常清楚
相关文章:
- 在 boost::qi 中使用过多的替代运算符会导致分段错误
- 提升精神 V2 Qi 语法线程安全吗?
- 如何在 qi 符号表中使用 std::function
- 解析为带有 qi 和替代部分的结构
- 如何在 boost::spirit::qi 中将某些语义操作排除在 AST 之外
- 提升精神 QI:在元组上自动规则演绎,在替代函数中带有序列
- 正在分析BoostSpirit中固定列表中的选择
- BoostSpirit.Qi-针对原始数据类型进行边界检查
- Boost.Spirit.Qi 语法,用于 Boost.Fusion 自适应结构中的默认值
- 指示 Qi 变换属性失败的适当方法是什么?
- 提升::精神::qi::语法和可变参数模板
- 将 qi::lexeme 添加到灵气中的规则时编译失败
- Qi::p arse Boost Change开始迭代器
- 我可以在 Boost.Spirit.Qi 中向列表运算符 (%) 提供内存分配提示吗?
- 如何在 Boost.Sprit.Qi 中从向量制作组合的 ascii::string 规则<string>?
- 如何在 x3 中使用 qi::_1/qi::_N 重写 qi 解析器
- 如何使用BoostSpirit.Qi增量解析(并对其执行操作)大文件
- 使用BoostSpirit.Qi解析为矢量
- 使用BoostSpirit.Qi与自定义lexer
- BoostSpirit.Qi:如何报告解析器警告