2

私は最近、boost::spirit::qi をいじっていて、解析する独自の (非常に単純な) スクリプト言語を書こうとしています。スクリプトの if ステートメントに到達するときに問題が発生しました。関数呼び出しが true に戻った場合、入力の一部をスキップするパーサーが必要です。

たとえば、変数名 (a-zA-Z_) を受け入れるように定義されたトークンと、">" または "<" を受け入れるように設定された比較があります。コードの例を以下に示します。

comparison_statement = token >> comparison >> token;
statement            = lit("if ") >> comparison_statement[&compare] >> "then";

qi::phrase_parse(first, last, script, space);  // This call the parser

関数compareがtrueに戻った場合、次のセクションをスキップするにはどうすればよいですか?

4

1 に答える 1

3

パーサー内の条件は、 Epsilon Parserを使用して記述できます。これにより、指定した関数が呼び出され、その関数が false を返す場合、その特定のチェックに失敗し、次の or に進みます。

例えば:

qi::rule<Iterator, std::string(), ascii::space_type> rool;
rool = a | b | eps(f) | d
于 2011-12-20T04:22:12.770 に答える