src/Pure/Syntax/lexicon.ML
changeset 55033 8e8243975860
parent 54732 b01bb3d09928
child 55035 68afbb5ce4ff
equal deleted inserted replaced
55032:b49366215417 55033:8e8243975860
    23   val scan_var: Symbol_Pos.T list -> Symbol_Pos.T list * Symbol_Pos.T list
    23   val scan_var: Symbol_Pos.T list -> Symbol_Pos.T list * Symbol_Pos.T list
    24   val scan_tvar: Symbol_Pos.T list -> Symbol_Pos.T list * Symbol_Pos.T list
    24   val scan_tvar: Symbol_Pos.T list -> Symbol_Pos.T list * Symbol_Pos.T list
    25   val is_tid: string -> bool
    25   val is_tid: string -> bool
    26   datatype token_kind =
    26   datatype token_kind =
    27     Literal | IdentSy | LongIdentSy | VarSy | TFreeSy | TVarSy |
    27     Literal | IdentSy | LongIdentSy | VarSy | TFreeSy | TVarSy |
    28     NumSy | FloatSy | XNumSy | StrSy | Space | Comment | EOF
    28     NumSy | FloatSy | XNumSy | StrSy | Cartouche | Space | Comment | EOF
    29   datatype token = Token of token_kind * string * Position.range
    29   datatype token = Token of token_kind * string * Position.range
    30   val str_of_token: token -> string
    30   val str_of_token: token -> string
    31   val pos_of_token: token -> Position.T
    31   val pos_of_token: token -> Position.T
    32   val is_proper: token -> bool
    32   val is_proper: token -> bool
    33   val mk_eof: Position.T -> token
    33   val mk_eof: Position.T -> token
   118 
   118 
   119 (** datatype token **)
   119 (** datatype token **)
   120 
   120 
   121 datatype token_kind =
   121 datatype token_kind =
   122   Literal | IdentSy | LongIdentSy | VarSy | TFreeSy | TVarSy |
   122   Literal | IdentSy | LongIdentSy | VarSy | TFreeSy | TVarSy |
   123   NumSy | FloatSy | XNumSy | StrSy | Space | Comment | EOF;
   123   NumSy | FloatSy | XNumSy | StrSy | Cartouche | Space | Comment | EOF;
   124 
   124 
   125 datatype token = Token of token_kind * string * Position.range;
   125 datatype token = Token of token_kind * string * Position.range;
   126 
   126 
   127 fun str_of_token (Token (_, s, _)) = s;
   127 fun str_of_token (Token (_, s, _)) = s;
   128 fun pos_of_token (Token (_, _, (pos, _))) = pos;
   128 fun pos_of_token (Token (_, _, (pos, _))) = pos;
   158   ("tid", TFreeSy),
   158   ("tid", TFreeSy),
   159   ("tvar", TVarSy),
   159   ("tvar", TVarSy),
   160   ("num_token", NumSy),
   160   ("num_token", NumSy),
   161   ("float_token", FloatSy),
   161   ("float_token", FloatSy),
   162   ("xnum_token", XNumSy),
   162   ("xnum_token", XNumSy),
   163   ("str_token", StrSy)];
   163   ("str_token", StrSy),
       
   164   ("cartouche", Cartouche)];
   164 
   165 
   165 val terminals = map #1 terminal_kinds;
   166 val terminals = map #1 terminal_kinds;
   166 val is_terminal = member (op =) terminals;
   167 val is_terminal = member (op =) terminals;
   167 
   168 
   168 
   169 
   173   then Markup.literal
   174   then Markup.literal
   174   else Markup.delimiter;
   175   else Markup.delimiter;
   175 
   176 
   176 val token_kind_markup =
   177 val token_kind_markup =
   177  fn TFreeSy => Markup.tfree
   178  fn TFreeSy => Markup.tfree
   178   | TVarSy  => Markup.tvar
   179   | TVarSy => Markup.tvar
   179   | NumSy   => Markup.numeral
   180   | NumSy => Markup.numeral
   180   | FloatSy => Markup.numeral
   181   | FloatSy => Markup.numeral
   181   | XNumSy  => Markup.numeral
   182   | XNumSy => Markup.numeral
   182   | StrSy   => Markup.inner_string
   183   | StrSy => Markup.inner_string
       
   184   | Cartouche => Markup.inner_cartouche
   183   | Comment => Markup.inner_comment
   185   | Comment => Markup.inner_comment
   184   | _       => Markup.empty;
   186   | _ => Markup.empty;
   185 
   187 
   186 fun report_of_token (Token (kind, s, (pos, _))) =
   188 fun report_of_token (Token (kind, s, (pos, _))) =
   187   let val markup = if kind = Literal then literal_markup s else token_kind_markup kind
   189   let val markup = if kind = Literal then literal_markup s else token_kind_markup kind
   188   in (pos, markup) end;
   190   in (pos, markup) end;
   189 
   191 
   265       scan_xid >> token IdentSy;
   267       scan_xid >> token IdentSy;
   266 
   268 
   267     val scan_lit = Scan.literal lex >> token Literal;
   269     val scan_lit = Scan.literal lex >> token Literal;
   268 
   270 
   269     val scan_token =
   271     val scan_token =
       
   272       Symbol_Pos.scan_cartouche !!! >> token Cartouche ||
   270       Symbol_Pos.scan_comment !!! >> token Comment ||
   273       Symbol_Pos.scan_comment !!! >> token Comment ||
   271       Scan.max token_leq scan_lit scan_val ||
   274       Scan.max token_leq scan_lit scan_val ||
   272       scan_str >> token StrSy ||
   275       scan_str >> token StrSy ||
   273       Scan.many1 (Symbol.is_blank o Symbol_Pos.symbol) >> token Space;
   276       Scan.many1 (Symbol.is_blank o Symbol_Pos.symbol) >> token Space;
   274   in
   277   in