求广义表的递归实现,用C语言,我搞了两天,快崩溃了
课都翘了,昨天奋战到深夜。都搞不定。求人指点
[解决办法]
广义表的定义可由下给定:
glist = glist_node* //一个广义表由多个node组成
glist_node = atom | glist.//每个node可以是广义表或者原子组成。
所以你要定义两个函数,一个解析glist,一个解析glist_node。
C++解析的话可以用boost::spirit库,节省点时间,我写了一个用
boost::spirit的解析器,可以当做你实现解析函数的参考:
#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