问题标签 [boost-spirit]

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 投票
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 投票
1 回答
1171 浏览

boost-spirit - 从升气经典到气的翻译

我昨天开始使用精神。我必须为一种小语言编写一个解析器并形成一个中间数据结构。我遵循了Boost Repository的 Pascal Parser 示例。这个例子很好,因为它支持简单的调试。该示例使用 Classic Spirit。

  • 我应该翻译成使用气吗(我到目前为止还没有遇到过关于精神的任何问题)?
  • 这种转换有一个简单的例子吗?我现在主要使用 classic::grammar 类,如示例所示。
0 投票
2 回答
764 浏览

c++ - boost spirit v2 编译错误 - 尝试将符号用于稍微难一点的东西,但在某处遗漏了重要的一点

我已经尝试了各种方法来解决这个问题与地图和演员,将解析分成不同的子部分,直接使用 std::vector 并尝试 _r1 等,但我似乎未能掌握有关使用属性的基本知识。

我想解析一行,例如:

并将宏名及其参数列表添加到 qi::symbols 解析器中。

匹配上

并将其放入 defmacro 结构中可以正常工作,但是当我尝试使用结果或将其整体存储为符号解析器的数据元素时,我会收到以下形式的错误

无法从 'const boost::phoenix::actor' 转换为 'const client::defmacro'

  • 但无论我尝试什么,我总是无法“从 'const boost::phoenix::actor' 转换为”我尝试使用的任何数据类型(例如,直接转换为 std::vector 或结构中的其他变体。还尝试了语法的变体但至今仍是一片空白。

下面是代码片段,然后是我的问题的这种变体的编译器输出。

非常欢迎对我未能掌握一些重要概念的任何解释。

使用 VC++ 2008 和 Spirit 1.42。

谢谢瑞克

0 投票
1 回答
1266 浏览

c++ - 复制或引用 boost::spirit 规则<>的语义?

我正在尝试在 Boost.Spirit 中编写一个 shell 语言解析器。但是,我不清楚有关rules 语义的一些基本问题。

查看文档,有成员r.alias()r.copy(). ruleIIUC,这些成员应分别返回对规则的引用和规则内容的副本。但是,当我只是在另一个规则的定义中使用该规则时,并没有明确说明会发生什么。从我的实验中,我发现相互递归的规则可以定义为:

这表明规则是在解析器表达式中通过引用来获取的。问题是,当变量超出范围时它会做什么,例如:

同样,从包含规则类型右值的解析表达式中分配规则是否有效(r.copy()也将是类型的右值rule,不是吗)?例如。

任何人都可以告诉我rule's 副本和引用的详细语义,并可能纠正这篇文章中的任何误解吗?

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

c++ - boost::spirit 中的运算符优先级?

我使用 Spirit mini_c 样本进行了一些测试。不幸的是,它没有按预期保持运算符优先级:

评估为 0。

返回 1

我试图移动“||”的定义 和“&&”在构造函数的最顶端

但这并没有改变任何事情。这怎么可能解决。我正在使用提升 1.3.38。

0 投票
1 回答
306 浏览

c++ - 在 boost::spirit mini_c 中实现“NOT”

我尝试修改 boost::spirit 的 mini_c 示例以匹配我现有的词汇表。

因此,我添加了一个运算符“NOT”,它的行为应该等同于“!”:

我可以编译修改后的源代码,但是当我尝试执行它时,它无法解析。我该如何解决这个问题?

编辑: 由于我想访问外部变量,我做了另一个修改,以便在编译时构建这些变量的列表:

其中 add_var 和 identifier 定义为

如果我不使用此修改,则可以使用“NOT”。通过修改,使用“NOT”会产生解析错误。

编辑2: 以下条件表达式确实有效: