#include <QtCore/QCoreApplication>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
#include <iostream>
#include <string>
#include <list>
#include <map>
#define CODE_CPP_KEYWORD_ENUM "enum"
namespace haha
{
//簡單表示c++的enum的類(A structure use to simply description C++ enum)
struct CPPCodeEnum
{
//enum的名稱(enum Name)
::std::string enumName;
//成員的名稱(enum Members‘name)
::std::list<::std::string> enumMembers;
};
}
namespace haha
{
namespace fusion = boost::fusion;
namespace phoenix = boost::phoenix;
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;
//enum的簡單解析器
template <typename Iterator>
struct CPPCodeEnumGrammar
: qi::grammar<Iterator, CPPCodeEnum(),ascii::space_type >
{
CPPCodeEnumGrammar()
: CPPCodeEnumGrammar::base_type(start)
{
using qi::_val;
using qi::_1;
using qi::lit;
using qi::lexeme;
using qi::raw;
using qi::space;
using ascii::char_;
using ascii::string;
using phoenix::push_back;
//解析一個變量名(他不符合C++的命名規範,暫時只是個替代品)
quoted_string = lexeme[+(qi::alpha|qi::digit | char_('_'))];
start =
//解析「enum」
lit(CODE_CPP_KEYWORD_ENUM)>>
//取得enum名
*quoted_string[ phoenix::bind(&CPPCodeEnum::enumName, _val)= _1]>>
char_("{")>>
//解析enum的成員
*(quoted_string[push_back(phoenix::bind(&CPPCodeEnum::enumMembers, _val), _1)]%',')>>
//可有可無的逗號小尾巴
-char_(",")>>
char_("}");
}
qi::rule<Iterator, std::string(),ascii::space_type > quoted_string;
qi::rule<Iterator, CPPCodeEnum(), ascii::space_type > start;
};
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
//模擬C++的一段代碼(test string simulate a section of C++ code)
::std::string teststr="enum myename {m1,m2 ,m3 ,m4 ,}";
using boost::spirit::ascii::space;
std::string::const_iterator iter = teststr.begin();
std::string::const_iterator end = teststr.end();
haha::CPPCodeEnumGrammar<std::string::const_iterator> myCPPCodeEnumGrammar;
haha::CPPCodeEnum data;
bool r = phrase_parse(iter, end, myCPPCodeEnumGrammar, space, data);
return a.exec();
}
上面的代碼工作正常,但它太簡單了,不能像這樣解析代碼:(enum myename {m1 = 1,m2 = 44,m3 = 89,m4 = 0,})。我需要枚舉成員的名稱和值。現在我決定替代類型的「CPPCodeEnum :: enumMembers」如何使用boost-spirit將結果放到STL地圖中?
list < std::string::string>與
map < std::string::string,int>。但我不知道如何把結果通過使用助推精神的STL地圖?