/[svn]/parser/parser.ml
ViewVC logotype

Diff of /parser/parser.ml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 309 by abate, Tue Jul 10 17:20:36 2007 UTC revision 310 by abate, Tue Jul 10 17:24:12 2007 UTC
# Line 36  Line 36 
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)
# Line 50  Line 54 
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 []
# Line 285  Line 289 
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
# Line 356  Line 360 
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        ]        ]
# Line 375  Line 379 
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    

Legend:
Removed from v.309  
changed lines
  Added in v.310

CVS Admin">CVS Admin
ViewVC Help
Powered by ViewVC 1.1.5