问题标签 [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.
c++ - 这个简单的 boost::spirit::qi 解析器有什么问题?
我有这个简单的解析器,用于解析 VB 风格的双引号字符串。因此,解析器应该变成类似
成一个输出
这是我为此提出的语法:
但是,我得到的属性是一个单引号 ("),而不是完整的解析消息。
parsing - 使用 Boost Spirit 解析,获得额外的项目
这很长,有很多代码,所以我希望 Stack Overflow 可以应付它。:P
我正在尝试使用 Boost Spirit 编写 SVG 解析器。我有一个用“轮廓”填充向量的语法,这些向量是“BezierPoints”的向量,它可以表示常规点或带有贝塞尔控件的点。
到目前为止,我有这个(还没有处理相关的绘制命令):
语法是这样调用的:
这是我当前的测试字符串:
重新格式化字符串以使其更易于阅读:
这是输出:
语法看到了要点,但它不断添加所有这些额外的点,我不知道它们来自哪里。
附言
我也想知道我的一些规则。首先有这个规则:
我希望将结果(drawto_command % *space)
作为单个向量而不是向量向量。据我所知,我必须使用 Phoenix 手动执行此操作。是这样吗?
我的 moveto 规则也有类似的情况:
我有两条规则给出了 BezierVec,我想将它们组合成一个 BezierVec 作为第三条规则。到目前为止,这样做的唯一方法似乎是使用 Phoenix 手动插入。没有更简单的方法吗?
boost - 分配或修改规则中的继承属性并将结果传播到父规则
假设我有一个像这样的 Boost Spirit 语法,其中父规则将继承的属性传递给它的子规则。
每个子规则返回的Foo取决于给定的Bar继承属性。对于父规则,我可能也有这个:
我想知道的是子规则是否可以修改继承的属性,将修改传播到其父规则,并将新值传递给下一个子规则。
在上面的示例中,开始规则将为在父规则及其子规则中使用的Bar建立初始值。Bar每次通过子规则时都会被修改。这甚至可能吗?这样的代码会是什么样子?
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)] 见这个。所以它确实是受名称约束的。
这样的事情可能吗?还是我应该采取完全不同的方法?
boost-spirit - 从升气经典到气的翻译
我昨天开始使用精神。我必须为一种小语言编写一个解析器并形成一个中间数据结构。我遵循了Boost Repository的 Pascal Parser 示例。这个例子很好,因为它支持简单的调试。该示例使用 Classic Spirit。
- 我应该翻译成使用气吗(我到目前为止还没有遇到过关于精神的任何问题)?
- 这种转换有一个简单的例子吗?我现在主要使用 classic::grammar 类,如示例所示。
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。
谢谢瑞克
c++ - 复制或引用 boost::spirit 规则<>的语义?
我正在尝试在 Boost.Spirit 中编写一个 shell 语言解析器。但是,我不清楚有关rule
s 语义的一些基本问题。
查看文档,有成员r.alias()
和r.copy()
. rule
IIUC,这些成员应分别返回对规则的引用和规则内容的副本。但是,当我只是在另一个规则的定义中使用该规则时,并没有明确说明会发生什么。从我的实验中,我发现相互递归的规则可以定义为:
这表明规则是在解析器表达式中通过引用来获取的。问题是,当变量超出范围时它会做什么,例如:
同样,从包含规则类型右值的解析表达式中分配规则是否有效(r.copy()
也将是类型的右值rule
,不是吗)?例如。
任何人都可以告诉我rule
's 副本和引用的详细语义,并可能纠正这篇文章中的任何误解吗?
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 并没有帮助。
c++ - boost::spirit 中的运算符优先级?
我使用 Spirit mini_c 样本进行了一些测试。不幸的是,它没有按预期保持运算符优先级:
评估为 0。
返回 1
我试图移动“||”的定义 和“&&”在构造函数的最顶端
但这并没有改变任何事情。这怎么可能解决。我正在使用提升 1.3.38。
c++ - 在 boost::spirit mini_c 中实现“NOT”
我尝试修改 boost::spirit 的 mini_c 示例以匹配我现有的词汇表。
因此,我添加了一个运算符“NOT”,它的行为应该等同于“!”:
我可以编译修改后的源代码,但是当我尝试执行它时,它无法解析。我该如何解决这个问题?
编辑: 由于我想访问外部变量,我做了另一个修改,以便在编译时构建这些变量的列表:
其中 add_var 和 identifier 定义为
如果我不使用此修改,则可以使用“NOT”。通过修改,使用“NOT”会产生解析错误。
编辑2: 以下条件表达式确实有效: