基本上我正在做一个表达式解析器。因为我需要尽可能好的性能,并且根据语法的文档构造可能相当慢,我想在解析之前重用语法并绑定符号表。由于语法的客户端可能有一个在解析之前构造和维护的符号表,我理想地希望避免复制实际的表,这导致我转换以下代码(简化)来翻译术语: / p>
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来解决这个问题。但更大的问题是,在合成新的解析器时,我似乎无法使用指向解析器的指针。在表达式中使用dereference立即取消引用m_Symbols,这是不需要的,我想延迟解除引用到解析时间。
答案 0 :(得分:2)
我相信一个简单的
qi::symbols<char, double>* m_Symbols;
qi::rule<Iterator, double(), ascii::space_type> m_Val;
m_Val = qi::int_ | qi::double_ | qi::lazy(*m_Symbols);
应该做你需要的。 lazy
解析器(请参阅here)仅在解析时(重复)评估其参数。