首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

求广义表的递归实现,用C语言,小弟我搞了两天,快崩溃了

2012-03-14 
求广义表的递归实现,用C语言,我搞了两天,快崩溃了课都翘了,昨天奋战到深夜。都搞不定。求人指点[解决办法]广

求广义表的递归实现,用C语言,我搞了两天,快崩溃了
课都翘了,昨天奋战到深夜。都搞不定。求人指点

[解决办法]
广义表的定义可由下给定:
glist = glist_node* //一个广义表由多个node组成
glist_node = atom | glist.//每个node可以是广义表或者原子组成。
所以你要定义两个函数,一个解析glist,一个解析glist_node。
C++解析的话可以用boost::spirit库,节省点时间,我写了一个用
boost::spirit的解析器,可以当做你实现解析函数的参考:

C/C++ code
#include <boost/variant.hpp>#include <boost/fusion/include/adapt_struct.hpp>#include <boost/spirit/include/qi.hpp>#include <list>#include <string>struct atom {    int data;};BOOST_FUSION_ADAPT_STRUCT(atom, (int, data))typedef boost::make_recursive_variant<atom, std::list<boost::recursive_variant_> >::type glist_node;typedef std::list<glist_node> glist;using namespace boost::spirit;template<typename Iter>struct glist_grammer : qi::grammar<Iter, glist(), ascii::space_type>{    glist_grammer():glist_grammer::base_type(r_glist)    {        r_glist = '(' >> r_glist_node % ',' >> ')';        r_glist_node = r_glist | r_atom;        r_atom = qi::int_;    }    qi::rule<Iter, glist(), ascii::space_type> r_glist;    qi::rule<Iter, glist_node(), ascii::space_type> r_glist_node;    qi::rule<Iter, atom(), ascii::space_type> r_atom;};int main(int argc, char* argv[]){    typedef std::string::iterator iterator_t;    glist_grammer<iterator_t> g;    std::string s = "(4, 3,(1,2), 6)";    iterator_t b = s.begin(), e = s.end();    glist glist_;    bool result = qi::phrase_parse(b, e, g, ascii::space, glist_);    return 0;}
[解决办法]
http://blog.csdn.net/jack_wong2010/article/details/6910200

热点排行