nabialek.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 95 行

CPP
95
字号
/*=============================================================================    Copyright (c) 2003 Sam Nabialek    Copyright (c) 2003-2004 Joel de Guzman    http://spirit.sourceforge.net/    Use, modification and distribution is subject to the Boost Software    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at    http://www.boost.org/LICENSE_1_0.txt)=============================================================================*/#include <iostream>#define BOOST_SPIRIT_DEBUG#include <boost/spirit/include/classic_core.hpp>#include <boost/spirit/include/classic_error_handling.hpp>#include <boost/spirit/include/classic_iterator.hpp>#include <boost/spirit/include/classic_symbols.hpp>#include <boost/spirit/include/classic_utility.hpp>using namespace BOOST_SPIRIT_CLASSIC_NS;template <typename Rule>struct SetRest{    SetRest(Rule& the_rule)    : m_the_rule(the_rule)    {    }    void operator()(Rule* new_rule) const    {        m_the_rule = *new_rule;    }private:    Rule& m_the_rule;};struct nabialek_trick : public grammar<nabialek_trick>{    template <typename ScannerT>    struct definition    {        typedef rule<ScannerT> rule_t;        rule_t name;        rule_t line;        rule_t rest;        rule_t main;        rule_t one;        rule_t two;        symbols<rule_t*> continuations;        definition(nabialek_trick const& self)        {            name = lexeme_d[repeat_p(1,20)[alnum_p | '_']];            one = name;            two = name >> ',' >> name;            continuations.add                ("one", &one)                ("two", &two)                ;            line = continuations[SetRest<rule_t>(rest)] >> rest;            main = *line;            BOOST_SPIRIT_DEBUG_RULE(name);            BOOST_SPIRIT_DEBUG_RULE(line);            BOOST_SPIRIT_DEBUG_RULE(rest);            BOOST_SPIRIT_DEBUG_RULE(main);            BOOST_SPIRIT_DEBUG_RULE(one);            BOOST_SPIRIT_DEBUG_RULE(two);        }        rule_t const&        start() const        {            return main;        }    };};intmain(){    nabialek_trick g;    parse("one only\none again\ntwo first,second", g, space_p);    return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?