微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

boost Spirit X3 中的上下文是什么? 扮演你的教练

如何解决boost Spirit X3 中的上下文是什么? 扮演你的教练

短版

上下文 (boost::spirit::x3::context) 的用途是什么,它们代表什么,为什么需要它们而不对最终用户隐藏, 他们应该满足哪些要求才能顺利编译?

特别是在不同翻译单元中使用解析器时,例如用于单元测试。

长版

在 X3 文档中,当您想准确了解需要上下文时的预期内容时, 不是很清楚。

Documentation 说:

  1. semantic actions的上下文中 :

我们可以从上下文中提取相关信息

  1. 上下文用 BOOST_SPIRIT_DEFINE 提及 但什么也没说

  2. 在解释预期的 program structures 时也提到了上下文:

我们还需要提供初始上下文类型。这是上下文 X3 将用于启动解析。致电 phrase_parse,您将 需要 phrase_parse_context 就像我们在下面做的那样,传入船长类型

  1. annotation tutorial 上下文再次被提及和操纵,但没有明确解释它们是什么,以及如何使用它们。

如果您阅读了之前的程序结构教程,我们将各种逻辑分离 解析器的模块转换成单独的 cpp 和头文件,你想知道如何 提供上下文配置信息(见配置部分),我们需要补充 上下文是这样的:

  1. 依此类推,我们在阅读中越深入,人们就会假设已知的上下文越多,而对其解释的就越少。

所以最后,我们选择一个(文档中提供的一个开始)

x3::phrase_parse_context<x3::ascii::space_type>::type

只要它能编译……一切都很好。

虽然很快,但编译器大喊大叫。这并不罕见:它是编译器在做它的工作。但在这种情况下,很难看出如何从错误消息中获取有用的信息。

我看到链接器报告缺少符号,但我需要更多信息。很难看出符号在哪里使用或类型是如何推断的。

如果只有文档告诉我们上下文的用途和真正预期的内容

我尝试阅读context.hpp,它不长而且很容易阅读。但它太抽象了,我仍然不知道上下文模型或代表什么。

SO 上,有一些关于上下文、不匹配、 以及出色的答案。我并没有真正了解更多关于询问为什么需要上下文、应该如何使用它们以及何时需要关心它们的问题。参见例如

  1. Mixing non-terminal rules from separeted translation unit
  2. Embedding a parser from a separate translation unit into another parser
  3. Splitting Boost.Spirit.X3 parsers into several TUs

在爬上学习精神/X3的第一座山之后,我认为我已经完成了最艰难的部分。 那是没有掌握上下文的本质,这在链接时很重要。

问题

上下文 (boost::spirit::x3::context) 的用途是什么,它们代表什么,为什么最终用户需要它们,以及它们应该满足哪些要求才能顺利编译?

解决方法

Contexts 包含解析器运行所需的每一位运行时状态以及以下通用实例化参数:

  • 船长类型
  • 迭代器类型

确实,在跨翻译单元拆分解析器时,这是链接器错误的常见来源。至少不是因为

文档基本上说明了所有这些。但它们专注于一条快乐的道路,不会让您轻松体会到跨翻译单元维护规则会变得多么繁琐。

扮演你的教练

我建议一个简单的指南

我不会在单个翻译单元之外传播/共享规则

这样它们的定义就可以与它们的声明/实例化一起存在。

这样做有一些缺点:

  • 那个 TU 的编译时间可能会更长

  • 如果语法复杂,可能会导致源文件很大

  • 最后,由于上面观察到的效果(*),在简单场景中可能会有过多的模板实例化,因为当局部规则递归实例化时;它们将导致许多“不同”的实例化。

    如果语法的某些部分发生变化,例如船长(例如使用 x3::skip/x3::no_skip).

推论:

如果你的语法真的很大,考虑一个独立的解析器生成器而不是 Spirit

尽管这些似乎都暗示了局限性,但 X3 仍然是一个极好的工具,可以大大提高我的工作效率。我被积极授权正确一致编写小型解析器。

PS/旁白

我认为链接的答案也应该有助于更广泛的关于什么是上下文的问题。除此之外,我可以向您指出一些 [其他] 位置,在这些位置我帮助人们在 X3 的上下文 [原文如此] 中调试链接器错误。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。