一直对解释器的实现感兴趣, 为此也找了不少资料, 但是几乎没有一个可以让我满意的, 要不产生的代码几乎没有可读性(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)