问题标签 [boost-phoenix]

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 回答
1181 浏览

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

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

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

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

语法是这样调用的:

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

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

这是输出:

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

附言

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

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

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

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

0 投票
2 回答
886 浏览

struct - Boost Phoenix:绑定到结构的引用成员?

我想使用 Boost Phoenix 生成一个 lambda 函数,用于对包含引用类型成员的结构进行 std::find_if 操作。一个人为的例子如下:

如果 MyStruct::x 的类型是 int 而不是 int&,它编译得很好。但是对于引用成员,我得到一个“指向引用成员的指针是非法的”错误。

从网上四处寻找,似乎我需要使用 Phoenix 的 'ref' 功能,但我似乎无法弄清楚所需的语法。

有谁知道如何使它适用于类型 'int&' ?

0 投票
1 回答
1908 浏览

c++ - 理解和使用 Boost Phoenix 库,重点是惰性求值

我刚刚发现了 Boost Phoenix 库(隐藏在 Spirit 项目中),作为函数式编程风格的粉丝(但仍然是业余爱好者;对 haskell 和 scheme 有一些小经验),我想玩弄这个库来学习关于这个库的合理应用。

除了使用 fp 样式增加代码的表达性和清晰度之外,我对以低成本加速计算的惰性求值特别感兴趣。

一个小而简单的例子如下:存在某种路由问题(如 tsp),它使用欧几里德距离矩阵。我们假设,距离矩阵的某些值从未使用过,而有些则经常使用(因此每次调用都动态计算它们不是一个好主意)。现在似乎有一个惰性数据结构来保存距离值是合理的。凤凰怎么可能?(忽略我完全不用 fp-style-programming 就可以轻松完成的事实)阅读 phoenix 的官方文档并没有让我理解到足以回答这个问题。

有可能吗?(例如,在 Haskell 中,创建 thunk 的能力可以保证以后可以计算该值是语言的核心)。

使用带有 phoenix 中定义的所有惰性函数的向量是什么意思?像我一样天真,我试图用随机值填充两个矩阵(向量>),一个用普通的 push_back,另一个用 boost::phoenix::push_back 并试图从这些矩阵中读出少量的值并将它们存储在容器中以供打印。懒惰的总是空的。我是否以错误的方式使用凤凰/应该有可能?还是我误解了phoenix中容器/算法的功能。后者的一个小线索是 FP++ 库中存在一个特殊的列表数据结构,它影响了 phoenix。

此外:

  • 你用凤凰干什么?
  • 你知道一些关于凤凰的好资源吗?(教程,博客条目...)

感谢您的输入!

0 投票
1 回答
1810 浏览

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

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

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

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

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 投票
5 回答
7395 浏览

c++ - 使用 Boost.Phoenix 有什么好处?

我无法理解使用 Boost.Phoenix 的真正好处。

当我将它与 Boost.Spirit 语法一起使用时,它真的很有用:

当我将它用于 lambda 函数时,它也很有用且优雅:

但是这个库中其他所有东西的好处是什么?文档说:“无处不在的函子”。我不明白这有什么好处?

0 投票
2 回答
1528 浏览

c++ - 如何从 Spirit::Qi 规则访问 boost::variant 成员?

我找不到在我的 Spirit-Qi 语法中使用 boost::phoenix 访问 boost::variant 成员的正确方法。这是我想要实现的简单示例。(我的整个语法要复杂得多,这是我正在测试提到的问题的简单片段)。

但是我找不到任何 phoenix::get<> 或任何类似的方法来使用 Phoenix 访问 boost::variant。我需要 phoenix::get<> 的原因是因为我需要将变量插入到具有特定类型的列表中,然后将此特定类型作为对子规则的引用作为继承属性传递:

有什么办法可以实现这样的行为?

感谢您的回复

瑞克

0 投票
1 回答
446 浏览

c++ - 提振精神和提振凤凰问题

一。是否可以使用传递给规则的参数定义精神规则的局部变量默认构造?我有具有循环依赖关系的 AST 构建器对象,我想使用对父级的引用来初始化子级,父级通过对子解析器规则的引用传递。例子:rule< Iterator, void(Parent & p), locals<child> > child_parser;

注意:上面有我想做的事情的方法。我只对我上面所说的特定方法感兴趣,因为它是最干净的方法。

。如何将指针传递给懒惰的凤凰占位符?它不能像&_r1或那样简单&arg1

注意:这个问题已经在这里单独提出,你可以在那里回答。

三。lambda / phoenix 合并进展如何,知道合并何时发生吗?

ps,提前感谢您回答我的问题 Hartmut :D

0 投票
1 回答
345 浏览

c++ - Boost Phoenix(或 Boost Lambda) - 懒惰地取指针

有没有办法获取惰性凤凰值/ ref 的指针?如果有怎么办?

0 投票
2 回答
442 浏览

c++ - 如何在 Boost.Phoenix 中使用一系列语句和 std::transform?

我想使用 Boost.Phoenix 创建一个 lambda 函数,该函数由几行代码组成,然后“返回”一个值,以便我可以将它与std::transform.

像这样:

std::for_each这样可以完美地工作,但是由于逗号运算符返回,因此std::transform无法编译void。如何从这样的 lambda 函数返回值?


编辑:我更改了代码片段,因为我首先写的内容​​导致了对我想要做什么的误解。