1

次のような入力を解析するには、以下の文法が必要です

a_end
a_b_end
a_b_c_end

ただし、複数の があるものは解析しa_endて失敗するだけ_です。文法は次のとおりです。

template < typename Iterator >
struct recursive_parser : qi::grammar< Iterator >
{
    qi::rule< Iterator > start;
    qi::rule< Iterator > end;
    recursive_parser() : recursive_parser::base_type( start )
    {
        using namespace qi;
        end = string("_end") | start;
        start = +(char_ - '_') >> end;
    }
};

ルールは再帰的に使用するように設計されていませんか、それとももっと明白なものがありませんか?

4

1 に答える 1

3

あなたの文法と入力文字列a_b_endを使用して、次の解析が行われます。

In Start: consume "a". Iterate into end.
In End:   The next part of the string is not "_end", so the first alternative fails.
          Try the second alternative, which is to iterate into start.
In Start: The next character is a "_", so start fails.

したがって、文法は次のようになります。

end = string("end") | start;
start = +(char_ - '_') >> '_' >> end;
于 2012-09-07T14:40:08.417 に答える