问题标签 [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.
c++ - 提升灵气数值解析整数和浮点数
我试图理解以下结果。测试用例代码是
这里的动机是我想将数字“12345”匹配为整数,而不是浮点数。'12345.34' 将匹配 double_ 而从不匹配 int_ 但倒数的情况不正确;'12345' 匹配整数 (int_) 和浮点数 (double_)。我尝试了 double_ - int_ 并成功匹配'12345'。但是我希望最后一个测试用例'12345.34'会积极匹配double_ - int_,但我得到的结果是不匹配。
为什么会这样,我如何获得一个只匹配整数和另一个只匹配浮点的解析器(如在 c 中,5.0 将被解释为浮点)
boost - 使用自定义属性解析提升 Spirit 规则
我正在编写一个 Boost Spirit 语法来将文本解析为这些结构的向量:
这个语法有这样的规则:
然而,实际的语法pairSequence
是这样的:
我希望这个语法产生一个等于双精度并Pair
等于某个常数的值。我想做这样的事情:a
b
当然,上面没有编译。我尝试向 中添加构造函数Pair
,但仍然出现编译错误(没有匹配函数调用 'Pair::Pair(const boost::phoenix::actor >&, double)')。
c++ - 如何使用 Boost::Spirit::Qi 跟踪多个输入的输入位置?
我想#include
在 boost Spirit 解析器中支持类似 C++ 的机制。本质上,我有一个脚本命令,要求我的解析器从文件中加载子脚本。我希望能够在解析帖子时报告跟踪输入位置中描述的错误消息,但它们不包括解析多个输入。
这可以通过使用来合理地完成boost::spirit::qi
吗?
我一直在努力使用更智能的迭代器类型来获取不同的输入。不过,我仍然希望看到准确的定位。
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)] 见这个。所以它确实是受名称约束的。
这样的事情可能吗?还是我应该采取完全不同的方法?
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 的令牌解析。
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.Qi 解析不同的结构?
在此示例中,员工结构以“employee{int, string, string, double}”的形式解析。
我想知道是否可以修改此示例以解析不同类型的结构,例如“intern{int, string, string}”。
具体来说,我想将结构传递给在结构类型上重载的函数。如果我可以避免为此使用多态双重分派,而是保留被解析的具体类型以静态匹配正确的重载函数,那就太好了。