问题标签 [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.

0 投票
1 回答
1456 浏览

c++ - 提振精神期望失败

我想解析以下结构的向量:

我的语法如下所示:

我的 Harnass 看起来像这样:

如果我将规则规范从 kleene 星规范切换到序列匹配,则不会出现错误。

否则在尝试解析我的例句时会出现预期错误(显示在 harnass 中)。

理想情况下,我想写这样的规则dm_lines = +(data_member_line)(这也不起作用)。使用 '*' 和 '+' 运算符时发生了什么导致预期失败?但不是在匹配序列时?以及我该如何解决。

0 投票
2 回答
3034 浏览

c++ - C++/Boost:编写更强大的 sscanf 替代品

我想用 C++ 编写一个函数来替换 C 的 sscanf,它将匹配项分配给迭代器。

基本上,我想要类似的东西:

确切的细节可能会有所不同,但你明白了。有什么实施想法吗?

到目前为止的选项以及迄今为止的问题:

  • std::istringstream:没有用于匹配常量表达式的操纵器
  • Boost.Regex:不确定这是否可行,而且它似乎比必要的复杂得多
  • Boost.Spirit:不要认为这适用于动态生成的格式字符串,而且它似乎也比必要的更复杂
  • sscanf:它可以工作,但是是非标准的,等等,并且使用它需要很多开销,因为参数的数量是在编译时确定的
0 投票
1 回答
1967 浏览

c++ - 使用自定义跳过语法增强精神气重新建立跳过

到目前为止,我的语法一直在使用标准boost::spirit::ascii::space/boost::spirit::ascii::space_type船长。

我有一些使用船长的规则和一些不使用的规则,比如

term当我在跳过的非终结符(如)内使用非跳过的非终结符(如expression)时,一切都像我预期的那样工作 - 空格只在term非终结符内部很重要。

此外,到目前为止,我一直很好,包括在不用于qi::skip重新建立跳过的非终端内使用船长的非终端,例如

这样,空格在[]大括号内部并不重要,但在外部。

但是,现在我想添加我自己的自定义跳过程序(我想让换行符变得重要,然后添加评论跳过)。我的船长语法看起来像:

我已经能够将它添加到我的规则定义中,就像

但我似乎无法弄清楚如何使用我的跳过语法作为qi::skip(和替换ascii::space)的参数。我尝试过使用类型、局部实例变量和全局实例变量。我得到的最远的是让clang抱怨我的skip_grammar需要一个复制构造函数。所以我尝试在我的跳过语法中添加一个复制构造函数,但显然boost::noncopyable基类的存在是有原因的,因为我的二进制文件几乎立即发生了段错误。

我应该如何使用这个?

谢谢

0 投票
2 回答
1528 浏览

c++ - 如何从 Spirit::Qi 规则访问 boost::variant 成员?

我找不到在我的 Spirit-Qi 语法中使用 boost::phoenix 访问 boost::variant 成员的正确方法。这是我想要实现的简单示例。(我的整个语法要复杂得多,这是我正在测试提到的问题的简单片段)。

但是我找不到任何 phoenix::get<> 或任何类似的方法来使用 Phoenix 访问 boost::variant。我需要 phoenix::get<> 的原因是因为我需要将变量插入到具有特定类型的列表中,然后将此特定类型作为对子规则的引用作为继承属性传递:

有什么办法可以实现这样的行为?

感谢您的回复

瑞克

0 投票
1 回答
1003 浏览

c++ - 将文件路径字符串传递给 Boost.Spirit 中的语义操作

我是 Boost.Spirit 的新手,我有一个与我尝试使用该库实现的迷你解释器相关的问题。作为解析我的语言的子任务,我需要从表单的输入中提取文件路径:

并将其作为字符串(不带引号)传递给语义动作。

我写了一些代码来解析这种类型的输入,但是传递解析的字符串并没有按预期工作,可能是因为我缺乏 Boost.Spirit 的经验。

任何人都可以帮忙吗?

实际上,我的语法更复杂,但我已将问题隔离为:

输出是:

但我想获得:

0 投票
1 回答
769 浏览

c++ - 在 boost::spirit 中使用指向解析器的指针

基本上我正在做一个表达式解析器。由于我需要尽可能好的性能,并且根据文档构造语法可能会相当慢,我想在解析之前重用语法并绑定符号表。由于语法的客户端可能有一个在解析之前构建和维护的符号表,因此我最好也避免复制实际表,这导致我使用以下代码(简化)来翻译术语:

这里的问题是 m_Symbols。我想要 m_Val 通过引用来保存 m_Symbols,因为当我们绑定符号表时,我自然会修改指针,我认为这可以通过使用 boost::phoenix::ref 以某种方式解决?但更大的问题是我在合成新的解析器时似乎无法使用指向解析器的指针。在表达式中使用取消引用会立即取消引用 m_Symbols,这是不需要的,我想延迟取消引用以解析时间。

0 投票
1 回答
444 浏览

c++ - How to parse such XML with boost.Qi and call functions named as tags?

so I know there are official tutorials on Boost.Qi XML parsing but I steel quite do not get how to parse with it such XML:

It looks quite simple but I steel do not get how to parse my xml..( What I need is simple - call a function (called with same name as tag like file() of host()) I need to sent to functions objects like:

So - how to make boost.Qi parse my XML and call my functions while parsing?

0 投票
1 回答
300 浏览

boost-spirit - 如何为 boost::spirit::qi 和 std::list 容器定义流操作符

在我的一条规则中,将 qi::locals<> 与 stl 容器作为参数。当我在没有 BOOST_SPIRIT_QI_DEBUG 的情况下编译我的程序时,一切正常。但是当我打开 BOOST_SPIRIT_QI_DEBUG 时,由于缺少运算符 <<,程序无法编译。

简化片段:

错误:

我试图为 TlstValues 定义流式操作符,但没有效果。错误还是一样。我的运营商定义:

有人可以告诉我如何定义所需的运算符以使 BOOST_SPIRIT_DEBUG 工作吗?

谢谢和问候瑞克

0 投票
1 回答
287 浏览

c++ - 齐::规则不解析输入字符串

我有一个奇怪的麻烦:

输入为“WELL name3 PROD OIL \n”。control 和 limit 是符号表。

我做错了什么?

更新

定义 BOOST_SPIRIT_QI_DEBUG 并在表达式之前使用 BOOST_SPIRIT_DEBUG_NODE (param) 如果使用 str ,我会得到以下输出:

在 +alnum 的情况下,我得到:

回溯

0 投票
1 回答
631 浏览

c++ - Boost::Spirit::Qi 自动规则和条件动作

这可能是一个非常简单的问题,特别是因为我已经成功使用 QI 解析简单结构有一段时间了,并且可能应该已经知道答案,但无论如何它都让我无法理解......

假设我们有一个容器,例如:

和一个输入文件,如

特定类别的对象以任何顺序出现,并非所有对象都可能出现。

我将在此处跳过 Fusion 改编,但它将是两个字符串向量。

我的问题是,构建一个填充这样的条件容器的语法。到目前为止,我已经通过多次解析输入来解决这个问题,每次都使用专门的语法。在此示例中,这将是男性和女性。

在 QI mini-XML 教程中,我得到的印象是自动规则会带走语义操作,但不可否认,我还是个菜鸟,仍然被 QI 使用的核心(模板)魔术 API 吓倒。所以,即使我知道它很糟糕,糟糕的形式......我会非常感激能在这里得到一个真正的实际例子,因为我遇到了一些大灯堵塞的情况。编辑:不必完全适合这个结构,只是......一个使用自动规则并将事物放入适当存储桶的语法的实际示例。