src/Pure/Syntax/lexicon.ML
changeset 42476 d0bc1268ef09
parent 42290 b1f544c84040
child 43432 224006e5ac46
equal deleted inserted replaced
42475:f830a72b27ed 42476:d0bc1268ef09
     4 Lexer for the inner Isabelle syntax (terms and types).
     4 Lexer for the inner Isabelle syntax (terms and types).
     5 *)
     5 *)
     6 
     6 
     7 signature LEXICON =
     7 signature LEXICON =
     8 sig
     8 sig
       
     9   structure Syntax:
       
    10   sig
       
    11     val const: string -> term
       
    12     val free: string -> term
       
    13     val var: indexname -> term
       
    14   end
     9   val is_identifier: string -> bool
    15   val is_identifier: string -> bool
    10   val is_ascii_identifier: string -> bool
    16   val is_ascii_identifier: string -> bool
    11   val is_xid: string -> bool
    17   val is_xid: string -> bool
    12   val is_tid: string -> bool
    18   val is_tid: string -> bool
    13   val scan_id: Symbol_Pos.T list -> Symbol_Pos.T list * Symbol_Pos.T list
    19   val scan_id: Symbol_Pos.T list -> Symbol_Pos.T list * Symbol_Pos.T list
    45   val predef_term: string -> token option
    51   val predef_term: string -> token option
    46   val implode_xstr: string list -> string
    52   val implode_xstr: string list -> string
    47   val explode_xstr: string -> string list
    53   val explode_xstr: string -> string list
    48   val tokenize: Scan.lexicon -> bool -> Symbol_Pos.T list -> token list
    54   val tokenize: Scan.lexicon -> bool -> Symbol_Pos.T list -> token list
    49   val read_indexname: string -> indexname
    55   val read_indexname: string -> indexname
    50   val const: string -> term
       
    51   val free: string -> term
       
    52   val var: indexname -> term
       
    53   val read_var: string -> term
    56   val read_var: string -> term
    54   val read_variable: string -> indexname option
    57   val read_variable: string -> indexname option
    55   val read_nat: string -> int option
    58   val read_nat: string -> int option
    56   val read_int: string -> int option
    59   val read_int: string -> int option
    57   val read_xnum: string -> {radix: int, leading_zeros: int, value: int}
    60   val read_xnum: string -> {radix: int, leading_zeros: int, value: int}
    72 end;
    75 end;
    73 
    76 
    74 structure Lexicon: LEXICON =
    77 structure Lexicon: LEXICON =
    75 struct
    78 struct
    76 
    79 
       
    80 (** syntaxtic terms **)
       
    81 
       
    82 structure Syntax =
       
    83 struct
       
    84 
       
    85 fun const c = Const (c, dummyT);
       
    86 fun free x = Free (x, dummyT);
       
    87 fun var xi = Var (xi, dummyT);
       
    88 
       
    89 end;
       
    90 
       
    91 
       
    92 
    77 (** is_identifier etc. **)
    93 (** is_identifier etc. **)
    78 
    94 
    79 val is_identifier = Symbol.is_ident o Symbol.explode;
    95 val is_identifier = Symbol.is_ident o Symbol.explode;
    80 
    96 
    81 fun is_ascii_identifier s =
    97 fun is_ascii_identifier s =
   326   | _ => error ("Lexical error in variable name: " ^ quote s));
   342   | _ => error ("Lexical error in variable name: " ^ quote s));
   327 
   343 
   328 
   344 
   329 (* read_var *)
   345 (* read_var *)
   330 
   346 
   331 fun const c = Const (c, dummyT);
       
   332 fun free x = Free (x, dummyT);
       
   333 fun var xi = Var (xi, dummyT);
       
   334 
       
   335 fun read_var str =
   347 fun read_var str =
   336   let
   348   let
   337     val scan =
   349     val scan =
   338       $$$ "?" |-- scan_indexname --| Scan.ahead (Scan.one Symbol_Pos.is_eof) >> var ||
   350       $$$ "?" |-- scan_indexname --| Scan.ahead (Scan.one Symbol_Pos.is_eof)
   339       Scan.many (Symbol.is_regular o Symbol_Pos.symbol) >> (free o implode o map Symbol_Pos.symbol);
   351         >> Syntax.var ||
       
   352       Scan.many (Symbol.is_regular o Symbol_Pos.symbol)
       
   353         >> (Syntax.free o implode o map Symbol_Pos.symbol);
   340   in the (Scan.read Symbol_Pos.stopper scan (Symbol_Pos.explode (str, Position.none))) end;
   354   in the (Scan.read Symbol_Pos.stopper scan (Symbol_Pos.explode (str, Position.none))) end;
   341 
   355 
   342 
   356 
   343 (* read_variable *)
   357 (* read_variable *)
   344 
   358 
   446 
   460 
   447 val is_marked =
   461 val is_marked =
   448   unmark {case_class = K true, case_type = K true, case_const = K true,
   462   unmark {case_class = K true, case_type = K true, case_const = K true,
   449     case_fixed = K true, case_default = K false};
   463     case_fixed = K true, case_default = K false};
   450 
   464 
   451 val dummy_type = const (mark_type "dummy");
   465 val dummy_type = Syntax.const (mark_type "dummy");
   452 val fun_type = const (mark_type "fun");
   466 val fun_type = Syntax.const (mark_type "fun");
   453 
   467 
   454 end;
   468 end;