ホームページ > バックエンド開発 > C++ > 「auto」変数に割り当てられた Spirit パーサーが問題を引き起こすのはなぜですか? 問題を修正するにはどうすればよいですか?

「auto」変数に割り当てられた Spirit パーサーが問題を引き起こすのはなぜですか? 問題を修正するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-11-21 11:23:13
オリジナル
544 人が閲覧しました

Why Do Spirit Parsers Assigned to `auto` Variables Cause Issues, and How Can I Fix Them?

Spirit での解析された式の管理

このクエリでは、Spirit パーサーを auto 変数に割り当てるときに遭遇する課題を調べます。パーサーは qi::parse() で直接使用するとシームレスに機能しますが、パーサーを auto 変数に割り当てて再利用すると問題が発生します。

この動作の中心は、Spirit パーサーの実装方法にあります。 。 Spirit の基礎を形成するプロト式テンプレートは、一時変数への参照を維持します。パーサーが auto 変数に割り当てられると、基礎となる Proto 式も一時パーサーへの参照を確立します。

この問題に対処するために、いくつかのオプションが利用可能です:

  • qi ::copy(): Boost V2 のトランクに導入されたこのメソッドは、パーサーのコピーを可能にし、個別のコピーを確保し、参照を破壊します。 chain.
  • boost::proto::deep_copy: この関数はディープ コピー機能を提供し、パーサー参照の問題にも対処できます。
  • BOOST_SPIRIT_AUTO: このマクロは、以前の Stack Overflow 応答で紹介されたもので、コピーの便利な省略表現として使用できます。パーサー。

例:

namespace qi = boost::spirit::qi;

int main()
{
    auto bracketed_z = qi::copy( '[' >> +qi::char_('z') >> ']' ); // Uses qi::copy()

    string line = "[z]";
    auto p = line.cbegin();
    printf("%d", qi::parse(p, line.cend(), bracketed_z)); // Now works with auto variable

    // Alternative using BOOST_SPIRIT_AUTO
    BOOST_SPIRIT_AUTO(bracketed_z, '[' >> +qi::char_('z') >> ']');
}
ログイン後にコピー

これらのアプローチは、パーサーと一時変数の間の参照チェーンを切断することで問題を解決し、自動変数を Spirit で効果的に使用できるようにします。パーサー。

以上が「auto」変数に割り当てられた Spirit パーサーが問題を引き起こすのはなぜですか? 問題を修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート