OCamlのulexの使い方を教えてください
OCamlでUnicodeを扱うパーサを作る為にulexを使う事を考えています。
例えば、以下のような四則演算のパーサがあります。
parser.mly
%{
%}
%token <int> INT
%token ADD SUB MUL DIV EOF
%left ADD SUB
%left MUL DIV
%type <int> exp
%start exp
%%
exp:
| INT { $1 }
| exp ADD exp { $1 + $3 }
| exp SUB exp { $1 - $3 }
| exp MUL exp { $1 * $3 }
| exp DIV exp { $1 / $3 }
lexer.mll
{
open Parser
}
rule token = parse
| [' ' '\t' '\n' '\r']+ { token lexbuf }
| ['0'-'9']+ { INT(int_of_string (Lexing.lexeme lexbuf)) }
| '-' { SUB }
| '+' { ADD }
| '*' { MUL }
| eof { EOF }
| _ { assert false }
main.ml
let _ =
let lexbuf = Lexing.from_string "1+2*3" in
let result = Parser.exp Lexer.token lexbuf in
Printf.printf "%d\n" result
Makefile
main: parser.ml lexer.ml main.ml
ocamlfind ocamlc -package ulex parser.mli parser.ml lexer.ml main.ml -o main
parser.ml: parser.mly
ocamlyacc parser.mly
lexer.ml: lexer.mll
ocamllex lexer.mll
clean:
rm -rf *.cm* parser.ml lexer.ml main *.o
opamのリポジトリを検索したところ
./4.02.1/lib/ulex/ulexing.mli
./4.02.1/lib/ulex/utf8.mli
の2つが参考になりそうでした。
They need not work on a type named [lexbuf]: you can use the type
name you want. Then, just do in your ulex-processed source, before
the first lexer specification:[module Ulexing = L]
Of course, you'll probably want to define functions like [lexeme]
to be used in the lexers semantic actions.
と書いてあるのでlexer.mllにmodule Ulexing = L
と書くと良いようなので、、、。
lexer.mllを以下のように書き換えればコンパイルは通りました。
{
open Parser
module Ulexing = Lexing
}
rule token = parse
| [' ' '\t' '\n' '\r']+ { token lexbuf }
| ['0'-'9']+ { INT(int_of_string (Ulexing.lexeme lexbuf)) }
| '-' { SUB }
| '+' { ADD }
| '*' { MUL }
| eof { EOF }
| _ { assert false }
しかし、これでは単に名前を書き換えているだけに思えますし、LというLexerはありません。
このような使い方で良いのか良くわからないのと、やりたい事としては、ocamllex上でutf-8を扱えるようにしたいのですが、ulexのありがたみが良くわかりません。
https://twitter.com/takeisa/status/503531375127838720
Webで調べたところ上記のような事が書いてありました。
このあと自分で調べるとなると、mliの内容を翻訳してみればよいと思うのですが、分かりやすいサンプルなどがあれば教えてください。