src/Pure/Syntax/syntax.ML
changeset 556 3f5f42467717
parent 383 fcea89074e4c
child 624 33b9b5da3e6f
equal deleted inserted replaced
555:a7f397a14b16 556:3f5f42467717
     3     Author:     Tobias Nipkow and Markus Wenzel, TU Muenchen
     3     Author:     Tobias Nipkow and Markus Wenzel, TU Muenchen
     4 
     4 
     5 Root of Isabelle's syntax module.
     5 Root of Isabelle's syntax module.
     6 *)
     6 *)
     7 
     7 
       
     8 infix |-> <-| <->;
       
     9 
     8 signature BASIC_SYNTAX =
    10 signature BASIC_SYNTAX =
     9 sig
    11 sig
    10   include AST0
    12   include AST0
    11   include SEXTENSION0
    13   include SYN_TRANS0
    12 (*  include MIXFIX0   *)   (* FIXME *)
    14   include MIXFIX0
    13   include PRINTER0
    15   include PRINTER0
       
    16   datatype xrule =
       
    17     op |-> of (string * string) * (string * string) |
       
    18     op <-| of (string * string) * (string * string) |
       
    19     op <-> of (string * string) * (string * string)
    14 end;
    20 end;
    15 
    21 
    16 signature SYNTAX =
    22 signature SYNTAX =
    17 sig
    23 sig
    18   include AST1
    24   include AST1
    19   include LEXICON0
    25   include LEXICON0
    20   include SYN_EXT0
    26   include SYN_EXT0
    21   include TYPE_EXT0
    27   include TYPE_EXT0
    22   include SEXTENSION1
    28   include SYN_TRANS1
       
    29   include MIXFIX1
    23   include PRINTER0
    30   include PRINTER0
    24   sharing type ast = Parser.SynExt.Ast.ast
    31   sharing type ast = Parser.SynExt.Ast.ast
    25   structure Mixfix: MIXFIX
    32   datatype xrule =
    26   local open Mixfix in    (* FIXME *)
    33     op |-> of (string * string) * (string * string) |
    27     type syntax
    34     op <-| of (string * string) * (string * string) |
    28     val extend_log_types: syntax -> string list -> syntax
    35     op <-> of (string * string) * (string * string)
    29     val extend_type_gram: syntax -> (string * int * mixfix) list -> syntax
    36   type syntax
    30     val extend_const_gram: syntax -> (string * typ * mixfix) list -> syntax
    37   val extend_log_types: syntax -> string list -> syntax
    31     val extend_consts: syntax -> string list -> syntax
    38   val extend_type_gram: syntax -> (string * int * mixfix) list -> syntax
    32     val extend_trfuns: syntax ->
    39   val extend_const_gram: syntax -> (string * typ * mixfix) list -> syntax
    33       (string * (ast list -> ast)) list *
    40   val extend_consts: syntax -> string list -> syntax
    34       (string * (term list -> term)) list *
    41   val extend_trfuns: syntax ->
    35       (string * (term list -> term)) list *
    42     (string * (ast list -> ast)) list *
    36       (string * (ast list -> ast)) list -> syntax
    43     (string * (term list -> term)) list *
    37     val extend_trrules: syntax -> xrule list -> syntax
    44     (string * (term list -> term)) list *
    38   end  (* FIXME *)
    45     (string * (ast list -> ast)) list -> syntax
    39     val extend: syntax -> (string -> typ) -> string list * string list * sext
    46   val extend_trrules: syntax -> xrule list -> syntax
    40       -> syntax     (* FIXME *)
    47   val merge_syntaxes: syntax -> syntax -> syntax
    41     val merge_syntaxes: syntax -> syntax -> syntax
    48   val type_syn: syntax
    42     val type_syn: syntax
    49   val print_gram: syntax -> unit
    43     val print_gram: syntax -> unit
    50   val print_trans: syntax -> unit
    44     val print_trans: syntax -> unit
    51   val print_syntax: syntax -> unit
    45     val print_syntax: syntax -> unit
    52   val test_read: syntax -> string -> string -> unit
    46     val test_read: syntax -> string -> string -> unit
    53   val read: syntax -> typ -> string -> term
    47     val read: syntax -> typ -> string -> term
    54   val read_typ: syntax -> (indexname -> sort) -> string -> typ
    48     val read_typ: syntax -> (indexname -> sort) -> string -> typ
    55   val simple_read_typ: string -> typ
    49     val simple_read_typ: string -> typ
    56   val pretty_term: syntax -> term -> Pretty.T
    50     val pretty_term: syntax -> term -> Pretty.T
    57   val pretty_typ: syntax -> typ -> Pretty.T
    51     val pretty_typ: syntax -> typ -> Pretty.T
    58   val string_of_term: syntax -> term -> string
    52     val string_of_term: syntax -> term -> string
    59   val string_of_typ: syntax -> typ -> string
    53     val string_of_typ: syntax -> typ -> string
    60   val simple_string_of_typ: typ -> string
    54     val simple_string_of_typ: typ -> string
    61   val simple_pprint_typ: typ -> pprint_args -> unit
    55     val simple_pprint_typ: typ -> pprint_args -> unit
       
    56 
       
    57 end;
    62 end;
    58 
    63 
    59 functor SyntaxFun(structure Symtab: SYMTAB and TypeExt: TYPE_EXT
    64 functor SyntaxFun(structure Symtab: SYMTAB and TypeExt: TYPE_EXT
    60   and SExtension: SEXTENSION and Mixfix: MIXFIX and Printer: PRINTER
    65   and SynTrans: SYN_TRANS and Mixfix: MIXFIX and Printer: PRINTER
    61   sharing Mixfix.SynExt = SExtension.Parser.SynExt = TypeExt.SynExt = Printer.SynExt)
    66   sharing Mixfix.SynExt = SynTrans.Parser.SynExt = TypeExt.SynExt = Printer.SynExt)
    62   : SYNTAX =
    67   : SYNTAX =
    63 struct
    68 struct
    64 
    69 
    65 structure SynExt = TypeExt.SynExt;
    70 structure SynExt = TypeExt.SynExt;
    66 structure Parser = SExtension.Parser;
    71 structure Parser = SynTrans.Parser;
    67 structure Lexicon = Parser.Lexicon;
    72 structure Lexicon = Parser.Lexicon;
    68 structure Mixfix = Mixfix;
    73 open Lexicon SynExt SynExt.Ast Parser TypeExt SynTrans Mixfix Printer;
    69 open Lexicon SynExt SynExt.Ast Parser TypeExt SExtension Printer;
       
    70 
    74 
    71 
    75 
    72 (** tables of translation functions **)
    76 (** tables of translation functions **)
    73 
    77 
    74 (*the ref serves as unique id*)
    78 (*the ref serves as unique id*)
   170       print_ast_translation} = syn_ext;
   174       print_ast_translation} = syn_ext;
   171   in
   175   in
   172     Syntax {
   176     Syntax {
   173       lexicon = extend_lexicon lexicon (delims_of xprods),
   177       lexicon = extend_lexicon lexicon (delims_of xprods),
   174       roots = extend_list roots1 roots2,
   178       roots = extend_list roots1 roots2,
   175       gram = extend_gram gram roots2 xprods,
   179       gram = extend_gram gram xprods,
   176       consts = consts2 union consts1,
   180       consts = consts2 union consts1,
   177       parse_ast_trtab =
   181       parse_ast_trtab =
   178         extend_trtab parse_ast_trtab parse_ast_translation "parse ast translation",
   182         extend_trtab parse_ast_trtab parse_ast_translation "parse ast translation",
   179       parse_ruletab = extend_ruletab parse_ruletab parse_rules,
   183       parse_ruletab = extend_ruletab parse_ruletab parse_rules,
   180       parse_trtab = extend_trtab parse_trtab parse_translation "parse translation",
   184       parse_trtab = extend_trtab parse_trtab parse_translation "parse translation",
   307   in
   311   in
   308     (case pts of
   312     (case pts of
   309       [pt] => pt_to_ast (lookup_trtab parse_ast_trtab) pt
   313       [pt] => pt_to_ast (lookup_trtab parse_ast_trtab) pt
   310     | _ =>
   314     | _ =>
   311       (writeln ("Ambiguous input " ^ quote str);
   315       (writeln ("Ambiguous input " ^ quote str);
   312        writeln "produces the following parse trees:"; seq show_pt pts;
   316         writeln "produces the following parse trees:"; seq show_pt pts;
   313        error "Please disambiguate the grammar or your input."))
   317         error "Please disambiguate the grammar or your input."))
   314   end;
   318   end;
   315 
   319 
   316 
   320 
   317 (* read *)
   321 (* read *)
   318 
   322 
   327 
   331 
   328 
   332 
   329 (* read types *)
   333 (* read types *)
   330 
   334 
   331 fun read_typ syn def_sort str =
   335 fun read_typ syn def_sort str =
   332   typ_of_term def_sort (read syn typeT str);
   336   let
       
   337     val t = read syn typeT str;
       
   338     val sort_env = raw_term_sorts t;
       
   339   in
       
   340     typ_of_term sort_env def_sort t
       
   341   end;
   333 
   342 
   334 fun simple_read_typ str = read_typ type_syn (K []) str;
   343 fun simple_read_typ str = read_typ type_syn (K []) str;
   335 
   344 
   336 
   345 
   337 (* read rules *)
   346 (* read rules *)
   357           "\nexternal: " ^ quote lhs_src ^ "  ->  " ^ quote rhs_src ^
   366           "\nexternal: " ^ quote lhs_src ^ "  ->  " ^ quote rhs_src ^
   358           "\ninternal: " ^ str_of_ast lhs ^ "  ->  " ^ str_of_ast rhs)
   367           "\ninternal: " ^ str_of_ast lhs ^ "  ->  " ^ str_of_ast rhs)
   359     | None => rule)
   368     | None => rule)
   360   end;
   369   end;
   361 
   370 
       
   371 
       
   372 datatype xrule =
       
   373   op |-> of (string * string) * (string * string) |
       
   374   op <-| of (string * string) * (string * string) |
       
   375   op <-> of (string * string) * (string * string);
       
   376 
   362 fun read_xrules syn xrules =
   377 fun read_xrules syn xrules =
   363   let
   378   let
   364     fun right_rule (xpat1 |-> xpat2) = Some (xpat1, xpat2)
   379     fun right_rule (xpat1 |-> xpat2) = Some (xpat1, xpat2)
   365       | right_rule (xpat1 <-| xpat2) = None
   380       | right_rule (xpat1 <-| xpat2) = None
   366       | right_rule (xpat1 <-> xpat2) = Some (xpat1, xpat2);
   381       | right_rule (xpat1 <-> xpat2) = Some (xpat1, xpat2);
   397 
   412 
   398 
   413 
   399 
   414 
   400 (** extend syntax (external interfaces) **)
   415 (** extend syntax (external interfaces) **)
   401 
   416 
   402 (* FIXME -> syn_ext.ML *)
       
   403 fun syn_ext_const_names roots cs =
       
   404   syn_ext roots [] [] cs ([], [], [], []) ([], []);
       
   405 
       
   406 (* FIXME -> syn_ext.ML *)
       
   407 fun syn_ext_trfuns roots trfuns =
       
   408   syn_ext roots [] [] [] trfuns ([], []);
       
   409 
       
   410 
       
   411 fun ext_syntax mk_syn_ext (syn as Syntax {roots, ...}) decls =
   417 fun ext_syntax mk_syn_ext (syn as Syntax {roots, ...}) decls =
   412   extend_syntax syn (mk_syn_ext roots decls);
   418   extend_syntax syn (mk_syn_ext roots decls);
   413 
   419 
   414 
   420 
   415 fun extend_log_types (syn as Syntax {roots, ...}) all_roots =
   421 fun extend_log_types (syn as Syntax {roots, ...}) all_roots =
   416   extend_syntax syn (syn_ext_roots all_roots (all_roots \\ roots));
   422   extend_syntax syn (syn_ext_roots all_roots (all_roots \\ roots));
   417 
   423 
   418 val extend_type_gram = ext_syntax Mixfix.syn_ext_types;
   424 val extend_type_gram = ext_syntax syn_ext_types;
   419 
   425 
   420 val extend_const_gram = ext_syntax Mixfix.syn_ext_consts;
   426 val extend_const_gram = ext_syntax syn_ext_consts;
   421 
   427 
   422 val extend_consts = ext_syntax syn_ext_const_names;
   428 val extend_consts = ext_syntax syn_ext_const_names;
   423 
   429 
   424 val extend_trfuns = ext_syntax syn_ext_trfuns;
   430 val extend_trfuns = ext_syntax syn_ext_trfuns;
   425 
   431 
   426 fun extend_trrules syn xrules =
   432 fun extend_trrules syn xrules =
   427   ext_syntax syn_ext_rules syn (read_xrules syn xrules);
   433   ext_syntax syn_ext_rules syn (read_xrules syn xrules);
   428 
   434 
   429 
   435 
   430 (* extend *)    (* FIXME remove *)
       
   431 
       
   432 fun extend syn0 read_ty (all_roots, xconsts, sext) =
       
   433   let
       
   434     val Syntax {roots, ...} = syn0;
       
   435 
       
   436     val syn1 = extend_syntax syn0
       
   437       (syn_ext_of_sext all_roots (all_roots \\ roots) xconsts read_ty sext);
       
   438 
       
   439     val syn2 = extend_syntax syn1
       
   440       (syn_ext_rules all_roots (read_xrules syn1 (xrules_of sext)));
       
   441   in syn2 end;
       
   442 
       
   443 
       
   444 end;
   436 end;
   445 
   437