| 2 |
open Ast |
open Ast |
| 3 |
|
|
| 4 |
(* let () = Grammar.error_verbose := true *) |
(* let () = Grammar.error_verbose := true *) |
| 5 |
|
|
| 6 |
let gram = Grammar.gcreate (Lexer.gmake ()) |
let gram = Grammar.gcreate (Lexer.gmake ()) |
| 7 |
|
|
| 8 |
|
let gram = Grammar.gcreate (Wlexer.lexer Wlexer.token Wlexer.latin1_engine) |
| 9 |
|
|
| 10 |
|
|
| 11 |
let prog = Grammar.Entry.create gram "prog" |
let prog = Grammar.Entry.create gram "prog" |
| 12 |
let expr = Grammar.Entry.create gram "expression" |
let expr = Grammar.Entry.create gram "expression" |
| 13 |
let pat = Grammar.Entry.create gram "type/pattern expression" |
let pat = Grammar.Entry.create gram "type/pattern expression" |
| 37 |
else aux (((pos+i,pos+i+1),s.[i-1])::accu) (i-1) in |
else aux (((pos+i,pos+i+1),s.[i-1])::accu) (i-1) in |
| 38 |
aux [] (String.length s) |
aux [] (String.length s) |
| 39 |
|
|
| 40 |
|
exception Error of string |
| 41 |
|
let error loc s = raise (Location (loc, Error s)) |
| 42 |
|
|
| 43 |
|
let parse_char loc s = |
| 44 |
|
(* TODO: Unicode *) |
| 45 |
|
if String.length s <> 1 then |
| 46 |
|
error loc "Character litteral must have length 1"; |
| 47 |
|
s.[0] |
| 48 |
|
|
| 49 |
let char_list pos s = |
let char_list pos s = |
| 50 |
let s = seq_of_string pos (Token.eval_string s) in |
let s = seq_of_string pos s in |
| 51 |
List.map (fun (loc,c) -> mk loc (Cst (Types.Char (Chars.Unichar.from_char c)))) s |
List.map (fun (loc,c) -> mk loc (Cst (Types.Char (Chars.Unichar.from_char c)))) s |
| 52 |
|
|
| 53 |
|
|
| 62 |
[ (p,e) = let_binding -> LetDecl (p,e) |
[ (p,e) = let_binding -> LetDecl (p,e) |
| 63 |
| (p,e1) = let_binding; "in"; e2 = expr LEVEL "top"-> |
| (p,e1) = let_binding; "in"; e2 = expr LEVEL "top"-> |
| 64 |
EvalStatement (mk loc (Match (e1,[p,e2]))) |
EvalStatement (mk loc (Match (e1,[p,e2]))) |
| 65 |
| "type"; x = UIDENT; "="; t = pat -> TypeDecl (x,t) |
| LIDENT "type"; x = UIDENT; "="; t = pat -> TypeDecl (x,t) |
| 66 |
| "debug"; d = debug_directive -> Debug d |
| LIDENT "debug"; d = debug_directive -> Debug d |
| 67 |
] | |
] | |
| 68 |
[ e = expr -> EvalStatement e |
[ e = expr -> EvalStatement e |
| 69 |
] |
] |
| 85 |
(mk noloc (Capture "x"), |
(mk noloc (Capture "x"), |
| 86 |
mk noloc (Op ("raise",[mk noloc (Var "x")]))) in |
mk noloc (Op ("raise",[mk noloc (Var "x")]))) in |
| 87 |
mk loc (Try (e,b@[default])) |
mk loc (Try (e,b@[default])) |
| 88 |
| LIDENT "map"; e = SELF; "with"; b = branches -> mk loc (Map (e,b)) |
| "map"; e = SELF; "with"; b = branches -> mk loc (Map (e,b)) |
| 89 |
| "transform"; e = SELF; "with"; b = branches -> |
| "transform"; e = SELF; "with"; b = branches -> |
| 90 |
mk noloc (Op ("flatten", [mk loc (Map (e,b))])) |
mk noloc (Op ("flatten", [mk loc (Map (e,b))])) |
| 91 |
| "fun"; (f,a,b) = fun_decl -> |
| "fun"; (f,a,b) = fun_decl -> |
| 126 |
let e = match e with Some e -> e | None -> cst_nil in |
let e = match e with Some e -> e | None -> cst_nil in |
| 127 |
let l = List.flatten l in |
let l = List.flatten l in |
| 128 |
tuple loc (l @ [e]) |
tuple loc (l @ [e]) |
| 129 |
| "<"; t = expr_tag_spec; a = expr_attrib_spec; ">"; c = expr -> |
| t = [ a = TAG -> |
| 130 |
|
mk loc (Cst (Types.Atom (Types.AtomPool.mk a))) |
| 131 |
|
| "<"; e = expr LEVEL "no_appl" -> e ]; |
| 132 |
|
a = expr_attrib_spec; ">"; c = expr -> |
| 133 |
tuple loc [t;a;c] |
tuple loc [t;a;c] |
| 134 |
| "{"; r = [ expr_record_spec | -> mk loc (RecordLitt []) ]; "}" -> r |
| "{"; r = [ expr_record_spec | -> mk loc (RecordLitt []) ]; "}" -> r |
| 135 |
| s = STRING -> |
| s = STRING2 -> |
| 136 |
tuple loc (char_list loc s @ [cst_nil]) |
tuple loc (char_list loc s @ [cst_nil]) |
| 137 |
| "!"; t = pat -> mk loc (DebugTyper t) |
| "!"; t = pat -> mk loc (DebugTyper t) |
| 138 |
| a = LIDENT -> mk loc (Var a) |
| a = LIDENT -> mk loc (Var a) |
| 141 |
]; |
]; |
| 142 |
|
|
| 143 |
seq_elem: [ |
seq_elem: [ |
| 144 |
[ x = CHAR -> char_list loc x |
[ x = STRING1 -> char_list loc x |
| 145 |
| e = expr LEVEL "no_appl" -> [e] |
| e = expr LEVEL "no_appl" -> [e] |
| 146 |
] |
] |
| 147 |
]; |
]; |
| 176 |
]; |
]; |
| 177 |
|
|
| 178 |
branches: [ |
branches: [ |
| 179 |
[ OPT "|"; l = LIST1 branch SEP "|" ; OPT "end" -> l ] |
[ OPT "|"; l = LIST1 branch SEP "|" -> l ] |
| 180 |
]; |
]; |
| 181 |
|
|
| 182 |
branch: [ |
branch: [ |
| 196 |
| x = regexp; "??" -> Alt (Epsilon, x) ] |
| x = regexp; "??" -> Alt (Epsilon, x) ] |
| 197 |
| [ "("; x = regexp; ")" -> x |
| [ "("; x = regexp; ")" -> x |
| 198 |
| UIDENT "PCDATA" -> string_regexp |
| UIDENT "PCDATA" -> string_regexp |
| 199 |
| i = CHAR ; "--"; j = CHAR -> |
| i = STRING1; "--"; j = STRING1 -> |
| 200 |
let i = Chars.Unichar.from_char (Token.eval_char i) |
let i = Chars.Unichar.from_char (parse_char loc i) |
| 201 |
and j = Chars.Unichar.from_char (Token.eval_char j) in |
and j = Chars.Unichar.from_char (parse_char loc j) in |
| 202 |
Elem (mk loc (Internal (Types.char (Chars.char_class i j)))) |
Elem (mk loc (Internal (Types.char (Chars.char_class i j)))) |
| 203 |
| s = CHAR -> |
| s = STRING1 -> |
| 204 |
let s = seq_of_string loc (Token.eval_string s) in |
let s = seq_of_string loc s in |
| 205 |
List.fold_right |
List.fold_right |
| 206 |
(fun (loc,c) accu -> |
(fun (loc,c) accu -> |
| 207 |
let c = Chars.Unichar.from_char c in |
let c = Chars.Unichar.from_char c in |
| 235 |
| i = INT -> |
| i = INT -> |
| 236 |
let i = Big_int.big_int_of_string i in |
let i = Big_int.big_int_of_string i in |
| 237 |
mk loc (Internal (Types.interval (Intervals.atom i))) |
mk loc (Internal (Types.interval (Intervals.atom i))) |
| 238 |
| "*--"; j = INT -> |
| "*"; "--"; j = INT -> |
| 239 |
let j = Big_int.big_int_of_string j in |
let j = Big_int.big_int_of_string j in |
| 240 |
mk loc (Internal (Types.interval (Intervals.left j))) |
mk loc (Internal (Types.interval (Intervals.left j))) |
| 241 |
| i = INT; "--*" -> |
| i = INT; "--"; "*" -> |
| 242 |
let i = Big_int.big_int_of_string i in |
let i = Big_int.big_int_of_string i in |
| 243 |
mk loc (Internal (Types.interval (Intervals.right i))) |
mk loc (Internal (Types.interval (Intervals.right i))) |
| 244 |
| i = char -> |
| i = char -> |
| 251 |
q = [ ";"; q = pat -> q |
q = [ ";"; q = pat -> q |
| 252 |
| -> mk noloc (Internal (Sequence.nil_type)) ]; |
| -> mk noloc (Internal (Sequence.nil_type)) ]; |
| 253 |
"]" -> mk loc (Regexp (r,q)) |
"]" -> mk loc (Regexp (r,q)) |
| 254 |
| "<"; t = tag_spec; a = attrib_spec; ">"; c = pat -> |
| t = [ |
| 255 |
|
[ "<"; LIDENT "_" -> mk loc (Internal (Types.atom (Atoms.any))) |
| 256 |
|
| a = TAG -> |
| 257 |
|
mk loc |
| 258 |
|
(Internal (Types.atom (Atoms.atom (Types.AtomPool.mk a)))) ] |
| 259 |
|
| [ "<"; t = pat -> t ] |
| 260 |
|
]; |
| 261 |
|
a = attrib_spec; ">"; c = pat -> |
| 262 |
multi_prod loc [t;a;c] |
multi_prod loc [t;a;c] |
| 263 |
| s = STRING -> |
| s = STRING2 -> |
| 264 |
let s = seq_of_string loc (Token.eval_string s) in |
let s = seq_of_string loc s in |
| 265 |
let s = List.map |
let s = List.map |
| 266 |
(fun (loc,c) -> |
(fun (loc,c) -> |
| 267 |
mk loc (Internal |
mk loc (Internal |
| 275 |
]; |
]; |
| 276 |
|
|
| 277 |
record_spec: |
record_spec: |
| 278 |
[ [ r = LIST0 [ l = [LIDENT | UIDENT]; |
[ [ r = LIST0 [ l = [LIDENT | UIDENT]; "="; |
| 279 |
o = ["=?" -> true | "=" -> false]; |
o = [ "?" -> true | -> false]; |
| 280 |
x = pat -> |
x = pat -> |
| 281 |
mk loc (Record (Types.LabelPool.mk l,o,x)) |
mk loc (Record (Types.LabelPool.mk l,o,x)) |
| 282 |
] SEP ";" -> |
] SEP ";" -> |
| 287 |
|
|
| 288 |
char: |
char: |
| 289 |
[ |
[ |
| 290 |
[ c = CHAR -> Chars.Unichar.from_char (Token.eval_char c) |
[ c = STRING1 -> Chars.Unichar.from_char (parse_char loc c) |
| 291 |
| "!"; i = INT -> Chars.Unichar.from_int (int_of_string i) ] |
| "!"; i = INT -> Chars.Unichar.from_int (int_of_string i) ] |
| 292 |
]; |
]; |
| 293 |
|
|
| 299 |
| c = char -> Types.Char c ] |
| c = char -> Types.Char c ] |
| 300 |
]; |
]; |
| 301 |
|
|
|
tag_spec: |
|
|
[ |
|
|
[ LIDENT "_" -> mk loc (Internal (Types.atom (Atoms.any))) ] |
|
|
| [ a = [LIDENT | UIDENT] -> |
|
|
mk loc (Internal (Types.atom (Atoms.atom (Types.AtomPool.mk a)))) ] |
|
|
| [ t = pat -> t ] |
|
|
]; |
|
| 302 |
|
|
| 303 |
attrib_spec: |
attrib_spec: |
| 304 |
[ [ r = record_spec -> r | "("; t = pat; ")" -> t ] ]; |
[ [ r = record_spec -> r | "("; t = pat; ")" -> t ] ]; |
| 311 |
mk loc (RecordLitt r) |
mk loc (RecordLitt r) |
| 312 |
] ]; |
] ]; |
| 313 |
|
|
|
expr_tag_spec: |
|
|
[ |
|
|
[ a = [LIDENT | UIDENT] -> |
|
|
mk loc (Cst (Types.Atom (Types.AtomPool.mk a))) ] |
|
|
| [ e = expr LEVEL "no_appl" -> e ] |
|
|
]; |
|
|
|
|
| 314 |
expr_attrib_spec: |
expr_attrib_spec: |
| 315 |
[ [ r = expr_record_spec -> r ] |
[ [ r = expr_record_spec -> r ] |
| 316 |
| [ e = expr LEVEL "no_appl" -> e |
| [ e = expr LEVEL "no_appl" -> e |
| 325 |
END |
END |
| 326 |
|
|
| 327 |
let pat = Grammar.Entry.parse pat |
let pat = Grammar.Entry.parse pat |
| 328 |
let expr = Grammar.Entry.parse expr |
and expr = Grammar.Entry.parse expr |
| 329 |
let prog = Grammar.Entry.parse prog |
and prog = Grammar.Entry.parse prog |
| 330 |
|
|
| 331 |
module From_string = struct |
module From_string = struct |
| 332 |
let pat s = Grammar.Entry.parse pat' (Stream.of_string s) |
let pat s = Grammar.Entry.parse pat' (Stream.of_string s) |