语法分解问题

托米洛夫·阿纳托利(Tomilov Anatoliy)

当我试图表达语法(LUA的小的子集,几乎相同mini_c ;不那么somplex),那么我所面临的问题:克++驱动馈送气体气体一段时间(后粉碎时关于总存储器消耗的500MB达到具有8GB RAM的系统)。我查看了《编译器教程》,发现应该将复杂的语法分解为较小的语法。

问题是强制性的,我们应该使类(由规则集组成)本身就是语法(即,使它们继承自boost::spirit::qi::grammar)吗?IOW,我们可以将规则划分为子集并在简单的类声明之间作为字段分配它们,以便定义(例如,在单独的标头中)并显式实例化每个类(在实践中,类模板)到单独的翻译单元中,以避免崩溃如上所述?如果答案是肯定的,那么如何使用宏BOOST_SPIRIT_DEBUG_NODES和构造的座位,如:

using namespace boost::spirit;
qi::on_error< qi::fail >(function_definition_,
                                 error_handler_function(_error_handler)(
                                     "Error! Expecting ", qi::_4, qi::_3));

using namespace boost::spirit;
qi::on_success(function_name_,
                       annotation_function(_error_handler.iters_)(qi::_val, qi::_1));

应该将它们放置在何处(例如,如果我们有如下类的类链:expression_level-> statement_level-> function_list_level,那么必须将它们分别放置在每个类中,或者放置在链中的最后一个类中吗? )?

这个问题的重点是通过简化语法的表达方式来减少编译的复杂性(以及,thouse,编译时间)。

看到

记住:这只是C ++类。

所以,

  1. 您可以按照自己喜欢的任何方式将资产拆分为TU。
  2. AFAICT on_error和debug通过引用附加到其主题规则,因此您可以将它们放在任何地方
  3. 是的,您可以让类充当规则的“哑”容器。实际上,如果您的迭代器/跳过程序没有变化,则可以使用名称空间:

    //header
    namespace G1 { extern const qi::rule<It, attr()> R1; }
    
    //cpp
    namespace G1 { const qi::rule<It, attr()> R1 = qi::eps /* ... */; }
    

    我认为这种方法主要是使用Spirit X3 (?)

  4. 偏重于继承而不是继承(赋予编译器更多的自由)

  5. 禁用调试信息(-g0
  6. 尝试针对大小进行优化-Os或不进行优化(-O0
  7. 禁用昂贵的功能:

    • BOOST_SPIRIT_DEBUG
    • 利用 BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
    • 避免语义动作

此外,如果您希望隐藏公共界面中的所有内容,请使用pimpl / file-static匿名命名空间。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章