リファクタリングパーサ

現在のところ実装されたリファクタリングパーサには三種類あり、 共通するパーサのリファクタリング作業の抽象化を助けている。 パーサのリファクタリングとは、 具体的なパーサ構成は、他の非常によく似たパーサ構成に置き換えられ(リファクタリングされ)る。 ここで記述されているリファクタリングパーサのうち二つ( refactor_unary_parserrefactor_action_parser )は 、単純でより表現力豊かな表現を許すために コンフィクスパーサリストパーサで紹介されている。 第三のリファクタリングパーサ( attach_action_parser )は、 グループ化パーサで必要とされるいくつかの機能を抽象化するために実装されている。 しかしながら、これらのリファクタリングパーサは他の複雑な構文解析タスクの解決にも助けになるだろう。

単項パーサのリファクタリング

引数を一つ持つリファクタリングパーサを生成するのに用いられる refactor_unary_d パーサジェネレータは、以下の型の構成を変換する

    refactor_unary_d[*some_parser - another_parser]

to

    *(some_parser - another_parser)

ここで refactor_action_d はパーサジェネレータ構造体 refactor_unary_gen<> の定義済みオブジェクトである。

refactor_unary_d パーサジェネレータが上記の新しいパーサを生成するのは、元の構成が任意の二項パーサ(ここでは差パーサ)であり、かつその二項パーサの左オペランドが任意の単項パーサ(ここでは kleene star 演算子)である場合に限る。 もし元のパーサが二項パーサでない場合、コンパイル(compilation)は失敗する。もし左オペランドが単項パーサでない場合、リファクタリングは行われない。

アクションパーサのリファクタリング

アクションリファクタリングパーサを生成するのに用いられる refactor_action_d は、以下の型の構成を変換する

    refactor_action_d[some_parser[some_actor] - another_parser]

to

    (some_parser - another_parser)[some_actor]

ここで refactor_action_d はパーサジェネレータ構造体 refactor_action_gen<> の定義済みオブジェクトである。

refactor_action_d パーサジェネレータが上記のように新しいパーサを生成するのは、元の構成が任意の二項パーサ(ここでは差パーサ)であり、かつこの二項パーサの左オペランドが接続されたセマンティックアクションによって生成された任意のパーサである場合に限る。 もし元のパーサが二項パーサでない場合、コンパイルは失敗する。 左オペランドがアクションパーサでない場合、リファクタリングは行われない。

アクション接続のリファクタリング

アクション接続リファクタリングパーサを生成するのに用いられる attach_action_d パーサジェネレータは、以下の型の構成を変換する

    attach_action_d[(some_parser >> another_parser)[some_actor]]

to

    some_parser[some_actor] >> another_parser[some_actor]

ここで attach_action_d はパーサジェネレータ構造体 attach_action_gen<> の定義済みオブジェクトである。

attach_action_d が上記のような新しいパーサを生成するのは、 元の構成が任意のアクションパーサであり、かつこのアクションが接続しているパーサが任意の二項パーサ(ここではシーケンスパーサ)である場合に限る。 もし元のパーサがアクションパーサでない場合、コンパイルは失敗する。 そのアクションが接続しているパーサが二項パーサでない場合、リファクタリングは行われない。

リファクタリングのネスト

異なるタイプのリファクタリングをネストする必要が時々ある。例えば以下のような構成を

    (*some_parser)[some_actor] - another_parser

以下のように変換する場合である。

    (*(some_parser - another_parser))[some_actor]

このようにネストしたリファクタリングパーサの構成を単純化するため、 refactor_unary_gen<>refactor_action_gen<> はどちらも別のリファクタリングパーサジェネレータ型を各々のテンプレートパラメータとして取ることが出来る。 例えば、上記のネストした変換のためのリファクタリングパーサジェネレータは、次のように書くことが出来る:

    typedef refactor_action_gen<refactor_unary_gen<> > refactor_t;
    const refactor_t refactor_nested_d = refactor_t(refactor_unary_d);

これで以下のように必要な結果を得ることが出来る:

    refactor_nested_d[(*some_parser)[some_actor] - another_parser]

空のテンプレートパラメータは、この特定のリファクタリングパーサをネストしないことを意味する。 デフォルトテンプレートパラメータはネストを禁止するための定義済みヘルパ構造体 non_nesting_refactoring である。 時々、特定のリファクタリングパーサをそれ自身でネストする必要がある。 これは定義済みヘルパ構造体 self_nested_refactoring を対応するリファクタリングパーサジェネレータテンプレートのテンプレートパラメータとして与えることで成し遂げられる。



このドキュメントの対象: Boost Version 1.30.0
最新版ドキュメント(英語)