libs/spirit/repository/example/qi/confix.cpp
// Copyright (c) 2009 Chris Hoeppler
//
// 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)
// The purpose of this example is to demonstrate different use cases for the
// confix directive.
#include <iostream>
#include <string>
#include <vector>
//[qi_confix_includes
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/repository/include/qi_confix.hpp>
//]
namespace client {
//[qi_confix_using
using boost::spirit::eol;
using boost::spirit::lexeme;
using boost::spirit::ascii::alnum;
using boost::spirit::ascii::char_;
using boost::spirit::ascii::space;
using boost::spirit::qi::parse;
using boost::spirit::qi::phrase_parse;
using boost::spirit::repository::confix;
//]
//[qi_confix_cpp_comment
template <typename Iterator>
bool parse_cpp_comment(Iterator first, Iterator last, std::string& attr)
{
bool r = parse(first, last,
confix("//", eol)[*(char_ - eol)], // grammar
attr); // attribute
if (!r || first != last) // fail if we did not get a full match
return false;
return r;
}
//]
//[qi_confix_c_comment
template <typename Iterator>
bool parse_c_comment(Iterator first, Iterator last, std::string& attr)
{
bool r = parse(first, last,
confix("/*", "*/")[*(char_ - "*/")], // grammar
attr); // attribute
if (!r || first != last) // fail if we did not get a full match
return false;
return r;
}
//]
//[qi_confix_tagged_data
template <typename Iterator>
bool parse_tagged(Iterator first, Iterator last, std::string& attr)
{
bool r = phrase_parse(first, last,
confix("<b>", "</b>")[lexeme[*(char_ - '<')]], // grammar
space, // skip
attr); // attribute
if (!r || first != last) // fail if we did not get a full match
return false;
return r;
}
//]
}
int main()
{
// C++ comment
std::string comment("// This is a comment\n");
std::string attr;
bool r = client::parse_cpp_comment(comment.begin(), comment.end(), attr);
std::cout << "Parsing a C++ comment";
if (r && attr == " This is a comment")
std::cout << " succeeded." << std::endl;
else
std::cout << " failed" << std::endl;
// C comment
comment = "/* This is another comment */";
attr.clear();
r = client::parse_c_comment(comment.begin(), comment.end(), attr);
std::cout << "Parsing a C comment";
if (r && attr == " This is another comment ")
std::cout << " succeeded." << std::endl;
else
std::cout << " failed" << std::endl;
// Tagged data
std::string data = "<b> This is the body. </b>";
attr.clear();
r = client::parse_tagged(data.begin(), data.end(), attr);
std::cout << "Parsing tagged data";
if (r && attr == "This is the body. ")
std::cout << " succeeded." << std::endl;
else
std::cout << " failed" << std::endl;
return 0;
}