boost::spirit::ascii::space
これまで、標準/boost::spirit::ascii::space_type
スキッパーを使用してきた文法があります。
スキッパーを使用するルールと使用しないルールがあります。
qi::rule<Iterator, PTR<Expression>(), ascii::space_type> expression;
qi::rule<Iterator, PTR<Term>()> term;
term
スキップする非終端記号(like )の内部で非スキップの非終端記号(like)を使用するとexpression
、すべてが期待どおりに機能します。空白はterm
非終端記号の内部でのみ重要です。
さらに、これまでは、スキッパーを再確立するために使用しない非終端記号の内部にスキッパーを使用する非終端記号を含めても問題ありませんでしqi::skip
た。
index = (qi::lit('[') >> qi::skip(ascii::space)[explist >> qi::lit(']')]);
このように、空白は[]
中括弧の内側では重要ではありませんが、外側では重要です。
ただし、ここで、独自のカスタムスキッパーを追加します(改行を重要にし、後でコメントスキップを追加します)。私のスキッパー文法は次のようになります。
struct skip_grammar : qi::grammar<Iterator> {
qi::rule<Iterator> start;
skip_grammar() : skip_grammar::base_type(start) {
start = qi::char_("\t\r ");
}
};
私はそれを私のルール定義にうまく追加することができました
qi::rule<Iterator, PTR<Expression>(), skip_grammar> expression;
qi::skip
しかし、スキップ文法を引数として使用する方法(および置換する方法)を理解できないようですascii::space
。タイプ、ローカルインスタンス変数、およびグローバルインスタンス変数を使用してみました。私が得た最も遠いのは、私のskip_grammarにコピーコンストラクターが必要であるとclangに文句を言わせることです。そこで、スキップ文法にコピーコンストラクターを追加しようとしましたがboost::noncopyable
、バイナリsegfaultがほぼすぐに発生したため、基本クラスが存在するようです。
これをどのように使用すればよいですか?
ありがとう