grammar.cpp

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

CPP
121
字号
/*=============================================================================    Copyright (c) 2001-2007 Joel de Guzman    Distributed under 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 <boost/detail/lightweight_test.hpp>#include <boost/spirit/include/qi_operator.hpp>#include <boost/spirit/include/qi_char.hpp>#include <boost/spirit/include/qi_string.hpp>#include <boost/spirit/include/qi_numeric.hpp>#include <boost/spirit/include/qi_nonterminal.hpp>#include <boost/spirit/include/qi_action.hpp>#include <boost/spirit/include/phoenix_core.hpp>#include <boost/spirit/include/phoenix_operator.hpp>#include <string>#include <iostream>#include "test.hpp"using namespace spirit_test;using namespace boost::spirit;using namespace boost::spirit::qi;using namespace boost::spirit::ascii;using namespace boost::spirit::arg_names;struct num_list : grammar<char const*, space_type>{    num_list() : base_type(start)    {        using boost::spirit::int_;        num = int_;        start = num >> *(',' >> num);    }    rule<char const*, space_type> start, num;};struct inh_g : grammar<char const*, int(int), space_type>{    inh_g() : base_type(start)    {        start = lit("inherited")[_val = _r1];    }    rule<char const*, int(int), space_type> start, num;};struct my_skipper : grammar<char const*>{    my_skipper() : base_type(start)    {        start = space;    }    rule<char const*> start, num;};struct num_list2 : grammar<char const*, my_skipper>{    num_list2() : base_type(start)    {        using boost::spirit::int_;        num = int_;        start = num >> *(',' >> num);    }    rule<char const*, my_skipper> start, num;};template <typename Iterator, typename Skipper>struct num_list3 : grammar<Iterator, Skipper>{    template <typename Class>    num_list3(Class& self) : grammar<Iterator, Skipper>(start)    {        using boost::spirit::int_;        num = int_;        start = num >> *(',' >> num);    }    rule<Iterator, Skipper> start, num;};intmain(){    { // simple grammar test        num_list nlist;        BOOST_TEST(test("123, 456, 789", nlist, space));    }    { // simple grammar test with user-skipper        num_list2 nlist;        my_skipper skip;        BOOST_TEST(test("123, 456, 789", nlist, skip));    }    { // direct access to the rules        num_list g;        BOOST_TEST(test("123", g.num));        BOOST_TEST(test("123, 456, 789", g.start, space));    }    { // grammar with inherited attributes        inh_g g;        int n = -1;        BOOST_TEST(test_attr("inherited", g.start(123), n, space)); // direct to the rule        BOOST_TEST(n == 123);        BOOST_TEST(test_attr("inherited", g(123), n, space)); // using the grammar        BOOST_TEST(n == 123);    }    return boost::report_errors();}

⌨️ 快捷键说明

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