| ダイナミックパーサ |
![]() |
![]() |
![]() |
ダイナミックパーサは条件に応じて構文解析処理を調節できるようにする(allow to adjust)。 ダイナミックパーサの構築には条件引数と本体パーサ引数を要求する。 さらに引数を要求するパーサもある。
bool に変換可能な値を返す関数またはファンクタは条件として利用できる。 その関数/ファンクタの評価が真となった時、条件に適ったと考えられる。
同様に、パーサは条件として利用できる。 パーサがマッチする時、条件は適う。 条件として用いられるパーサは「全てか何も無し」という方針(all-or-nothing manner)で動作する: マッチしなかった場合、スキャナは先に進まない。
条件にあわなかったことによる失敗は構文解析エラーにはならない。
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_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は4つの引数を要求する。構文は以下の通り:
for_p(init, condition, step)[body-parser]
init と step は引数無しの関数/ファンクタでなければならない。for_p は次のような関数を返す:
![]() |
![]() |
![]() |
Copyright © 2002-2003 Joel de Guzman
Copyright © 2002-2003 Martin Wille
Permission to copy, use, modify, sell and distribute this document
is granted provided this copyright notice appears in all copies. This document
is provided "as is" without express or implied warranty, and with
no claim as to its suitability for any purpose.
Japanese Translation Copyright © 2003 Kent.N
オリジナルの、及びこの著作権表示が全ての複製の中に現れる限り、この文書の複製、利用、変更、販売そして配布を認める。このドキュメントは「あるがまま」に提供されており、いかなる明示的、暗黙的保証も行わない。また、いかなる目的に対しても、その利用が適していることを関知しない。
このドキュメントの対象: Boost Version 1.30.0
最新版ドキュメント(英語)