src/Pure/Syntax/lexicon.ML
changeset 27806 ece79c0597fe
parent 27800 df444ddeff56
child 27887 9f3fd48cf673
equal deleted inserted replaced
27805:2e533bcd1343 27806:ece79c0597fe
    39   include LEXICON0
    39   include LEXICON0
    40   val is_xid: string -> bool
    40   val is_xid: string -> bool
    41   datatype token_kind =
    41   datatype token_kind =
    42     Literal | IdentSy | LongIdentSy | VarSy | TFreeSy | TVarSy | NumSy | XNumSy | StrSy | EOF
    42     Literal | IdentSy | LongIdentSy | VarSy | TFreeSy | TVarSy | NumSy | XNumSy | StrSy | EOF
    43   datatype token = Token of token_kind * string * Position.range
    43   datatype token = Token of token_kind * string * Position.range
       
    44   val str_of_token: token -> string
       
    45   val pos_of_token: token -> Position.T
    44   val mk_eof: Position.T -> token
    46   val mk_eof: Position.T -> token
    45   val eof: token
    47   val eof: token
    46   val is_eof: token -> bool
    48   val is_eof: token -> bool
    47   val stopper: token Scan.stopper
    49   val stopper: token Scan.stopper
    48   val idT: typ
    50   val idT: typ
    50   val varT: typ
    52   val varT: typ
    51   val tidT: typ
    53   val tidT: typ
    52   val tvarT: typ
    54   val tvarT: typ
    53   val terminals: string list
    55   val terminals: string list
    54   val is_terminal: string -> bool
    56   val is_terminal: string -> bool
    55   val str_of_token: token -> string
       
    56   val pos_of_token: token -> string
       
    57   val display_token: token -> string
       
    58   val matching_tokens: token * token -> bool
    57   val matching_tokens: token * token -> bool
    59   val valued_token: token -> bool
    58   val valued_token: token -> bool
    60   val predef_term: string -> token option
    59   val predef_term: string -> token option
    61   val tokenize: Scan.lexicon -> bool -> SymbolPos.T list -> token list
    60   val tokenize: Scan.lexicon -> bool -> SymbolPos.T list -> token list
    62 end;
    61 end;
   109 
   108 
   110 datatype token_kind =
   109 datatype token_kind =
   111   Literal | IdentSy | LongIdentSy | VarSy | TFreeSy | TVarSy | NumSy | XNumSy | StrSy | EOF;
   110   Literal | IdentSy | LongIdentSy | VarSy | TFreeSy | TVarSy | NumSy | XNumSy | StrSy | EOF;
   112 
   111 
   113 datatype token = Token of token_kind * string * Position.range;
   112 datatype token = Token of token_kind * string * Position.range;
       
   113 
       
   114 fun str_of_token (Token (_, s, _)) = s;
       
   115 fun pos_of_token (Token (_, _, (pos, _))) = pos;
   114 
   116 
   115 
   117 
   116 (* stopper *)
   118 (* stopper *)
   117 
   119 
   118 fun mk_eof pos = Token (EOF, "", (pos, Position.none));
   120 fun mk_eof pos = Token (EOF, "", (pos, Position.none));
   133 val tidT = Type ("tid", []);
   135 val tidT = Type ("tid", []);
   134 val tvarT = Type ("tvar", []);
   136 val tvarT = Type ("tvar", []);
   135 
   137 
   136 val terminals = ["id", "longid", "var", "tid", "tvar", "num", "xnum", "xstr"];
   138 val terminals = ["id", "longid", "var", "tid", "tvar", "num", "xnum", "xstr"];
   137 val is_terminal = member (op =) terminals;
   139 val is_terminal = member (op =) terminals;
   138 
       
   139 
       
   140 (* str_of_token *)
       
   141 
       
   142 fun str_of_token (Token (_, s, _)) = s;
       
   143 
       
   144 fun pos_of_token (Token (_, _, (pos, _))) = Position.str_of pos;
       
   145 
       
   146 
       
   147 (* display_token *)
       
   148 
       
   149 fun display_token (Token (Literal, s, _)) = quote s
       
   150   | display_token (Token (IdentSy, s, _)) = "id(" ^ s ^ ")"
       
   151   | display_token (Token (LongIdentSy, s, _)) = "longid(" ^ s ^ ")"
       
   152   | display_token (Token (VarSy, s, _)) = "var(" ^ s ^ ")"
       
   153   | display_token (Token (TFreeSy, s, _)) = "tid(" ^ s ^ ")"
       
   154   | display_token (Token (TVarSy, s, _)) = "tvar(" ^ s ^ ")"
       
   155   | display_token (Token (NumSy, s, _)) = "num(" ^ s ^ ")"
       
   156   | display_token (Token (XNumSy, s, _)) = "xnum(" ^ s ^ ")"
       
   157   | display_token (Token (StrSy, s, _)) = "xstr(" ^ s ^ ")"
       
   158   | display_token (Token (EOF, _, _)) = "";
       
   159 
   140 
   160 
   141 
   161 (* matching_tokens *)
   142 (* matching_tokens *)
   162 
   143 
   163 fun matching_tokens (Token (Literal, x, _), Token (Literal, y, _)) = x = y
   144 fun matching_tokens (Token (Literal, x, _), Token (Literal, y, _)) = x = y
   204 
   185 
   205 fun explode_xstr str =
   186 fun explode_xstr str =
   206   (case Scan.read SymbolPos.stopper scan_str_body (SymbolPos.explode (str, Position.none)) of
   187   (case Scan.read SymbolPos.stopper scan_str_body (SymbolPos.explode (str, Position.none)) of
   207     SOME cs => map symbol cs
   188     SOME cs => map symbol cs
   208   | _ => error ("Inner lexical error: literal string expected at " ^ quote str));
   189   | _ => error ("Inner lexical error: literal string expected at " ^ quote str));
       
   190 
   209 
   191 
   210 
   192 
   211 (** tokenize **)
   193 (** tokenize **)
   212 
   194 
   213 fun token_leq (Token (_, s1, _), Token (_, s2, _)) = s1 <= s2;
   195 fun token_leq (Token (_, s1, _), Token (_, s2, _)) = s1 <= s2;