+{
+ module S = String
+
+ module O = Options
+ module TP = TextParser
+
+ let out s = if !O.debug_lexer then prerr_endline s
+}
+
+let SPC = ['\r' '\n' '\t' ' ']+
+let QT = "\""
+let NUM = ['0'-'9']+
+
+rule token = parse
+ | SPC { token lexbuf }
+ | QT { let s = str lexbuf in
+ out s; TP.TEXT s }
+ | NUM as s { out s; TP.NUM (int_of_string s) }
+ | "(*" { block lexbuf; token lexbuf }
+ | "{" { out "{"; TP.OC }
+ | "}" { out "}"; TP.CC }
+ | "[" { out "["; TP.OB }
+ | "]" { out "]"; TP.CB }
+ | "*" { out "*"; TP.SR }
+ | "^" { out "^"; TP.CF }
+ | "+" { out "+"; TP.PS }
+ | "(" { out "("; TP.OP }
+ | ")" { out ")"; TP.CP }
+ | "@" { out ")"; TP.AT }
+ | "space" { out "space"; TP.SPACE }
+ | "name" { out "name"; TP.NAME }
+ | "table" { out "table"; TP.TABLE }
+ | "class" { out "class"; TP.CSS }
+ | "uri" { out "uri"; TP.URI }
+ | "ext" { out "ext"; TP.EXT }
+ | eof { TP.EOF }
+and str = parse
+ | QT { "" }
+ | "\\\\" { "\\" ^ str lexbuf }
+ | "\\\"" { "\"" ^ str lexbuf }
+ | _ as c { S.make 1 c ^ str lexbuf }
+and block = parse
+ | "*)" { () }
+ | "(*" { block lexbuf; block lexbuf }
+ | QT { let _ = str lexbuf in
+ block lexbuf }
+ | _ { block lexbuf }