【发布时间】:2011-03-09 14:41:30
【问题描述】:
基本上我在做一个表达式解析器。由于我需要尽可能好的性能,并且根据文档构造语法可能会相当慢,我想在解析之前重用语法并绑定符号表。由于语法的客户端可能有一个在解析之前构建和维护的符号表,因此我最好也避免复制实际表,这导致我使用以下代码(简化)来翻译术语:
qi::symbols< char, double >* m_Symbols;
qi::rule< Iterator, double(), ascii::space_type > m_Val;
m_Val = qi::int_[ _val = boost::phoenix::static_cast_< double >( boost::spirit::_1 ) ] | qi::double_ | m_Symbols;
这里的问题是 m_Symbols。我想要 m_Val 通过引用来保存 m_Symbols,因为当我们绑定符号表时,我自然会修改指针,我认为这可以通过使用 boost::phoenix::ref 以某种方式解决?但更大的问题是我在合成新的解析器时似乎无法使用指向解析器的指针。在表达式中使用取消引用会立即取消引用 m_Symbols,这是不需要的,我想将取消引用延迟到解析时间。
【问题讨论】:
-
这似乎是减少语法实例数量的错误方法。为什么不只拥有语法的静态/单例实例并使其不可复制?
-
遗憾的是我还是要在解析前绑定符号表,这会导致同样的问题。
标签: c++ boost-spirit boost-spirit-qi