home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / C / Applications / Moscow ML 1.42 / src / lex / Scan_aux.sml < prev    next >
Encoding:
Text File  |  1997-08-18  |  1.3 KB  |  59 lines  |  [TEXT/R*ch]

  1. (* Auxiliaries for the lexical analyzer *)
  2.  
  3. local
  4.   open Fnlib Lexing;
  5. in
  6.  
  7. val brace_depth = ref 0;
  8. val comment_depth = ref 0;
  9.  
  10. exception Lexical_error of string;
  11.  
  12. val initial_string_buffer = CharArray.array(256, #" ");
  13. val string_buff = ref initial_string_buffer;
  14. val string_index = ref 0;
  15.  
  16. fun reset_string_buffer () =
  17. (
  18.   string_buff := initial_string_buffer;
  19.   string_index := 0
  20. );
  21.  
  22. fun 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, si=0, len = NONE, 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.  
  37. fun get_stored_string () =
  38.   let val s = CharArray.extract(!string_buff, 0, SOME (!string_index)) in
  39.     string_buff := initial_string_buffer;
  40.     s
  41.   end
  42. ;
  43.  
  44. val char_for_backslash = fn
  45.     #"n" => #"\010" (* #"\n" *)
  46.   | #"t" => #"\009" (* #"\t" *)
  47.   | #"b" => #"\008" (* #"\b" *)
  48.   | #"r" => #"\013" (* #"\r" *)
  49.   | c   => c
  50. ;
  51.  
  52. fun char_for_decimal_code lexbuf i =
  53.   Char.chr(100 * (Char.ord(getLexemeChar lexbuf i) - 48) +
  54.             10 * (Char.ord(getLexemeChar lexbuf (i+1)) - 48) +
  55.                  (Char.ord(getLexemeChar lexbuf (i+2)) - 48))
  56. ;
  57.  
  58. end;
  59.