ダイナミックパーサ

ダイナミックパーサは条件に応じて構文解析処理を調節できるようにする(allow to adjust)。 ダイナミックパーサの構築には条件引数と本体パーサ引数を要求する。 さらに引数を要求するパーサもある。

条件

bool に変換可能な値を返す関数またはファンクタは条件として利用できる。 その関数/ファンクタの評価が真となった時、条件に適ったと考えられる。

同様に、パーサは条件として利用できる。 パーサがマッチする時、条件は適う。 条件として用いられるパーサは「全てか何も無し」という方針(all-or-nothing manner)で動作する: マッチしなかった場合、スキャナは先に進まない。

条件にあわなかったことによる失敗は構文解析エラーにはならない。

if_p

if_pは else 部と一緒に使うことも、単独で使うことも出来る。 構文は以下の通り:

    if_p(condition)[then-parser]

または

    if_p(condition)[then-parser].else_p[else-parser]

条件に適った時は、構文解析プロセスにおいてthen パーサが次に用いられる。 条件に適わない時で、またelseパーサが利用可能で有れば、 else パーサが次に用いられる。 条件に適わず else パーサもない場合、そのパーサ全体が空のシーケンスにマッチする ( 注意:古いバージョンの if_p は条件に合わず else パーサが利用できない場合は失敗を報告する)。

例:

    if_p("0x")[hex_p].else_p[uint_p]

while_p, do_p

while_pdo_p 構文は以下の通り:

    while_p(condition)[body-parser]
    do_p[body-parser].while_p(condition)

while_pによって構築されたdynamic parserは、条件に適う限り body パーサのマッチを試みる。 do_pの返すパーサは、bodyパーサのマッチを試みてからwhile_pが返したパーサと同様に振る舞う。 body パーサのマッチ失敗は、while/doパーサによって報告される失敗を引き起こす。

例:

    uint_p[assign(sum)] >> while_p('+')[uint_p(add(sum)]
    '"' >> while_p(~eps_p('"'))[c_escape_ch_p[append(result)]] >> '"'

for_p

for_pは4つの引数を要求する。構文は以下の通り:

    for_p(init, condition, step)[body-parser]

init と step は引数無しの関数/ファンクタでなければならない。for_p は次のような関数を返す:

  1. init を呼び出す
  2. 条件をチェックし、条件に合えばマッチを返す。
    マッチはこのポイントまで成功裏にマッチした全てを覆う。
  3. body パーサのマッチを試みる。
    body パーサのマッチ失敗はforパーサによって報告される失敗を引き起こす。
  4. step を呼び出す
  5. 2 へ進む


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