一直對解譯器的實現感興趣, 為此也找了不少資料, 但是幾乎沒有一個可以讓我滿意的, 要不產生的代碼幾乎沒有可讀性(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)