恐る恐る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 ¥Á¥å¡¼¥È¥ê¥¢¥ëを見て玉砕。

チュートリアルでこれですか… 何十年たったら使いこなせるのだろうか…