# HG changeset patch # User wenzelm # Date 1216588019 -7200 # Node ID 0987983216224c0559858f7e3d67ab25f8ae0f3f # Parent 34e7236443f3672d35a5fa4454ee4964a9a3e7aa maintain token range; diff -r 34e7236443f3 -r 098798321622 src/Pure/Isar/outer_lex.ML --- a/src/Pure/Isar/outer_lex.ML Sun Jul 20 23:06:58 2008 +0200 +++ b/src/Pure/Isar/outer_lex.ML Sun Jul 20 23:06:59 2008 +0200 @@ -15,6 +15,7 @@ val stopper: token * (token -> bool) val not_sync: token -> bool val not_eof: token -> bool + val range_of: token -> Position.range val position_of: token -> Position.T val pos_of: token -> string val kind_of: token -> token_kind @@ -59,7 +60,7 @@ Command | Keyword | Ident | LongIdent | SymIdent | Var | TypeIdent | TypeVar | Nat | String | AltString | Verbatim | Space | Comment | Malformed | Error of string | Sync | EOF; -datatype token = Token of Position.T * (token_kind * string); +datatype token = Token of Position.range * (token_kind * string); val str_of_kind = fn Command => "command" @@ -84,7 +85,7 @@ (* control tokens *) -val eof = Token (Position.none, (EOF, "")); +val eof = Token ((Position.none, Position.none), (EOF, "")); fun is_eof (Token (_, (EOF, _))) = true | is_eof _ = false; @@ -99,7 +100,9 @@ (* get position *) -fun position_of (Token (pos, _)) = pos; +fun range_of (Token (range, _)) = range; + +val position_of = #1 o range_of; val pos_of = Position.str_of o position_of; @@ -144,7 +147,6 @@ (* token content *) fun val_of (Token (_, (_, x))) = x; -fun token_leq (tok1, tok2) = val_of tok1 <= val_of tok2; fun escape q = implode o map (fn s => if s = q orelse s = "\\" then "\\" ^ s else s) o Symbol.explode; @@ -296,32 +298,31 @@ (* scan token *) +fun token_leq ((_, x1: string), (_, x2)) = x1 <= x2; + fun scan (lex1, lex2) = let - val scanner = Scan.state :|-- (fn pos => - let - fun token k x = Token (pos, (k, x)); - fun sync _ = token Sync Symbol.sync; - in - scan_string >> token String || - scan_alt_string >> token AltString || - scan_verbatim >> token Verbatim || - scan_comment >> token Comment || - counted scan_space >> token Space || - counted scan_malformed >> token Malformed || - Scan.lift (Scan.one Symbol.is_sync >> sync) || + val scanner = Scan.state -- + (scan_string >> pair String || + scan_alt_string >> pair AltString || + scan_verbatim >> pair Verbatim || + scan_comment >> pair Comment || + counted scan_space >> pair Space || + counted scan_malformed >> pair Malformed || + Scan.lift (Scan.one Symbol.is_sync >> K (Sync, Symbol.sync)) || (Scan.max token_leq (Scan.max token_leq - (counted (Scan.literal lex2) >> token Command) - (counted (Scan.literal lex1) >> token Keyword)) - (counted Syntax.scan_longid >> token LongIdent || - counted Syntax.scan_id >> token Ident || - counted Syntax.scan_var >> token Var || - counted Syntax.scan_tid >> token TypeIdent || - counted Syntax.scan_tvar >> token TypeVar || - counted Syntax.scan_nat >> token Nat || - counted scan_symid >> token SymIdent)) - end); + (counted (Scan.literal lex2) >> pair Command) + (counted (Scan.literal lex1) >> pair Keyword)) + (counted Syntax.scan_longid >> pair LongIdent || + counted Syntax.scan_id >> pair Ident || + counted Syntax.scan_var >> pair Var || + counted Syntax.scan_tid >> pair TypeIdent || + counted Syntax.scan_tvar >> pair TypeVar || + counted Syntax.scan_nat >> pair Nat || + counted scan_symid >> pair SymIdent))) -- Scan.state + >> (fn ((pos, (k, x)), pos') => Token ((pos, pos'), (k, x))); + in !! (lex_err (fn cs => "bad input " ^ quote (Symbol.beginning 10 cs))) scanner end; @@ -331,8 +332,8 @@ val is_junk = (not o Symbol.is_blank) andf Symbol.is_regular; -fun recover msg = Scan.state :|-- (fn pos => - counted (Scan.many is_junk) >> (fn s => [Token (pos, (Error msg, s))])); +fun recover msg = Scan.state -- counted (Scan.many is_junk) -- Scan.state + >> (fn ((pos, s), pos') => [Token ((pos, pos'), (Error msg, s))]); in