5

基本的に、私は式パーサーを実行しています。可能な限り優れたパフォーマンスが必要であり、ドキュメントによると、文法の構築がかなり遅くなる可能性があるため、解析の直前に文法を再利用してシンボルテーブルをバインドしたいと思います。文法のクライアントは、構文解析の前に作成および維持されるシンボルテーブルを持っている可能性が高いため、理想的には、実際のテーブルのコピーも避けたいと思います。これにより、用語を変換するための次のコード(簡略化)が表示されます。

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がすぐに逆参照されますが、これは不要です。逆参照を遅らせて、時間を解析したいと思います。

4

1 に答える 1

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パーサー(ここを参照)、解析時にのみ引数を(繰り返し)評価します。

于 2011-03-09T23:56:06.380 に答える