问题标签 [boost-spirit-qi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
548 浏览

c++ - 改进替代解析器的使用

我从精神手册中扩展了 Mini XML 示例。
该语法描述了一个 xml 标记,它可以用 '/>' 关闭并且没有子节点,或者像示例中那样用关闭标记 '' 关闭并且可以选择有子节点。

是否可以在没有 attr(Children()) 标记的情况下编写此规则?我认为这或多或少是性能滞后。我需要它来避免替代解析器的可选属性。如果没有子标签,则属性应该只是一个空向量。

0 投票
2 回答
1390 浏览

c++ - Boost Spirit QI 递归

我一定错过了 boost::recursive_wrapper 的东西,我总是得到一个错误:

错误:没有匹配函数调用'boost::tuples::tuple, std::allocator >, client::compare_attr_op_t, std::basic_string, std::allocator >, boost::tuples::null_type, boost::元组::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type>::tuple(client ::表达式值&)'

对于在语法中定义“表达式”的行:expression %= attribute_test | boolean_expression;

任何想法?

0 投票
1 回答
1810 浏览

c++ - 如何使用 boost.spirit 提取 std::string?

使用 boost.spirit 我尝试解析表单的简单命令行command:param1 param2...

为此,我创建了这个解析器:

这两个复合解析器的属性类型是向量,所以如果 cmd 和 params 是向量类型,那么这个工作。但是,如果它们是 std::string 类型,则不是。在网上搜索此解决方案时,我发现它也应与字符串一起使用。无论如何我可以用字符串来完成这项工作吗?

0 投票
1 回答
756 浏览

c++ - 将“替代”与“可选”混合时出现 Boost.Spirit 错误?

我只使用了 Boost.Spirit(来自 Boost 1.44)三天,试图通过 RFC2822 中的确切语法来解析原始电子邮件消息。我以为我开始理解它并到达某个地方,但后来我遇到了一个问题:

如果测试#3 有效,那么为什么测试#5——与两个替代方案完全相同的测试——会失败?

出于同样的原因,如果你会原谅这个表达式:如果测试#4有效,并且开头的空格被标记为可选,那么为什么测试#5(完全相同的测试具有完全相同的输入,除了有输入中没有前导空格)失败?

最后,如果这是 Boost.Spirit 中的一个错误(我怀疑它一定是),我该如何解决它?

0 投票
1 回答
3014 浏览

c++ - 用增强精神解析转义的字符串

我正在使用 Spirit 2.4,我想解析这样的结构:

文本{text_field};

关键是在 text_field 中是一个带有符号“{”、“}”和“\”的转义字符串。我想为此使用 qi 创建一个解析器。我一直在尝试这个:

但甚至不编译。任何的想法?

0 投票
2 回答
548 浏览

boost - 在 std::list 中存储 boost::spirit::qi::rule

我已经阅读了关于boost::spirt::qi::rule 的复制或引用语义的其他线程。我正在使用 Boost 1.42。

这失败了......

有没有办法将规则存储在 STL 列表或双端队列中?(引用在删除之前不会消失)。

0 投票
1 回答
4012 浏览

c++ - Boost.Spirit.Qi:获取规则的属性并将其设置为封闭规则的结构属性的字段?

就像许多其他问题一样,我正在尝试使用 Boost.Spirit.Qi 将简单的语法解析为结构树。

我将尝试将我正在尝试做的事情提炼成最简单的情况。我有:

后来,在语法结构中,我有以下成员变量:

我用它来定义

但是,当我尝试实际解析整数时,使用

myInteger.value成功解析后始终未初始化。同样,我尝试了以下定义(显然那些不编译的定义是错误的):

很明显,我对 Spirit、Phoenix 或其他东西有误解。我的理解是,当方括号中的部分作为函数对象执行时,这qi::_1是 , 的第一个属性,应该表示解析的整数。qi::int_然后我假设函数对象将采用封闭integer属性qi::_val并尝试将解析的整数分配给它。我的猜测是,由于我的BOOST_FUSION_ADAPT_STRUCT调用,两者将是兼容的,从静态分析的角度来看,这肯定是这种情况,但数据并没有被保留。

我在某处或某处缺少参考(&)名称吗?

0 投票
1 回答
303 浏览

boost - boost qi 中的 Plus 运算符无法按预期工作

这是一个示例代码

我收到以下错误。

/usr/local/include/boost/spirit/home/qi/nonterminal/rule.hpp:201: 实例化自‘boost::spirit::qi::rule& boost::spirit::qi::rule:: operator=(const Expr&) [with Expr = boost::proto::exprns_::expr&, const boost::proto::exprns_::expr&>, 1l>&, const boost::spirit::terminal&>, 2l> &, const boost::proto::exprns_::expr&>, 1l>&>, 2l>&, const boost::spirit::terminal&>, 2l>&>, 1l>&>, 2l>, Iterator = __gnu_cxx ::__normal_iterator, std::allocator >>, T1 = unsigned int ()(), T2 = boost::fusion::unused_type, T3 = boost::fusion::unused_type, T4 = boost::fusion::unused_type] ’ mini.c++:34:从“input::input() [with Iterator = __gnu_cxx::__normal_iterator, std::allocator >]” mini 实例化。c++:49: 从这里实例化 /usr/local/include/boost/spirit/home/qi/operator/plus.hpp:62: error: no type named 'type' in 'struct boost::spirit ::traits::container_value——</p>

奇怪的是,如果我使用减号(-)操作,即

...它编译得很好!

在 gcc 4.3.4 上编译。

0 投票
1 回答
477 浏览

c++ - boost::spirit::qi 和乱序变量

我正在写一个词法分析器。它接受一个英文字符串,并将其转换为一组纬度/经度坐标。这有点像谷歌地球。

无论如何,我已经编写了我的符号表和语法,它正在愉快地解析格式化数据。

例如:{"North", 23.59, "East", -30.82}

这是我的语法:

其中纬度和经度是从速记罗盘方向映射到字符串的符号表(例如“e”到“East”)

所以,关于我的问题:

我想在我的语法中添加以下规则,其中纬度和经度符号位于相反的位置:

这会解析,但 degLat_ 和 degLong_ 值不会与字符串值一起反转。它们只是直接解析到结构中,而不考虑字符串标签。

当要解析的数据不连续时,如何构建结构(或 boost::fusion 向量)?

0 投票
1 回答
1164 浏览

boost - 尝试编译 Spirit.Qi 解析器的问题

下面是一个完全独立的示例。问题似乎是第 84-89 行 - 如果这些行被注释掉,则示例编译。我要解析的是文件的每一行,有五个用冒号分隔的项目,最后三个项目是可选的。单个函数接受 a boost::filesystem::file,将其吸入 usingboost.interprocess并解析它。

我想要解析的示例:

a:1
a:2:c
a:3::d
a:4:::e
a:4:c:d:e

结果应该存储在 , 中vector<file_line>,并且file_line是一个有五个成员的结构,最后三个是可选的。这是代码和错误:

代码

来自 MSVC 10 的错误消息

由于问题限制为 30,000 个字符,因此我将仅在此处显示前几个。该示例应该尝试在您的机器上编译和生成相同的东西。

……剪……