首頁 > 後端開發 > C++ > 為什麼分配給'auto”變數的 Spirit 解析器會導致問題,以及如何修復它們?

為什麼分配給'auto”變數的 Spirit 解析器會導致問題,以及如何修復它們?

Barbara Streisand
發布: 2024-11-21 11:23:13
原創
550 人瀏覽過

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

管理Spirit 中的解析表達式

在此查詢中,我們探討將Spirit 解析器分配給自動變數時遇到的挑戰。雖然解析器在直接與 qi::parse() 一起使用時可能會無縫運行,但當解析器被指派給 auto 變數並重複使用時,就會出現問題。

這種行為的核心在於 Spirit 解析器的實作方式。 Proto 表達式模板構成 Spirit 的基礎,維護臨時變數的參考。當解析器指派給 auto 變數時,底層 Proto 表達式也會建立對臨時解析器的參考。

要解決這個問題,可以使用以下幾個選項:

  • qi ::copy(): 這個方法是在 Boost V2主幹中引入的,允許複製解析器,確保不同的副本並破壞引用
  • 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板