| 36 |
let cst_nil = mknoloc (Cst (Types.Atom Sequence.nil_atom)) |
let cst_nil = mknoloc (Cst (Types.Atom Sequence.nil_atom)) |
| 37 |
|
|
| 38 |
let seq_of_string pos s = |
let seq_of_string pos s = |
| 39 |
|
let s = Encodings.Utf8.mk s in |
| 40 |
|
(* What about locations when input file is not Utf8 ? *) |
| 41 |
let (pos,_) = pos in |
let (pos,_) = pos in |
| 42 |
let rec aux accu i = |
let rec aux pos i j = |
| 43 |
if (i = 0) |
if Encodings.Utf8.equal_index i j then [] |
| 44 |
then accu |
else |
| 45 |
else aux (((pos+i,pos+i+1),s.[i-1])::accu) (i-1) in |
let (c,i) = Encodings.Utf8.next s i in |
| 46 |
aux [] (String.length s) |
((pos,pos+1),c)::(aux (pos+1) i j) |
| 47 |
|
in |
| 48 |
|
aux pos (Encodings.Utf8.start_index s) (Encodings.Utf8.end_index s) |
| 49 |
|
|
| 50 |
exception Error of string |
exception Error of string |
| 51 |
let error (i,j) s = Location.raise_loc i j (Error s) |
let error (i,j) s = Location.raise_loc i j (Error s) |
| 54 |
LabelMap.from_list (fun _ _ -> error loc "Duplicated record field") r |
LabelMap.from_list (fun _ _ -> error loc "Duplicated record field") r |
| 55 |
|
|
| 56 |
let parse_char loc s = |
let parse_char loc s = |
| 57 |
(* TODO: Unicode *) |
let s = seq_of_string loc s in |
| 58 |
if String.length s <> 1 then |
match s with |
| 59 |
error loc "Character litteral must have length 1"; |
| [_,c] -> c |
| 60 |
s.[0] |
| _ -> error loc "Character litteral must have length 1" |
| 61 |
|
|
| 62 |
let char_list pos s = |
let char_list pos s = |
| 63 |
let s = seq_of_string pos s in |
let s = seq_of_string pos s in |
| 64 |
List.map (fun (loc,c) -> mk loc (Cst (Types.Char (Chars.mk_char c)))) s |
List.map (fun (loc,c) -> mk loc (Cst (Types.Char (Chars.mk_int c)))) s |
| 65 |
|
|
| 66 |
|
|
| 67 |
let include_stack = ref [] |
let include_stack = ref [] |
| 289 |
Elem (mk loc (Constant ((ident a,c)))) |
Elem (mk loc (Constant ((ident a,c)))) |
| 290 |
| UIDENT "PCDATA" -> string_regexp |
| UIDENT "PCDATA" -> string_regexp |
| 291 |
| i = STRING1; "--"; j = STRING1 -> |
| i = STRING1; "--"; j = STRING1 -> |
| 292 |
let i = Chars.mk_char (parse_char loc i) |
let i = Chars.mk_int (parse_char loc i) |
| 293 |
and j = Chars.mk_char (parse_char loc j) in |
and j = Chars.mk_int (parse_char loc j) in |
| 294 |
Elem (mk loc (Internal (Types.char (Chars.char_class i j)))) |
Elem (mk loc (Internal (Types.char (Chars.char_class i j)))) |
| 295 |
| s = STRING1 -> |
| s = STRING1 -> |
| 296 |
let s = seq_of_string loc s in |
let s = seq_of_string loc s in |
| 297 |
List.fold_right |
List.fold_right |
| 298 |
(fun (loc,c) accu -> |
(fun (loc,c) accu -> |
| 299 |
let c = Chars.mk_char c in |
let c = Chars.mk_int c in |
| 300 |
let c = Chars.atom c in |
let c = Chars.atom c in |
| 301 |
Seq (Elem (mk loc (Internal (Types.char c))), accu)) |
Seq (Elem (mk loc (Internal (Types.char c))), accu)) |
| 302 |
s |
s |
| 360 |
mk loc (Internal |
mk loc (Internal |
| 361 |
(Types.char |
(Types.char |
| 362 |
(Chars.atom |
(Chars.atom |
| 363 |
(Chars.mk_char c))))) s in |
(Chars.mk_int c))))) s in |
| 364 |
let s = s @ [mk loc (Internal (Sequence.nil_type))] in |
let s = s @ [mk loc (Internal (Sequence.nil_type))] in |
| 365 |
multi_prod loc s |
multi_prod loc s |
| 366 |
] |
] |
| 379 |
|
|
| 380 |
char: |
char: |
| 381 |
[ |
[ |
| 382 |
[ c = STRING1 -> Chars.mk_char (parse_char loc c) |
[ c = STRING1 -> Chars.mk_int (parse_char loc c) ] |
|
| "!"; i = INT -> Chars.mk_int (int_of_string i) ] |
|
| 383 |
]; |
]; |
| 384 |
|
|
| 385 |
|
|