问题标签 [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++ - boost-spirit 数字解析器并获得所需的合成属性
--edit -- 解决了这个问题:对最后一个旁注的评论会很有帮助。对 phoenix::bind 重载处理的评论也会有所帮助(在我的回答中)。
我正在开发一个具有严格类型要求的系统,我想确保我正在解析满足 int32_t 和 int64_t 约束的整数,我不希望解析器合成并将解析的字符串限制为提到的类型。
我该怎么做?该文档提到long_long
仅在支持 64 位的平台上可用,但我也需要在 32 位平台上解析 int64_t。
我的解析器摘录如下:
AddEntry 有一个int32_t
重载和一个int64_t
重载,是phoenix::static_cast_ on _1
order 吗?如果是这种情况,我如何在现代 32 位平台上解析 64 位整数?我假设仅在8008BOOST_HAS_LONG_LONG
等过时的硬件上未定义;)。
<Rant>
我希望他们坚持 c99 中规定的标准,并且<boost/cstdint.hpp>
我们大多数人都希望针对干净的抽象进行编程。以它们的方式定义数字解析器可能有充分的理由。但是,可以在文档中更好地定义宏计划的使用。
</Rant>
附带说明:上面的条件 epsilon 样式是否在性能上与 case 语句相媲美?
c++ - 如何使用 boost.Spirit 解析带有嵌套括号的表达式?
我需要解析包含键/值对和键/子表达式对的 1 行表达式,例如:
为了使解析器更简单,我愿意分几个步骤进行解析,将第一级标签(这里是 123、456、789、111 和 666)分开,然后在另一个步骤中解析它们的内容。这里 789 的值是"a b c"
, 111 的值为(1=a 2=b 3=c) (1=x 2=y 3=z) (123=(x y z))
.
但是语法在这一点上打败了我,所以我可以找到一种方法来获取匹配括号之间的表达式。我得到的 111 是(1=a 2=b 3=c
,它以第一个右括号结束。
我找到了这个方便的示例并尝试使用它,但没有成功:
我怎么能做到这一点?
编辑:我在http://boost-spirit.com/home/articles/qi-example/parsing-a-list-of-key-value-pairs-using-spirit-qi/找到了这个例子
c++ - 与解析器无关的函数的灵气语义动作和参数
我将如何声明一个调用不使用规则/解析器返回的属性的自由函数的语义操作?
就像,假设我们有一个返回字符串的解析器,但我想调用一个不相关的函数,比如 Beep,它接受频率和持续时间的两个整数值并且不关心字符串?
实际上是否可以直接调用它,或者我是否总是必须编写一个使用字符串并调用的代理函数,在这种情况下,Beep in it's body?
编辑:我很抱歉。我应该提到我最初使用了 boost::phoenix::bind 和 Hartmut 建议的语法,这给了我这个错误:
是调用约定把事情搞砸了吗?
Edit2:似乎这就是问题所在,Hartmuts 代码使用一个普通函数编译,该函数采用与 Beep 相同数量和类型的参数。
谷歌搜索向我显示,(大多数)WINAPI 函数使用 __stdcall 约定,这不是默认约定 __cdecl,带有编译器选项 /Gd 的 C/C++ 函数使用,就像在这种情况下:foo
所以到目前为止给出的答案都是正确的,凤凰解决方案对我来说并不是开箱即用的。(这促使我首先发布这个问题。我很抱歉它的不尊严和令人困惑的性质,也许现在这一切都清楚了。)
我现在唯一不清楚的是......我将如何让 phoenix 与 __stdcall 相处,但这可能应该是一个单独的问题。
c++ - 在运行时动态组合 Boost.Spirit.Qi 规则(任意数量的备选方案)
我想知道 Boost.Spirit.Qi 中是否有一种方法可以在运行时动态组合任意数量的规则。Boost.Spirit 的内部运作对我来说仍然有点神秘,但由于规则是作为对象实现的,所以它似乎是可行的。我的动机是让我的语法的某些部分易于扩展。
考虑以下人为设计的示例:
Visual Studio 2010 给出的错误是:
我怀疑这是由于没有将继承的属性传递给grammar.copy()
. 不幸的是,我找不到一个简单的方法来做到这一点,所以我选择了一种解决方法。结果,我有了最后一个版本(我已经想感谢一直坚持到现在的任何人!)。这个实际上似乎有效:
但是,一旦我附加了一个简单的语义动作(例如“[no_op]”),行为就会变得非常奇怪。它不是像以前那样打印 0,1,2,而是打印 0,0,2。所以我想知道,我想要完成的工作是否会导致未定义的行为?这是一个错误吗?或者很可能,我只是以错误的方式使用某些东西(例如语义动作?)?
c++ - 琐碎的 Spirit Parser 语法的分段错误
我的 Spirit Qi 解析器经常遇到段错误。
在花了几天时间调试问题(我发现堆栈跟踪无法理解)后,我决定将其缩减为一个最小的示例。谁能告诉我做错了什么,如果有的话?
将代码保存为 bug.cpp,编译,g++ -Wall -o bug bug.cpp
你应该很高兴。
我已经测试过了
- g++ 4.4、4.5、4.6 和
- boost 版本 1.42 (ubuntu meerkat) 和 1.46.1.1 (natty)
输出是
或者,使用 boost 1.46.1 它会报告Spirit version: 2042
c++ - Boost.Spirit.Qi:如何报告解析器警告?
如何报告解析器警告?类似于报错,但解析器不能停止。仅记录警告消息和子表达式导致警告。
示例输入:
预期输出:
c++ - 提升::精神::气。如何将内联解析器表达式变成独立的语法,以及如何解包它们生成的元组?
我正在使用 QI 和 Phoenix,我想编写一个返回 4 个布尔值的小语法,这些布尔值将用作语义操作中函数调用的参数。
我有几个需要这些东西的功能,到目前为止我已经使用了这种方法:
虽然它本身没问题,但在整个地方使用它只是丑陋和令人困惑,即使“使用”命名空间部分也是如此。
这就是为什么我想把这个表达式提取成一个独立的语法。
所以我尝试了这个(归功于 ildjarn 的测试平台):
除非fourBools[phx::bind(&noDice, spirit::_1)]
用fourBools[phx::bind(&worksFine, spirit::_1)]
.
这意味着,我的问题是解包参数以匹配要调用的函数的签名,因为参数的数量在签名级别不同(四个布尔值的一个元组,而不是四个布尔值)。
是否可以直接使用 phoenix 占位符进行解包,而不是编写将元组转换为需要将它们分开的现有函数的单独参数的包装器?如果是,那将是什么语法?毕竟,当被占位符( qi::_bool >> qi::_bool >> qi::_bool >> qi::_bool)
“解包”时,像这样的内联版本可以正常工作。spirit::_1 - spirit::_4,
这让我觉得这个版本好像也返回一个元组,并且在某种程度上无法使用上述方法解包,这与返回一个的语法不同。
我该如何处理?
c++ - 如何将 Boost Spirit 解析的实体与其在输入流中的位置相关联?
Boost Spirit 库允许在解析时跟踪输入位置。此机制允许在解析期间通知解析器错误的位置。
我想保留所有已解析实体的原始位置以及它们以供将来使用。(例如,AST 语义验证。)推荐的方法是什么?
谢谢!
c++ - 如何使用 qi 解析和验证整数的有序列表
我正在解析一个文本文件,大小可能为几 GB,由以下行组成:
基本上,每行一个 int 和一个 float。整数应该是有序的并且是非负的。我想验证数据是否如所述,并已将范围内的 min 和 max int 返回给我。这就是我想出的:
我想知道的是:
- 有没有更好的方法来解决这个问题?我使用了继承和合成的属性、局部变量和一点凤凰巫术。这很棒; 学习这些工具很好,但我不禁想到可能有一种更简单的方法来实现同样的事情:/(在 PEG 解析器中......)
- 例如,没有局部变量怎么办?
更多信息:我有其他同时被解析的数据格式,所以我想将返回值保留为解析器属性。目前这是一个std::pair,其他数据格式在解析时会暴露它们自己的std::pairs,我想将这些数据填充到std::vector中。