rule_parser_1_1.cpp

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

CPP
104
字号
/*==============================================================================    Copyright (c) 2006 Tobias Schwinger    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)==============================================================================*///------------------------------------------------------------------------------//  This example uses typeof to build a nonrecursive grammar.//  See boost/spirit/include/rule_parser.hpp for details.//------------------------------------------------------------------------------#include <string>#include <iostream>#include <boost/typeof/typeof.hpp>#include <boost/spirit/include/classic_core.hpp>#include <boost/spirit/include/classic_typeof.hpp>#include <boost/spirit/include/classic_confix.hpp>#include <boost/spirit/include/classic_typeof.hpp>#include <boost/spirit/include/classic_rule_parser.hpp>// It's important to create an own registration group, even if there are no// manual Typeof registrations like in this case.#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()namespace my_project { namespace my_module {  using namespace BOOST_SPIRIT_CLASSIC_NS;  // A semantic action.  void echo_uint(unsigned i) { std::cout << "- " << i << std::endl; }  #define BOOST_SPIRIT__NAMESPACE (2,(my_project,my_module))  // C/C++ comment and whitespace skip parser..  BOOST_SPIRIT_RULE_PARSER(skipper,    -,-,-,     (   confix_p("//",*anychar_p,eol_p)       | confix_p("/*",*anychar_p,"*/")       | space_p     )  )  // Parser for unsigned decimal, hexadecimal and binary literals.  BOOST_SPIRIT_RULE_PARSER(uint_literal,    -,-,-,      "0x" >> hex_p[ & echo_uint ]    | "0b" >> bin_p[ & echo_uint ]    | uint_p[ & echo_uint ]  )   // A generic list parser (in some ways similar to Spirit's list_p utility or  // the % operator) with two parameters.  BOOST_SPIRIT_RULE_PARSER(enumeration_parser,    (2,( element_parser, delimiter_parser )),-,-,    element_parser >> *(delimiter_parser >> element_parser)  )   // Parse an optional, comma separated list of uints with explicit post-skip.  BOOST_SPIRIT_RULE_PARSER(line,    -,-,-,    ! enumeration_parser(uint_literal,',')     >> lexeme_d[ !skipper ]  )  bool parse_line(char const * str)  {    return BOOST_SPIRIT_CLASSIC_NS::parse(str,line,skipper).full;  }  #undef BOOST_SPIRIT__NAMESPACE} } // namespace ::my_project::my_moduleint main(){  std::string str;  while (std::getline(std::cin, str))  {    if (str.empty())      break;    str += '\n';    if (my_project::my_module::parse_line(str.c_str()))      std::cout << "\nOK." << std::endl;    else      std::cout << "\nERROR." << std::endl;  }  return 0;}

⌨️ 快捷键说明

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