如何解决boost Spirit X3 中的上下文是什么? 扮演你的教练
短版
上下文 (boost::spirit::x3::context
) 的用途是什么,它们代表什么,为什么需要它们而不对最终用户隐藏,
他们应该满足哪些要求才能顺利编译?
特别是在不同翻译单元中使用解析器时,例如用于单元测试。
长版
在 X3 文档中,当您想准确了解需要上下文时的预期内容时, 不是很清楚。
- 在semantic actions的上下文中 :
我们可以从上下文中提取相关信息
-
上下文用 BOOST_SPIRIT_DEFINE 提及 但什么也没说
-
在解释预期的 program structures 时也提到了上下文:
我们还需要提供初始上下文类型。这是上下文
X3 将用于启动解析。致电 phrase_parse
,您将
需要 phrase_parse_context
就像我们在下面做的那样,传入船长类型
- 在annotation tutorial 上下文再次被提及和操纵,但没有明确解释它们是什么,以及如何使用它们。
如果您阅读了之前的程序结构教程,我们将各种逻辑分离 解析器的模块转换成单独的 cpp 和头文件,你想知道如何 提供上下文配置信息(见配置部分),我们需要补充 上下文是这样的:
- 依此类推,我们在阅读中越深入,人们就会假设已知的上下文越多,而对其解释的就越少。
x3::phrase_parse_context<x3::ascii::space_type>::type
只要它能编译……一切都很好。
虽然很快,但编译器大喊大叫。这并不罕见:它是编译器在做它的工作。但在这种情况下,很难看出如何从错误消息中获取有用的信息。
我看到链接器报告缺少符号,但我需要更多信息。很难看出符号在哪里使用或类型是如何推断的。
如果只有文档告诉我们上下文的用途和真正预期的内容
我尝试阅读context.hpp
,它不长而且很容易阅读。但它太抽象了,我仍然不知道上下文模型或代表什么。
在 SO 上,有一些关于上下文、不匹配、 以及出色的答案。我并没有真正了解更多关于询问为什么需要上下文、应该如何使用它们以及何时需要关心它们的问题。参见例如
- Mixing non-terminal rules from separeted translation unit
- Embedding a parser from a separate translation unit into another parser
- Splitting Boost.Spirit.X3 parsers into several TUs。
在爬上学习精神/X3的第一座山之后,我认为我已经完成了最艰难的部分。 那是没有掌握上下文的本质,这在链接时很重要。
问题
上下文 (boost::spirit::x3::context
) 的用途是什么,它们代表什么,为什么最终用户需要它们,以及它们应该满足哪些要求才能顺利编译?
解决方法
Contexts 包含解析器运行所需的每一位运行时状态以及以下通用实例化参数:
- 船长类型
- 迭代器类型
确实,在跨翻译单元拆分解析器时,这是链接器错误的常见来源。至少不是因为
- 如您所见,上下文可以由一些指令修饰
- 上下文可以有时包含完整的解析器表达式模板(参见例如Mixing non-terminal rules from separeted translation unit)(*)。
文档基本上说明了所有这些。但它们专注于一条快乐的道路,不会让您轻松体会到跨翻译单元维护规则会变得多么繁琐。
扮演你的教练
我建议一个简单的指南
我不会在单个翻译单元之外传播/共享规则
这样它们的定义就可以与它们的声明/实例化一起存在。
这样做有一些缺点:
-
那个 TU 的编译时间可能会更长
-
如果语法复杂,可能会导致源文件很大
-
最后,由于上面观察到的效果(*),在简单场景中可能会有过多的模板实例化,因为当局部规则递归实例化时;它们将导致许多“不同”的实例化。
如果语法的某些部分发生变化,例如船长(例如使用
x3::skip
/x3::no_skip
).
推论:
如果你的语法真的很大,考虑一个独立的解析器生成器而不是 Spirit
尽管这些似乎都暗示了局限性,但 X3 仍然是一个极好的工具,可以大大提高我的工作效率。我被积极授权正确和一致编写小型解析器。
PS/旁白
我认为链接的答案也应该有助于更广泛的关于什么是上下文的问题。除此之外,我可以向您指出一些 [其他] 位置,在这些位置我帮助人们在 X3 的上下文 [原文如此] 中调试链接器错误。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。