问题标签 [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 投票
2 回答
3161 浏览

c++ - 提升灵气数值解析整数和浮点数

我试图理解以下结果。测试用例代码是

这里的动机是我想将数字“12345”匹配为整数,而不是浮点数。'12345.34' 将匹配 double_ 而从不匹配 int_ 但倒数的情况不正确;'12345' 匹配整数 (int_) 和浮点数 (double_)。我尝试了 double_ - int_ 并成功匹配'12345'。但是我希望最后一个测试用例'12345.34'会积极匹配double_ - int_,但我得到的结果是不匹配。

为什么会这样,我如何获得一个只匹配整数和另一个只匹配浮点的解析器(如在 c 中,5.0 将被解释为浮点)

0 投票
1 回答
1752 浏览

boost - 使用自定义属性解析提升 Spirit 规则

我正在编写一个 Boost Spirit 语法来将文本解析为这些结构的向量:

这个语法有这样的规则:

然而,实际的语法pairSequence是这样的:

我希望这个语法产生一个等于双精度并Pair等于某个常数的值。我想做这样的事情:ab

当然,上面没有编译。我尝试向 中添加构造函数Pair,但仍然出现编译错误(没有匹配函数调用 'Pair::Pair(const boost::phoenix::actor >&, double)')。

0 投票
1 回答
269 浏览

c++ - 如何使用 Boost::Spirit::Qi 跟踪多个输入的输入位置?

我想#include在 boost Spirit 解析器中支持类似 C++ 的机制。本质上,我有一个脚本命令,要求我的解析器从文件中加载子脚本。我希望能够在解析帖子时报告跟踪输入位置中描述的错误消息,但它们不包括解析多个输入。

这可以通过使用来合理地完成boost::spirit::qi吗?

我一直在努力使用更智能的迭代器类型来获取不同的输入。不过,我仍然希望看到准确的定位。

0 投票
3 回答
963 浏览

c++ - 这个简单的 boost::spirit::qi 解析器有什么问题?

我有这个简单的解析器,用于解析 VB 风格的双引号字符串。因此,解析器应该变成类似

成一个输出

这是我为此提出的语法:

但是,我得到的属性是一个单引号 ("),而不是完整的解析消息。

0 投票
1 回答
1181 浏览

parsing - 使用 Boost Spirit 解析,获得额外的项目

这很长,有很多代码,所以我希望 Stack Overflow 可以应付它。:P

我正在尝试使用 Boost Spirit 编写 SVG 解析器。我有一个用“轮廓”填充向量的语法,这些向量是“BezierPoints”的向量,它可以表示常规点或带有贝塞尔控件的点。

到目前为止,我有这个(还没有处理相关的绘制命令):

语法是这样调用的:

这是我当前的测试字符串:

重新格式化字符串以使其更易于阅读:

这是输出:

语法看到了要点,但它不断添加所有这些额外的点,我不知道它们来自哪里。

附言

我也想知道我的一些规则。首先有这个规则:

我希望将结果(drawto_command % *space)作为单个向量而不是向量向量。据我所知,我必须使用 Phoenix 手动执行此操作。是这样吗?

我的 moveto 规则也有类似的情况:

我有两条规则给出了 BezierVec,我想将它们组合成一个 BezierVec 作为第三条规则。到目前为止,这样做的唯一方法似乎是使用 Phoenix 手动插入。没有更简单的方法吗?

0 投票
1 回答
1019 浏览

boost - 分配或修改规则中的继承属性并将结果传播到父规则

假设我有一个像这样的 Boost Spirit 语法,其中父规则将继承的属性传递给它的子规则。

每个子规则返回的Foo取决于给定的Bar继承属性。对于父规则,我可能也有这个:

我想知道的是子规则是否可以修改继承的属性,将修改传播到其父规则,并将新值传递给下一个子规则。

在上面的示例中,开始规则将为在规则及其子规则中使用的Bar建立初始值。Bar每次通过子规则时都会被修改。这甚至可能吗?这样的代码会是什么样子?

0 投票
1 回答
2695 浏览

c++ - boost::phoenix::at_c 与 boost::spirit::qi::grammar 结合是否有替代方案

我创建了一个测试应用程序来说明我的问题。它解析以“a=”或“b=”开头的整数列表,并以“\r\n”分隔。该列表包含以任意顺序多次出现的这些字段。

在实践中,需要解析更多不同类型的字段。我对这种方法的反对在于以下表达式: [push_back(at_c<0>(_val), _1)] 这是赋值和 MyStruct 的第一个元素之间的“隐藏依赖”。这使得代码对更改很脆弱。如果结构被更改,它可能仍然可以编译,但不再执行预期的操作。

我希望有这样的结构: [push_back(at_c<0>bind(&MyStruct::aList, arg1)(_val), _1)] 见这个。所以它确实是受名称约束的。

这样的事情可能吗?还是我应该采取完全不同的方法?

0 投票
3 回答
1433 浏览

c++ - 是否可以在 Boost.Spirit 中创建自定义解析器?

我试图在 Boost.Spirit (2.3) 中创建一个自定义 Parser 类,但没有成功。代码是:

虽然我已经(至少我认为我已经)满足了所有要求,但是当我尝试在解析表达式中使用这个类时会出错:

我试图查看其他解析集的实现(例如。not_predicate),但无法弄清楚使它起作用的区别是什么。

动机

我这样做的原因与这个问题有关。我想解析具有特殊词汇规则的 POSIX shell 语言。特别是,即使在词位中也必须应用“skipper parser”,但它必须不同于“phrase level”skipper parser。这是lexeme指令不能做的,并且skip不会预先跳过(AFAIK),这也是我需要的。所以我想创建一个函数

这将返回与令牌匹配的规则。一种方法是创建我自己的rule包装器作为终端(因为rule单独不能用于其引用语义),另一种方法是创建一个新的解析器(这将是一个非终端 in proto),并在其中实现 shell 的令牌解析。

0 投票
2 回答
730 浏览

boost - Boost Spirit自动规则问题

我正在使用属性传播来构建玩具语言的语法树。我在 if 语句的定义中遇到了问题,很难从错误消息中分辨出来,但我认为 rhs 属性没有折叠到预期的属性中。tuple <double,Statement,optional<Statement>>我认为它应该崩溃。

错误:C:\Program Files (x86)\CodeBlocks\MinGW\boost_1_43_0\boost\variant\variant.hpp|1293|error: no matching function for call to 'boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::initializer_root, mpl_::int_<0> >, boost::mpl::l_iter<boost::mpl::list3<boost::recursive_wrapper<Lang::CompoundStatement>, boost::recursive_wrapper<Lang::IfStatement>, Lang::VarStatement> > >::initializer_node, mpl_::int_<1> >, boost::mpl::l_iter<boost::mpl::list2<boost::recursive_wrapper<Lang::IfStatemen [error cuts out here]

谢谢。

PS 我无法正确显示代码,这里有一个纯文本版本:http: //freetexthost.com/a3smzx0zk5

PPS 一些我忘记提及的信息。如果我删除"else" >>并更改> statement为,它会起作用>> statement,但"else" >> statement应该折叠为仅声明。明确地将“else”创建为 qi::lit 并没有帮助。

0 投票
1 回答
515 浏览

c++ - 如何使用 Boost.Spirit.Qi 解析不同的结构?

此示例中,员工结构以“employee{int, string, string, double}”的形式解析。

我想知道是否可以修改此示例以解析不同类型的结构,例如“intern{int, string, string}”。

具体来说,我想将结构传递给在结构类型上重载的函数。如果我可以避免为此使用多态双重分派,而是保留被解析的具体类型以静态匹配正确的重载函数,那就太好了。