1(* Auxiliaries for the lexical analyzer *) 2 3local 4 open Fnlib Lexing; 5in 6 7val brace_depth = ref 0; 8val comment_depth = ref 0; 9 10exception Lexical_error of string; 11 12val initial_string_buffer = CharArray.array(256, #" "); 13val string_buff = ref initial_string_buffer; 14val string_index = ref 0; 15 16fun reset_string_buffer () = 17( 18 string_buff := initial_string_buffer; 19 string_index := 0 20); 21 22fun store_string_char c = 23 let open CharArray 24 val len = length (!string_buff) 25 in 26 if !string_index >= len then 27 let val new_buff = array(len * 2, #" ") in 28 copy { src= !string_buff, dst= new_buff, di=0 }; 29 string_buff := new_buff 30 end 31 else (); 32 update(!string_buff, !string_index, c); 33 incr string_index 34 end 35; 36 37fun get_stored_string () = 38 let open CharArraySlice 39 val s = vector(slice(!string_buff, 0, SOME (!string_index))) 40 in 41 string_buff := initial_string_buffer; 42 s 43 end; 44 45val char_for_backslash = fn 46 #"n" => #"\010" (* #"\n" *) 47 | #"t" => #"\009" (* #"\t" *) 48 | #"b" => #"\008" (* #"\b" *) 49 | #"r" => #"\013" (* #"\r" *) 50 | c => c 51; 52 53fun char_for_decimal_code lexbuf i = 54 Char.chr(100 * (Char.ord(getLexemeChar lexbuf i) - 48) + 55 10 * (Char.ord(getLexemeChar lexbuf (i+1)) - 48) + 56 (Char.ord(getLexemeChar lexbuf (i+2)) - 48)) 57; 58 59end; 60