【问题标题】:generator from boost::spirit::x3 AST?boost::spirit::x3 AST 的生成器?
【发布时间】:2019-01-10 21:07:00
【问题描述】:

尊敬的同事们,

我有一个 boost::spirit::x3 解析器(属于 AST),它可以很好地用于将输入文件引入我们的应用程序。

我想翻转一下,让它根据同一棵树生成输出流。

这是我从未做过的事情。我应该使用 boost::karma,还是只为树写一个访问者/步行者? boost 提供了哪些工具可以帮助我开始使用这些方法中的任何一种?

我想在全局范围内指定递归深度,并且在每个级别上都可能有用,否则输出可能会很大。

其他新手需要考虑的问题?

谢谢!

【问题讨论】:

  • 我可能误解了这个问题。从标题中我知道您想要遍历解析器表达式树。也许你只是想走 AST。如果是这样,请澄清问题(注意标题)
  • @sehe:已更改。谢谢。

标签: c++ boost abstract-syntax-tree boost-spirit


【解决方案1】:

X3 没有什么能比得上 Karma。

在底层 Proto 库之外没有任何工具可以遍历表达式树。

但是。您将遇到可预测的问题,即输入输出的映射不是双射。您将始终必须为此类数据选择首选的输出表示,这意味着您的数据可能不会往返,您可能会有有损转换。您需要将这些考虑在内。

我实际上不会考虑这个。我不会将我的实现与复杂库的实现细节紧密耦合¹,而是将我的算法基于您实际控制的 AST 或数据结构。


¹ 就像 X3 一样,它也是实验性的,所以事情可能会在没有通知的情况下发生变化

【讨论】:

  • 感谢您的建议,实际上,您的观点很好。将输入和输出紧密耦合在一起可能不太有用。我想要一种机制来为我们的 X3 解析器下游的事物生成大量测试用例。如果我进一步解耦它们,我也可以测试解析器。
  • 我觉得这样的任务可能最好使用 perl 脚本来完成,或者甚至更好的是手动输入:生成通常不会找到相关的边缘情况。甚至更糟:如果您选择从解析器本身生成测试输入,您将拥有自服务的测试用例,并且您不再测试任何东西(除了编译器和库实现)跨度>
猜你喜欢
  • 2020-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-18
相关资源
最近更新 更多