View on GitHub

boost_spirit_guide

コメント構文(Skipper)

spirit の設計には、コメントを透過的に処理できる機構が組み込まれています。
Skipper というものがそれで、パーサ・ディレクティブにも skip, no_skip といったものがあります。
通常の構文に対して、コメントとなる構文を柔軟に指定できるようになっています。

組込のSkipperとして、文字分類パーサが用意されています。
ns は、qi::standard, qi::standard_wide, qi::ascii, qi::iso8859_1 の何れかです。

文字分類 ルール コメント構文型  
ブランク ns::blank ns::blank_type  
スペース ns::space ns::space_type  

独自のコメント

通常の構文をコメント構文として利用できます。 Skipper に対する Skipper は無いので、template paramater の Skipper は省略します。
省略された場合は、qi::unused_type が適用されます。
コメントの属性は使用しないので、同様に qi::unused_type() で省略します。

C++ スタイルのコメント

C++: cpp_comment_grammar.hpp
#include <boost/spirit/include/qi.hpp>

template <typename Iterator>
struct cpp_comment_grammar : boost::spirit::qi::grammar<Iterator> {
public:
  cpp_comment_grammar() : cpp_comment_grammar::base_type(start) {
    namespace qi = boost::spirit::qi;
    start = qi::standard::space | comment_nest_p | comment_p;
    comment_nest_p = qi::lit("/*") > *(qi::standard::char_ - qi::lit("*/") - qi::eoi) > qi::lit("*/");
    comment_p = qi::lit("//") > *(qi::standard::char_ - qi::eol -qi::eoi) > (qi::eol | qi::eoi);
  }
  boost::spirit::qi::rule<Iterator> start;
  boost::spirit::qi::rule<Iterator> comment_nest_p;
  boost::spirit::qi::rule<Iterator> comment_p;
};

以下、独自のコメントを流用してみます。

C++: C++スタイルコメント利用例
#include <boost/spirit/include/qi.hpp>
#include <iostream>
#include <string>

#include "cpp_comment_grammar.hpp"

namespace qi = boost::spirit::qi;

template <typename Iterator, typename Skipper>
struct my_grammar : qi::grammar<Iterator, int(), Skipper> {
  qi::rule<Iterator, int(), Skipper>  start_;
  my_grammar() : my_grammar::base_type(start_, "my_grammar") {
    start_ = qi::int_;
  }
};

int main() {
  std::string input = "// これはコメントです。\n /* これもコメント */ 12345";
  int n;
  typedef c_comment_grammar<std::string::iterator> c_comment_type;
  c_comment_type comment;
  my_grammar<std::string::iterator, c_comment_type> myg;
  qi::phrase_parse( input.begin(), input.end(), myg, comment, n );
  std::cout << n << std::endl;
  return 0;
}