问题标签 [boost-spirit-x3]

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 回答
554 浏览

c++ - 使用 boost spirit x3 解析逗号分隔的 0 个或多个列表

我经常需要解析0 or more list以 boost spirit x3 分隔的逗号。我知道%-operatorwhich 将 a 解析1 or more liststd::vector. 当我需要 a 时,0 or more list我目前这样做是这样-(element_parser % separator)的,它做我想要的,但解析成 a boost::optional<std::vector>,这不是我所追求的。那么我怎样才能制作一个解析器,它0 or more list使用 boost spirit x3 将一个逗号解析为一个普通的 std::vector。

0 投票
2 回答
325 浏览

c++ - 升压灵 x3 分裂后的奇怪语义行为

parser.hpp在将语法拆分为推荐的, parser_def.hpp,parser.cpp文件后,我遇到了 boost spirit x3 的一种奇怪行为。我的示例语法解析了一些简单的枚举:

这是我的枚举语法。当我不将枚举和标识符解析器拆分为推荐的文件时,一切正常,尤其是字符串"enum {foo, bar}" 按预期抛出预期失败。这个例子可以在这里找到:未拆分的工作示例

但是当我将完全相同的语法拆分为不同的文件时,解析器会抛出

试图解析相同的字符串"enum {foo, bar}"

这个例子可以在这里找到:分裂奇怪的例子

  1. ast.hpp

    /li>
  2. 配置文件

    /li>
  3. 枚举.cpp

    /li>
  4. 枚举定义.hpp

    /li>
  5. 枚举.hpp

    /li>
  6. 标识符.cpp

    /li>
  7. 标识符_def.hpp

    /li>
  8. 标识符.hpp

    /li>
  9. 主文件

    /li>

这是一个错误,我错过了什么,还是这是一个预期的行为?

编辑:是我的回购与一个抛出一个std::logic_error而不是一个例子expectation_failure

0 投票
1 回答
156 浏览

boost-spirit - 在 X3 运行时将解析器传递给规则

可以将解析器作为spirit::qi继承属性传递给规则,然后直接使用它:

在 X3 中是否有任何解决方法?

我可以使用 将解析器“注入”到所需的规则上下文中with<state_tag>(std::ref(my_parser))[destination_rule],稍后我可以在一些语义操作中检索它 - 但我不知道如何“调用”它。

0 投票
2 回答
282 浏览

c++ - 提升精神 x3 (A | A) 属性类型是变体代替

我正在尝试创建一个简单的解析器,它使用boost::spirit::x3. 问题是它x3::char_('#') | x3::char_('.')似乎有一个 type 的属性boost::variant<char, ?>。这意味着我必须在boost::get<char>上使用_attr,而它应该可以直接转换为char.

http://ciere.com/cppnow15/x3_docs/spirit/quick_reference/compound_attribute_rules.html,它说A | A -> A

如果使用注释掉的版本,mapChars那么它可以转换为 a char,但不能转换为|.

我在 boost 版本 1.63.0 和 Linux 上。该代码无法在 g++ 和 clang++ 上使用-std=c++14.

我究竟做错了什么?

0 投票
1 回答
1702 浏览

boost-spirit-x3 - 升力精神3在哪里?它被遗弃了吗?

没有找到boost Spirit 3的下载,官网好像12月底就不说了?它去哪儿了?

0 投票
0 回答
82 浏览

c++ - 缺少可选 boost::spirit::x3 规则的属性值

我有一些带有一些可选部分的简单解析器。而且我注意到如果我使用自定义结构作为属性而不是省略的值是零初始化的。

例如,解析f 1//100 2//200 3//300填充f1/0/100 2/0/200 3/0/300

魔杖盒上的演示

我可以依靠这种行为吗?或者这只是一个巧合,可能会与未来的版本发生冲突?

0 投票
1 回答
276 浏览

c++ - 如何定义一个从任何编码空间解析单个字符的精神 x3 解析器?

如果我们忽略该属性,这test::char_将起作用。

但是如果我们想从中获取属性test::char_呢?我不知道如何正确设置属性类型,因为这个属性类型应该是

这在精神 qi 中不是问题,因为 qi 解析器有一个模板属性结构,我们可以在其中从 Iterator 获取 char 类型。

编辑:谢谢你回答这个问题。自动属性传播适用于test::char_,但它仍然不能传播正确的属性,例如复合属性+test::char_

Edit2:我想用这个 test::char_ 来替换 x3 中的各种 char_encoding::char_。例如我有一个简单的解析器函数 foo。输入字符串可以是 ascii 编码字符串或宽字符编码字符串。因此,我可以在任何地方使用这个 test::char_ 而不是 x3::char_ 和 x3::standard_wide::char_ 和 #IFDEF。

Edit3:将 attribute_type 设置为 void 或 x3::unused_type 将使 test::char_ 传播正确的属性。

Edit4:与此测试相比,来自 sehe 的 http://coliru.stacked-crooked.com/a/0a487591fbaedef4 可能是一个更好的主意:: char_ 谢谢。

0 投票
1 回答
256 浏览

c++ - Spirit X3:复合组件的基本示例无法编译

此代码逐字取自 x3 文档,无法编译

使用 Boost 1.63,1.61 和 Gcc 7,6.2 测试失败:

我错过了一些明显的东西?

0 投票
1 回答
213 浏览

c++ - Spirit x3 规则无法在序列解析器中合成 boost::iterator_range 类型的属性

在一个简单的解析器测试Live On Coliru中,

解析器

应该合成一个 type 的属性boost::iterator_range<Iterator>。但它无法编译。如果我们删除两者中的任何一个x3::lit('x'),它就会编译。尽管Live on Coliru ,但相同的代码可以用 qi 编译。

0 投票
0 回答
314 浏览

boost - Spirit X3 可选升压

我有以下简单的语法:

期望是解析像prefix:dataand之类的字符串noprefix。在第一种情况下(“前缀:数据”),使用上述语法,我希望my_attr填充两个成员,并且这可以按预期工作。

但在第二种情况下(“noprefix”),我希望只my_attr.second填充。但是,我看到两者firstsecond填充了相同的数据,即“noprefix”。这是它应该如何工作的吗?行为不直观。

完整来源: