體驗boost::spirit

來源:互聯網
上載者:User
    一直對解譯器的實現感興趣, 為此也找了不少資料, 但是幾乎沒有一個可以讓我滿意的, 要不產生的代碼幾乎沒有可讀性(Lex/YACC), 要不就是產生的代碼都是非物件導向的, 唯一讓我有點興趣的就是ANTLR(Another Tool for Language Recognition), 它可以基於產生C++/Java/C#/Python的代碼, 可讀性也不錯, 但是在編寫文法檔案並嵌入Action的時候沒有IntelliSense讓人著實不爽. 
    就在這時候在網上看到關於spirit的介紹, 這是一個包含在boost中的parser架構, 從網上同仁對它的評價來看, 應該不錯, 於是到sf上下了boost(1.30以上版本包含spirit), 就照著文檔的介紹開工了. 
    可惜整個過程非常不順利, 按照doc的介紹原模原樣輸進去的代碼居然編譯通不過:

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <string>
#include <boost/spirit.hpp>

using namespace std;
using namespace boost::spirit;

int main()
{
    string str;
    vector<double> v;

    rule<> r = real_p[append(v)] >> *(',' >> real_p[append(v)]);
 
    getline(cin, str);

    if (parse(str.c_str(), r, space_p).full) 
        cout << "sucessful" << endl;
    else
        cout << "failed" << endl;

    return 0;

    這樣一個簡單的程式, 居然死活通不過編譯, 老天, 這可是咱家一摸一樣抄書上的啊!!! 
    沒法子, 看來只能google一把了, 誰叫咱家對template不熟了, 天知道那些一坨一坨的參數是什麼意思, 經過n(n<=1)個小時的搜尋, 終於讓我找到原因了, 原來問題出在下面這行代碼:
    rule<> r = real_p[append(v)] >> *(',' >> real_p[append(v)]);
改成
    rule<phrase_scanner_t> r = real_p[append(v)] >> *(',' >> real_p[append(v)]);
就可以了!!! (至此終於讓我的第一個spirit程式跑起來了, )

事後記:
    想想也真是的, 網上那些狗屁教程給了個例子, 居然還是通不過的, 不知道是咱家運氣差, 還是研究spirit的人都跑到爪哇國去了, 怎麼找來找去就那麼幾篇文章呢? 讓本菜鳥頭疼不已啊! 希望有這方面的高手能發揚風格, 可供我輩瞻仰!

另: 發現spirit編譯真是有點小慢啊, 上面那麼一個小程式, 每次編譯都要10秒以上, 不知道我的2.8g CPU在幹嘛? 要想快一點的話, 可以把 #include <boost/spirit.hpp> 改成 #include <boost/spirit/core.hpp>, 不過也快不了多少, 呵呵:)
(The End)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.