问题标签 [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.
c++ - 模棱两可的变种和提升精神x3
尝试调整 boost spirit x3 calc 示例以解析可以将函数作为参数的函数。但是它不编译。
错误 C2665: 'boost::detail::variant::make_initializer_node::apply::initializer_node::initialize': 5 个重载都不能转换所有参数类型
在 variant.hpp 中还有一条给用户的说明
然而我一点也不聪明……
c++ - Boost.Spirit X3 中的错误处理和注释
用作某些 AST 节点的基类的逻辑是什么boost::spirit::x3::position_tagged
(如何选择应该标记的节点,例如对于类 C 语言?)以及规则 ID 定义中使用的其他结构,例如:
?
如果输入错误(语法不匹配),这部分代码什么也不做(即使是最简单的语法,它应该识别标识符) - 不打印错误消息。
c++ - 使用 Boost.Spirit X3 在单独的翻译单元中定义船长
如何在单独的翻译单元中定义船长语法?输出属性的类型应该是什么?或者我可以简单地将模板参数指定boost::spirit::x3::unused_type
为船长语法的模板类吗?我认为 skipper 语法应该只在内部将输入迭代器向前移动到空格、换行符、注释等。它在性能和内存分配/释放方面更好。如何为此类语法定义上下文类型,我应该将其提供给宏?Attribute
boost::spirit::x3::rule
BOOST_SPIRIT_INSTANTIATE
c++ - 当期望解析器失败时避免抛出expectation_failure
当期望解析器失败时,如何避免抛出异常?
我有一个规则"function" > (!x3::lexeme[keyword >> !(x3::alnum | '_')] >> symbol) > ('(' > -lvalue_list > ')') > statements > "end"
来解析代码,例如:
keyword
s 是 ( 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_exception
有noexcept
说明符)?
我已经接受了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_parse
false
接下来是我的怀疑:
由于parse()
所有解析器的成员函数的常规返回值(作为X3中的概念)是bool
,我怀疑只有两种方法可以报告失败:异常 xor 返回码(只能是true
or false
,并且true
已经占用了Parse 成功的结果报告)。它是C++中递归降序解析器实现所固有的。但是如果我们将结果类型parse
从 from更改bool
为更广泛的内容,我们可以在解析期间以更灵活的方式区分报告硬错误或软错误(或其他内容)——通过返回代码的不同值。
linux - Boost Spirit 3.0.0的安装流程是什么?
对于此系统配置:
鉴于上述使用 Synaptic 包管理器安装的 Boost Spirit 3.0.0的安装程序是什么?
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 有一个更清洁的解决方案,不涉及任何融合适配器或语义操作。
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::type
i
我不确定我在这里做错了什么,或者 x3 当前是否不支持可变重复因子。我将不胜感激解决此问题的一些帮助。谢谢你。
c++ - 从匹配的子字符串中停止 X3 符号
如何防止 X3 符号解析器匹配部分标记?在下面的示例中,我想匹配“foo”,而不是“foobar”。我尝试将符号解析器放入lexeme
指令中,就像对标识符一样,但没有任何匹配项。
感谢您的任何见解!
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 全局变量有一些用法,它将与自定义重复指令一起使用(请参阅此处的问题和此处的解决方案之一)。为了保持问题的重点,我从这个问题中删除了重复部分,所以即使我可以删除这个例子中的语义动作,它也不是一个可能的解决方案。
我会很感激一些帮助来发现这个问题,我不清楚为什么上面的代码不起作用。先感谢您。
c++ - 编译错误 C++ Spirit X3 没有可行的重载 =,没有用于调用 move_to 的匹配函数
Michael Caisse 发表了关于 Spirit X3 的演讲:https ://www.youtube.com/watch?v=xSBWklPLRvw 。我尝试将演示文稿转录为工作代码,但出现编译错误,包括“没有可行的重载 '='”和“没有对 'move_to.' 的匹配函数调用。” 我的phrase_parse(最后一行)定义正确吗?是否有任何明显的错误?