src/Pure/General/symbol_pos.ML
changeset 61705 546e6494049f
parent 61502 760e21900b01
child 61707 d5ddd022a451
equal deleted inserted replaced
61704:3a010273df63 61705:546e6494049f
    12   val ~$$ : Symbol.symbol -> T list -> T * T list
    12   val ~$$ : Symbol.symbol -> T list -> T * T list
    13   val $$$ : Symbol.symbol -> T list -> T list * T list
    13   val $$$ : Symbol.symbol -> T list -> T list * T list
    14   val ~$$$ : Symbol.symbol -> T list -> T list * T list
    14   val ~$$$ : Symbol.symbol -> T list -> T list * T list
    15   val content: T list -> string
    15   val content: T list -> string
    16   val range: T list -> Position.range
    16   val range: T list -> Position.range
       
    17   val split_lines: T list -> T list list
    17   val trim_blanks: T list -> T list
    18   val trim_blanks: T list -> T list
       
    19   val trim_lines: T list -> T list
    18   val is_eof: T -> bool
    20   val is_eof: T -> bool
    19   val stopper: T Scan.stopper
    21   val stopper: T Scan.stopper
    20   val !!! : Scan.message -> (T list -> 'a) -> T list -> 'a
    22   val !!! : Scan.message -> (T list -> 'a) -> T list -> 'a
    21   val scan_pos: T list -> Position.T * T list
    23   val scan_pos: T list -> Position.T * T list
    22   val scan_string_q: string -> T list -> (Position.T * (T list * Position.T)) * T list
    24   val scan_string_q: string -> T list -> (Position.T * (T list * Position.T)) * T list
    58 fun range (syms as (_, pos) :: _) =
    60 fun range (syms as (_, pos) :: _) =
    59       let val pos' = List.last syms |-> Position.advance
    61       let val pos' = List.last syms |-> Position.advance
    60       in Position.range pos pos' end
    62       in Position.range pos pos' end
    61   | range [] = Position.no_range;
    63   | range [] = Position.no_range;
    62 
    64 
       
    65 
       
    66 (* lines and blanks *)
       
    67 
       
    68 fun split_lines [] = []
       
    69   | split_lines (list: T list) =
       
    70       let
       
    71         fun split syms =
       
    72           (case take_prefix (fn (s, _) => s <> "\n") syms of
       
    73             (line, []) => [line]
       
    74           | (line, nl :: rest) => line :: split rest);
       
    75       in split list end;
       
    76 
    63 val trim_blanks =
    77 val trim_blanks =
    64   take_prefix (Symbol.is_blank o symbol) #> #2 #>
    78   take_prefix (Symbol.is_blank o symbol) #> #2 #>
    65   take_suffix (Symbol.is_blank o symbol) #> #1;
    79   take_suffix (Symbol.is_blank o symbol) #> #1;
       
    80 
       
    81 val trim_lines =
       
    82   split_lines #> map trim_blanks #> separate [(Symbol.space, Position.none)] #> flat;
    66 
    83 
    67 
    84 
    68 (* stopper *)
    85 (* stopper *)
    69 
    86 
    70 fun mk_eof pos = (Symbol.eof, pos);
    87 fun mk_eof pos = (Symbol.eof, pos);