恐る恐るGenlexを触ってみる
どうもOCamlを弄くっていると、やれocamllexだのocamlyaccだの、しまいにはcamlp4だの恐ろしげなものの存在が見え隠れしてくる。
もういい大人だし怖がってばかりはいられないので、初心者にも優しそうなGenlexを触って見ることにした。
The core languageの1.8章を参考にする。途中「#load "camlp4o.cma"」とか出てくるけど、怖いので目をつぶってGenlexのところまで駆け抜ける。
雰囲気はつかめた。あと、S式パーサ - みずぴー日記のコードも参考にする。
let _ = let lexer = Genlex.make_lexer ["+"; "-"; "*"; "/"] in let stream = lexer (Stream.of_channel stdin) in let rec loop () = try ( let _ = match Stream.next stream with | Genlex.Kwd k -> Printf.printf "keyword => [%s] \n" k | Genlex.Int i -> Printf.printf "integer => [%d] \n" i | _ -> failwith "unexpected element. \n" in loop () ) with Stream.Failure -> print_endline "finish. \n" in loop ()
こんな感じのこじんまりしたサンプルを書いてみた。
mitsu@garlic$ ocaml test_genlex.ml 1 + 2 - 3 * 4 / 5 integer => [1] keyword => [+] integer => [2] keyword => [-] integer => [3] keyword => [*] integer => [4] keyword => [/] integer => [5] finish. mitsu@garlic$
おぉぉぉ。た、たのしいなぁ。こりは。
で、調子に乗って、Camlp4 ¥Á¥å¡¼¥È¥ê¥¢¥ëを見て玉砕。
チュートリアルでこれですか… 何十年たったら使いこなせるのだろうか…