当我试图表达语法(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 ++类。
所以,
是的,您可以让类充当规则的“哑”容器。实际上,如果您的迭代器/跳过程序没有变化,则可以使用名称空间:
//header
namespace G1 { extern const qi::rule<It, attr()> R1; }
//cpp
namespace G1 { const qi::rule<It, attr()> R1 = qi::eps /* ... */; }
我认为这种方法主要是使用Spirit X3 (?)
偏重于继承而不是继承(赋予编译器更多的自由)
-g0
)-Os
或不进行优化(-O0
)禁用昂贵的功能:
BOOST_SPIRIT_DEBUG
BOOST_SPIRIT_NO_PREDEFINED_TERMINALS
此外,如果您希望隐藏公共界面中的所有内容,请使用pimpl / file-static匿名命名空间。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句