[天気:曇](会社・自宅)<労働900-1910>
『Rubyプログラミング入門』原 著、まつもと監修、オーム社 PP.330-332
「8.6.3 正規表現コンパイラ」について。
Rubyの組み込み正規表現に頼らず、自前でスキャナを書いてRegexというクラス
*1
を定義しようという話で、
文字からRegexオブジェクトを生成するRegexCompilerクラスを書くわけだが。
構文解析を、expr, sequence, term, factorといった要素に対応するメソッドが
下位要素のメソッドを呼び出しては値を返すという形で進めている。
ここで各メソッドが、lex&yaccを使った方法でいうところのlexが行うスキャンと
yaccが行う構文解析を一緒くたにしていると勘違いしてしまった。
つまり構文解析ルーチンが、次のソースを正規表現で切り出しては読んでいる、と。
実際は、コンストラクタの最初で文字列にscanメッセージを送って
トークン(文字列)の配列に分解し、各要素に対応する解析メソッドが
読み込んでいるのはこの配列から切り出したトークン文字列だったのだ。
正規表現コンパイラなので、切り出されたトークンも文字列として表現すれば
正規表現に見える。
なぁるほど。
@
そういえば:
hnfの場合、コマンド行と普通の行とでは、スペースの意味が違うので
文脈自由文法とはいえないのではないか。
*1: Ruby組み込みの正規表現のクラス名は``Regexp''。
朝食:苺ジャムつきトースト、ホットミルク
昼食:鶏の南蛮漬け@社食
夕食:いわしフライ、オクラのゴマ和え(既製惣菜)
4
[Web] 公開ntpサーバー
以上、1 日分です。