For Development HEAD DRAFTSearch (procedure/syntax/module):

12.75 text.parse - 入力ストリームのパージング

Module: text.parse

入力ポートに対して単純な解析を行うユーティリティのコレクションです。 API は Oleg Kiselyov 氏の入力解析ライブラリ (http://okmij.org/ftp/Scheme/parsing.html) に 触発され、互換性を持つものです。氏のライブラリは、他のたくさんの ライブラリで使われています。特に、Scheme のみで書かれたパーサ/ジェネレータ である SSAX (http://okmij.org/ftp/Scheme/xml.html) が挙げられます。

このモジュールは、氏の input-parse.scmlook-for-str.scm の代わりに使うことができます。

Gauche で効果的になるように手続きを再実装しました。特に、string-set! の使用は完全に取り除きました。インターフェースを少し拡張したので、 文字集合や述語、文字のリストにも使うことができます。

これらの手続きは、与えられた入力ポートに対してシーケンシャルに動作します。 それは、ポートから必要なだけ読み、余分な文字をバッファリングしないということです。

Function: find-string-from-port? str in-port :optional max-no-chars

{text.parse} 入力ポート in-port から、文字列 str を探します。 オプショナル引数 max-no-chars は、ポートから読み込まれる最大文字数を 制限します。省略されると、検索する範囲は EOF までとなります。

str が見つかると、手続きはすでに読み込んだ文字の数を返します。 in-port の次回の読み込みは、str の次の文字を返します。 str が見つからない場合、#f が返ります。

注意: この手続きはその名前に「?」がつきますが、Scheme の慣習に反し、 真偽値ではない値を返すことがあります。

Function: peek-next-char :optional port

{text.parse} 現在の文字を破棄し、port から次の文字を読みます。一文字先読みするのに 便利です。port が省略されると、現在の入力ポートが使われます。

以下の手続きでは、char-list は次のどれかを意味します。

これらにより文字の集合が表現されます。シンボル *eof* が含まれる場合、 EOF の条件もまた含まれます。*eof* が含まれない場合、EOF の条件は エラーとして扱われます。

Function: assert-curr-char char-list string :optional port

{text.parse} port から文字を読みます。その文字が char-list に含まれている場合は その文字を返します。そうでなければ、string を含むメッセージとともに エラーを通知します。

Function: skip-until char-list/number :optional port

{text.parse} char-list/number は、文字のリストか数です。 数の場合、たくさんの文字を読んで、#f を返します。 入力が十分に長くない場合は、エラーが通知されます。 char-list/number が文字のリストの場合、その文字リストに属する文字に 出会うまで port を読み込み、その文字を返します。 port が省略された場合、現在の入力ポートが使われます。

Function: skip-while char-list :optional port

{text.parse} char-list に属しない文字に出会うまで、port を読み込みます。 文字はストリームに残されます。EOF に達したら EOF が返されます。 port が省略された場合、現在の入力ポートが使われます。

この例では、入力から空白スペースをスキップしています。ポートからの次の 読み込みは、最初の空白スペースでない文字を返します。

(skip-while #[\s] port)
Function: next-token prefix-char-list break-char-list :optional comment port

{text.parse} prefix-char-list に含まれる文字はいくつでもスキップします。 そして、break-char-list に含まれる文字に出会うまで、文字を 蓄積します。蓄積された文字群は文字列として返されます。 中断文字は port に残されます。

手続きが EOF に達し、*eof*break-char-list に含まれていない 場合、comment が含まれたメッセージとともにエラーが通知されます。

Function: next-token-of char-list/pred :optional port

{text.parse} 読み込んだ文字が char-list/pred にある限り蓄積し、文字列として 返します。char-list/pred に含まれない最初の文字はポートに残されます。

char-list/pred は文字のリストか文字を取る述語です。述語の場合、 それぞれの文字がその述語に渡され、真の値が返る場合はその文字は char-list/pred に属するとみなされます。

Function: read-string n :optional port

{text.parse} 組み込みのread-string (データの読み込み参照) とほぼ同じですが、 入力が既にEOFに達していた場合は""を返します。

Olegのライブラリに依存しているコードの互換性のために用意されています。



For Development HEAD DRAFTSearch (procedure/syntax/module):
DRAFT