问题标签 [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.Qi 使用中的错误雪崩
我无法弄清楚我的代码有什么问题。Boost 的模板让我发疯了!我无法从这一切中得出正面或反面,所以我只好问了。
这有什么问题?
错误的数量是巨大的;我会建议那些想在他们的 on 上帮助编译这个的人(相信我,在这里粘贴是不切实际的)。我正在使用最新的 TDM-GCC 版本(GCC 4.4.1)和 Boost 版本 1.39.00。
作为奖励,我想问另外两件事:C++0x 的新static_assert
功能是否会在这个意义上帮助 Boost,以及我上面引用的实现是否是一个好主意,或者我是否应该使用 Boost 的字符串算法库. 后者可能会提供更好的性能吗?
谢谢。
- 编辑
以下非常小的示例首先失败,并出现与上面的代码完全相同的错误。
-- 编辑 2
我仍然不知道为什么它在我的旧版本 Boost (1.39) 中不起作用,但是升级到 Boost 1.42 解决了这个问题。以下代码在 Boost 1.42 中完美编译和运行:
感谢您的提示,hkaiser。
c++ - 使用 boost::spirit,我如何要求记录的一部分单独存在?
我有一个记录解析器,它抛出几个异常之一来指示哪个规则失败。
前题:
我们使用position_iterator
from Spirit.Classic,所以下面的流插入操作符很方便。
该模板err_t
排除了用于抛出与不同形式的解析失败相关的异常的样板。
err_t
与它们的包装一起使用的异常:
语法寻找简单的序列。没有eps
,start
规则会失败,而不是a
空输入。
在my_parse
中,我们将流的内容转储到 a 中std::string
并用于position_iterator
跟踪解析的位置。
最后是主程序
上面的代码抛出MissingA
:
我认为船长可能已经消耗了换行符,但尝试lexeme[eol]
却产生了相同的结果。
我一定遗漏了一些明显的东西,因为这似乎是最简单的解析器之一。我究竟做错了什么?
c++ - 使用 Boost Spirit 2 解析字符串以在用户定义的结构中填充数据
我正在使用 Boost.Spirit,它与 VS2005 的 Boost-1.42.0 一起分发。我的问题是这样的。
我有这个用逗号分隔的字符串。它的前 3 个字段是字符串,其余字段是数字。像这样。
我的规则是这样的
我正在尝试将数据存储在这样的结构中。
我已经将它包装在 BOOST_FUSION_ADAPT_STRUCTURE 中,以便与精神一起使用。
我的 parse 函数解析该行并返回 true 和之后
我期待 var.stringVector 和 var.doubleVector 被正确填充。但事实并非如此。
出了什么问题?
代码示例位于此处
在此先感谢,苏里亚
c++ - Boost Spirit 和 Lex 解析器问题
我一直在努力尝试和(逐步)修改文档中的示例代码,但没有太大的不同,我没有得到我期望的行为。具体来说,“if”语句在(我的意图是)它应该通过时失败(有一个“else”但解析器的那部分在调试期间被删除)。赋值语句工作正常。我也有一个“while”语句,它与“if”语句有同样的问题,所以我确信如果我能得到帮助来弄清楚为什么一个不工作应该很容易让另一个开始。它必须有点微妙,因为这几乎是一个例子中的逐字记录。
这是运行它的输出(读入字符串的文件首先在main中转储)
c++ - 使用版本 2 语法的良好/完整 Boot Spirit 示例
到目前为止,我看过的几乎所有示例:http ://boost-spirit.com/repository/applications/show_contents.php都使用旧语法。我已经阅读并重新阅读了http://www.boost.org/doc/libs/1_42_0/libs/spirit/doc/html/index.html上的实际文档以及其中的示例。我知道 Joel 正在博客http://boost-spirit.com/home/上开始编译器系列,但这还没有全面展开。在完全工作的应用程序的上下文中,还有其他资源可以查看使用一些更复杂/涉及的方面的工作示例吗?
c++ - boost库定义自己的原始数据类型的头文件是什么?
最近,我尝试使用 boost::spirit::qi 二进制字节序解析器来解析一些二进制数据,这取决于平台的字节序。有一个简单的例子,如下所示:
使用声明和变量:
little endian 二进制解析器的基本用法:
它工作得很好。boost::uint16_t
但是我的问题来了,为什么我们需要boost::uint32_t
在这里使用一些数据类型?我可以使用unsigned long
或unsigned int
在这里吗?如果我想解析double
或float
数据类型,我应该使用什么提升数据类型?请告诉我 boost 在哪里定义了上述这些类型?
c++ - boost spirit semantic action parameters
in this article about boost spirit semantic actions it is mentioned that
There are actually 2 more arguments being passed: the parser context and a reference to a boolean ‘hit’ parameter. The parser context is meaningful only if the semantic action is attached somewhere to the right hand side of a rule. We will see more information about this shortly. The boolean value can be set to false inside the semantic action invalidates the match in retrospective, making the parser fail.
All fine, but i've been trying to find an example passing a function object as semantic action that uses the other parameters (parser context and hit boolean) but i haven't found any. I would love to see an example using regular functions or function objects, as i barely can grok the phoenix voodoo
c++ - 使用 Boost Spirit 解析语法
我正在尝试解析如下的树表达式之类的 C 函数(使用Spirit Parser Framework):
为此,我尝试在以下语法上使用三个规则:
请注意,我的标记规则只是试图捕获表达式中使用的标识符(“函数”名称)。另请注意,标记规则的签名返回 aExpressionAST
而不是 a std::string
,就像在大多数示例中一样。我想这样做的原因实际上很简单:我讨厌使用变体,如果可能的话我会避免它们。我想保留蛋糕并吃掉它会很棒。
命令应该以标签(当前节点的名称,AST 节点的第一个字符串字段)和括号括起来的可变数量的参数开头,每个参数可以是标签本身或另一个命令。
但是,这个例子根本不起作用。它编译和一切,但在运行时它无法解析我所有的测试字符串。真正让我烦恼的是我不知道如何修复它,因为我无法真正调试上面的代码,至少在这个词的传统含义上是这样。基本上我看到我可以修复上述代码的唯一方法是知道我做错了什么。
所以,问题是我不知道上面的代码有什么问题。您如何定义上述语法?
ExpressionAST
我使用的类型是: