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 + -
显示快捷键?