问题标签 [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 回答
1821 浏览

c++ - 模棱两可的变种和提升精神x3

尝试调整 boost spirit x3 calc 示例以解析可以将函数作为参数的函数。但是它不编译。

错误 C2665: 'boost::detail::variant::make_initializer_node::apply::initializer_node::initialize': 5 个重载都不能转换所有参数类型

在 variant.hpp 中还有一条给用户的说明

然而我一点也不聪明……

0 投票
1 回答
1253 浏览

c++ - Boost.Spirit X3 中的错误处理和注释

用作某些 AST 节点的基类的逻辑是什么boost::spirit::x3::position_tagged(如何选择应该标记的节点,例如对于类 C 语言?)以及规则 ID 定义中使用的其他结构,例如:

?

如果输入错误(语法不匹配),这部分代码什么也不做(即使是最简单的语法,它应该识别标识符) - 不打印错误消息。

0 投票
1 回答
451 浏览

c++ - 使用 Boost.Spirit X3 在单独的翻译单元中定义船长

如何在单独的翻译单元中定义船长语法?输出属性的类型应该是什么?或者我可以简单地将模板参数指定boost::spirit::x3::unused_type为船长语法的模板类吗?我认为 skipper 语法应该只在内部将输入迭代器向前移动到空格、换行符、注释等。它在性能和内存分配/释放方面更好。如何为此类语法定义上下文类型,我应该将其提供给宏?Attributeboost::spirit::x3::ruleBOOST_SPIRIT_INSTANTIATE

0 投票
1 回答
743 浏览

c++ - 当期望解析器失败时避免抛出expectation_failure

当期望解析器失败时,如何避免抛出异常?

我有一个规则"function" > (!x3::lexeme[keyword >> !(x3::alnum | '_')] >> symbol) > ('(' > -lvalue_list > ')') > statements > "end"来解析代码,例如:

keywords 是 ( zero, one, function, return,end等)。

如果我向解析器提供function one() return zero end代码,那么在expect_directive::parse从这里抛出的函数异常中:

当它发生时,我得到了程序已意外完成。中止(核心转储)(取决于使用的终端)。

调试代码时,gdb会自动中断函数中的右大括号 '}',boost::throw_exception并显示以下消息:

当逐步执行上述功能时,可以看到,该throw enable_current_exception(enable_error_info(e));行是信号发出之前执行的最后一行。为什么异常处理程序搜索没有堆栈展开?为什么中止立即提出(看起来像boost::throw_exceptionnoexcept说明符)?

我已经接受了try { ... } catch (x3::expectation_failure< input_iterator_type > const & ef) { ... } x3::phrase_parse函数调用。x3::expectation_failure< input_iterator_type >正是从boost::throw_exception. 一切都无所谓。

有没有办法完全避免Boost.Spirit X3x3::expectation_failure中的异常,但仍然会中断整体代码解析并在预期失败时返回?x3::phrase_parsefalse

接下来是我的怀疑:

由于parse()所有解析器的成员函数的常规返回值(作为X3中的概念)是bool,我怀疑只有两种方法可以报告失败:异常 xor 返回码(只能是trueor false,并且true已经占用了Parse 成功的结果报告)。它是C++中递归降序解析器实现所固有的。但是如果我们将结果类型parse从 from更改bool为更广泛的内容,我们可以在解析期间以更灵活的方式区分报告硬错误或软错误(或其他内容)——通过返回代码的不同值。

0 投票
1 回答
808 浏览

linux - Boost Spirit 3.0.0的安装流程是什么?

对于此系统配置:

鉴于上述使用 Synaptic 包管理器安装的 Boost Spirit 3.0.0的安装程序是什么?

0 投票
1 回答
522 浏览

c++ - 使用 std::array 作为 boost::spirit::x3 的属性

std::array我正在尝试使用 boost::spirit 的最新版本 x3(包含在 boost 1.54 中)将数字列表解析为固定大小的容器。由于std::array具有必要的功能,因此被检测为Container,但缺少插入功能,使其不兼容。这是我要完成的一个简短示例:

这不会编译,因为std::array没有insert功能。作为一种解决方法,我使用了语义操作:

然后打电话

反而。这有效(使用带有-std = c ++ 14的clang 3.6.0),但我认为这个解决方案非常不雅且难以阅读。

所以我尝试使用BOOST_FUSION_ADAPT_ADT如下方式将 std::array 改编为融合序列:

然后专门x3::traits::is_container针对 Vertex 告诉 x3 不要将 std::array 视为容器:

但这不会与 x3 结合编译。这是一个错误还是我用错了?在没有所有 x3 代码的情况下调用 egfusion::front(v)可以编译和工作,所以我想我的代码并不是完全错误的。

但是我确信对于这个简单的问题,x3 有一个更清洁的解决方案,不涉及任何融合适配器或语义操作。

0 投票
1 回答
1790 浏览

c++ - Boost Spirit X3 无法编译具有可变因子的重复指令

我正在尝试使用带有可变重复因子的 Boost Spirit X3 指令重复。基本思想是标头+有效负载,其中标头指定有效负载的大小。一个简单的示例“3 1 2 3”被解释为 header = 3, data= {1, 2, 3} (3 个整数)。

我只能从灵气文档中找到例子。它使用 boost phoenix reference 来包装变量因子: http: //www.boost.org/doc/libs/1_50_0/libs/spirit/doc/html/spirit/qi/reference/directive/repeat.html

我为精神 x3 写了以下简单的例子,没有运气:

使用 boost 1.59.0 和 clang++ (flags: -std=c++14) 编译上面的代码会得到以下结果:

如果我硬编码repeat(3)而不是repeat(boost::phoenix::ref(n))它可以正常工作,但这不是一个可能的解决方案,因为它应该支持可变重复因子。

编译repeat(n)成功完成,但解析失败,输出如下: “Parse failed, remaining: 1 2 3"

查看源代码,它调用模板类型变量boost/spirit/home/x3/directive/repeat.hpp:72的空构造函数,然后在 for 循环期间分配,迭代 min 和 max。然而,由于类型是一个引用,它应该在构造函数中初始化,所以编译失败。查看之前库版本 boost/spirit/home/qi/directive/repeat.hpp:162 的等效源代码,它是直接分配的:RepeatCountLimit::typei

我不确定我在这里做错了什么,或者 x3 当前是否不支持可变重复因子。我将不胜感激解决此问题的一些帮助。谢谢你。

0 投票
1 回答
457 浏览

c++ - 从匹配的子字符串中停止 X3 符号

如何防止 X3 符号解析器匹配部分标记?在下面的示例中,我想匹配“foo”,而不是“foobar”。我尝试将符号解析器放入lexeme指令中,就像对标识符一样,但没有任何匹配项。

感谢您的任何见解!

0 投票
1 回答
1385 浏览

c++ - 使用单独的规则定义和实例化时,Boost Spirit X3 AST 无法处理语义动作

我正在尝试将 Boost Spirit X3 与语义操作一起使用,同时将结构解析为 AST。如果我使用没有单独定义和实例化的规则,它就可以正常工作,例如:

运行上面的代码(使用标志 -std=c++14 编译)输出预期结果:

现在我试图让我的 Spirit X3 解析器的组织方式与 Boost Spirit X3 中的calc 9 示例或多或少相同,但它不起作用:

  • ast.hxx:定义抽象语法树。
  • 语法.hxx:公开解析器方法的用户界面。
  • 语法.cxx:实例化规则。
  • Grammar_def.hxx:解析器语法定义。
  • config.hxx:解析器配置。
  • main.cxx:解析器使用示例。

ast.hxx:

语法.hxx:

语法.cxx:

语法_def.hxx:

配置.hxx:

主.cxx:

编译 main.cxx 和 Grammar.cxx(标志:-std=c++14)并运行上面的代码打印:

我为冗长的源代码道歉,我试图让它尽可能小。

请注意我对 unsigned n 全局变量有一些用法,它将与自定义重复指令一起使用(请参阅此处的问题和此处的解决方案之一)。为了保持问题的重点,我从这个问题中删除了重复部分,所以即使我可以删除这个例子中的语义动作,它也不是一个可能的解决方案。

我会很感激一些帮助来发现这个问题,我不清楚为什么上面的代码不起作用。先感谢您。

0 投票
1 回答
657 浏览

c++ - 编译错误 C++ Spirit X3 没有可行的重载 =,没有用于调用 move_to 的匹配函数

Michael Caisse 发表了关于 Spirit X3 的演讲:https ://www.youtube.com/watch?v=xSBWklPLRvw 。我尝试将演示文稿转录为工作代码,但出现编译错误,包括“没有可行的重载 '='”和“没有对 'move_to.' 的匹配函数调用。” 我的phrase_parse(最后一行)定义正确吗?是否有任何明显的错误?