文法を別の文法で再利用することは可能boost::spirit:qi
ですか (たとえば規則として)?
たとえば、テキスト行を住所を保持する構造に解析する文法を定義するとします。
template< typename iter >
struct address_grammar : qi::grammar< iter, address() >
{
...
qi::rule< iter, std::string() > street_name;
qi::rule< iter, std::string() > street_number;
qi::rule< iter, address() > address_;
}
その文法を他の 2 つの文法で再利用したい場合があります。たとえば、ファイルに格納されているアドレスのベクトルを解析する場合などです。別の再利用は、フィールドの 1 つがこの番地構造である、より複雑な構造である可能性があります。
template< typename iter >
struct company_grammar : qi::grammar< iter, company() >
{
...
qi::rule< iter, std::string() > comp_name;
// can I reuse the address grammar somehow here ???
qi::rule< iter, company() > company;
}
文法全体を 1 か所で定義する代わりに、再利用可能な小さなブロックに分割することを考えています。それらが 1 つのヘッダー ファイル内にあれば問題ありません。私のデータ構造は少し複雑です (struct 内のいくつかのフィールドと他の構造のリストなど) ので、1 つの文法にまとめたくありません。
boost::spirit::qi
このように文法を再利用することは可能ですか?
編集:考えてみるとqi::rule
、名前空間で s を定義してから、必要なルールから文法を組み立てるだけですか?