camlp4で四則演算。

30分プログラム、その183。camlp4で計算機をつくってみる。

いきなりcamlp4をバリバリつかうのは大変そうなので、まずはパーサ部分だけをつかって計算機を作ってみた。
これは、パーサとして使うのもありかもしれない。ただ、どうも字句解析器をつくるのがえらい面倒そうなんだよなぁ。

使い方

$ ./p4 "1+4*2"
9

$ ./p4 42
42

ソースコード

(* ocamlc -pp 'camlp4o pa_extend.cmo' -I +camlp4 gramlib.cma 183-p4.ml *)
let (@@) f g = f g
let ($) f g x = f (g x)

let gram = Grammar.gcreate @@ Plexer.gmake ()

let expr = Grammar.Entry.create gram "expr"

EXTEND
  expr:[
    "factor" LEFTA  [ x = expr; "+"; y = expr -> x + y 
                    | x = expr; "-"; y = expr -> x - y]
  | "term"   RIGHTA [ x = expr; "*"; y = expr -> x * y
                    | x = expr; "/"; y = expr -> x / y]
  | "simple" NONA   [ x = INT -> int_of_string x
                    | "("; e = expr; ")" -> e]
  ];
END

let _ = Printf.printf "%d\n" @@ Grammar.Entry.parse expr (Stream.of_string Sys.argv.(1))