5 start_p : Lexing.position;
6 end_p : Lexing.position
17 let value { value = v } =
20 let position { position = p } =
32 let with_poss p1 p2 v =
33 with_pos { start_p = p1; end_p = p2 } v
38 position = v.position;
41 let iter f { value = v } =
45 let w1, w2 = f v.value in
46 let pos = v.position in
47 ({ value = w1; position = pos }, { value = w2; position = pos })
51 start_p = Lexing.dummy_pos;
52 end_p = Lexing.dummy_pos
61 let start_of_position p = p.start_p
63 let end_of_position p = p.end_p
65 let filename_of_position p =
66 p.start_p.Lexing.pos_fname
72 p.pos_cnum - p.pos_bol
74 let characters p1 p2 =
75 (column p1, p2.pos_cnum - p1.pos_bol) (* intentionally [p1.pos_bol] *)
79 start_p = if x1 = dummy then x2.start_p else x1.start_p;
80 end_p = if x2 = dummy then x1.end_p else x2.end_p
89 let join_located l1 l2 f =
91 value = f l1.value l2.value;
92 position = join l1.position l2.position;
95 let string_of_lex_pos p =
96 let c = p.pos_cnum - p.pos_bol in
97 (string_of_int p.pos_lnum)^":"^(string_of_int c)
100 let filename = filename_of_position p in
101 let l = line p.start_p in
102 let c1, c2 = characters p.start_p p.end_p in
103 if filename = "" then
104 Printf.sprintf "Line %d, characters %d-%d" l c1 c2
106 Printf.sprintf "File \"%s\", line %d, characters %d-%d" filename l c1 c2
108 let pos_or_undef = function
114 start_p = Lexing.lexeme_start_p lexbuf;
115 end_p = Lexing.lexeme_end_p lexbuf;
118 let with_cpos lexbuf v =
119 with_pos (cpos lexbuf) v
121 let string_of_cpos lexbuf =
122 string_of_pos (cpos lexbuf)
128 List.fold_left (fun p t -> join p (f t)) dummy
130 let join_located_list ls f =
132 value = f (List.map (fun l -> l.value) ls);
133 position = ljoinf (fun x -> x.position) ls