src/Pure/Syntax/syntax.ML
changeset 2366 a163d2be1bb5
parent 2287 94b70aeb7d1f
child 2383 4127499d9b52
equal deleted inserted replaced
2365:38295260a740 2366:a163d2be1bb5
    29     <-| of 'a * 'a |
    29     <-| of 'a * 'a |
    30     <-> of 'a * 'a
    30     <-> of 'a * 'a
    31   type syntax
    31   type syntax
    32   val extend_log_types: syntax -> string list -> syntax
    32   val extend_log_types: syntax -> string list -> syntax
    33   val extend_type_gram: syntax -> (string * int * mixfix) list -> syntax
    33   val extend_type_gram: syntax -> (string * int * mixfix) list -> syntax
    34   val extend_const_gram: syntax -> string -> (string * typ * mixfix) list -> syntax
    34   val extend_const_gram: syntax -> string * bool -> (string * typ * mixfix) list -> syntax
    35   val extend_consts: syntax -> string list -> syntax
    35   val extend_consts: syntax -> string list -> syntax
    36   val extend_trfuns: syntax ->
    36   val extend_trfuns: syntax ->
    37     (string * (ast list -> ast)) list *
    37     (string * (ast list -> ast)) list *
    38     (string * (term list -> term)) list *
    38     (string * (term list -> term)) list *
    39     (string * (term list -> term)) list *
    39     (string * (term list -> term)) list *
    55   val string_of_term: bool -> syntax -> term -> string
    55   val string_of_term: bool -> syntax -> term -> string
    56   val string_of_typ: syntax -> typ -> string
    56   val string_of_typ: syntax -> typ -> string
    57   val simple_string_of_typ: typ -> string
    57   val simple_string_of_typ: typ -> string
    58   val simple_pprint_typ: typ -> pprint_args -> unit
    58   val simple_pprint_typ: typ -> pprint_args -> unit
    59   val ambiguity_level: int ref
    59   val ambiguity_level: int ref
       
    60   val prtabs_of: syntax -> Printer.prtabs   (* FIXME test only *)
    60   end;
    61   end;
    61 
    62 
    62 structure Syntax : SYNTAX =
    63 structure Syntax : SYNTAX =
    63 struct
    64 struct
    64 
    65 
   122 
   123 
   123 (** datatype syntax **)
   124 (** datatype syntax **)
   124 
   125 
   125 datatype syntax =
   126 datatype syntax =
   126   Syntax of {
   127   Syntax of {
       
   128     chartrans: (string * string) list,
   127     lexicon: lexicon,
   129     lexicon: lexicon,
   128     logtypes: string list,
   130     logtypes: string list,
   129     gram: gram,
   131     gram: gram,
   130     consts: string list,
   132     consts: string list,
   131     parse_ast_trtab: ast trtab,
   133     parse_ast_trtab: ast trtab,
   139 
   141 
   140 (* empty_syntax *)
   142 (* empty_syntax *)
   141 
   143 
   142 val empty_syntax =
   144 val empty_syntax =
   143   Syntax {
   145   Syntax {
       
   146     chartrans = [],
   144     lexicon = empty_lexicon,
   147     lexicon = empty_lexicon,
   145     logtypes = [],
   148     logtypes = [],
   146     gram = empty_gram,
   149     gram = empty_gram,
   147     consts = [],
   150     consts = [],
   148     parse_ast_trtab = empty_trtab,
   151     parse_ast_trtab = empty_trtab,
   154     prtabs = empty_prtabs};
   157     prtabs = empty_prtabs};
   155 
   158 
   156 
   159 
   157 (* extend_syntax *)
   160 (* extend_syntax *)
   158 
   161 
   159 fun extend_syntax prmode (Syntax tabs) syn_ext =
   162 fun extend_syntax (mode, inout) (Syntax tabs) syn_ext =
   160   let
   163   let
   161     val {lexicon, logtypes = logtypes1, gram, consts = consts1, parse_ast_trtab,
   164     val {chartrans = _, lexicon, logtypes = logtypes1, gram, consts = consts1,
   162       parse_ruletab, parse_trtab, print_trtab, print_ruletab, print_ast_trtab,
   165       parse_ast_trtab, parse_ruletab, parse_trtab, print_trtab, print_ruletab,
   163       prtabs} = tabs;
   166       print_ast_trtab, prtabs} = tabs;
   164     val SynExt {logtypes = logtypes2, xprods, consts = consts2, parse_ast_translation,
   167     val SynExt {logtypes = logtypes2, xprods, consts = consts2, parse_ast_translation,
   165       parse_rules, parse_translation, print_translation, print_rules,
   168       parse_rules, parse_translation, print_translation, print_rules,
   166       print_ast_translation} = syn_ext;
   169       print_ast_translation} = syn_ext;
       
   170     val prtabs' = extend_prtabs prtabs mode xprods;
   167   in
   171   in
   168     Syntax {
   172     Syntax {
   169       lexicon = if prmode = "" then extend_lexicon lexicon (delims_of xprods) else lexicon,
   173       chartrans = chartrans_of prtabs',
       
   174       lexicon = if inout then extend_lexicon lexicon (delims_of xprods) else lexicon,
   170       logtypes = extend_list logtypes1 logtypes2,
   175       logtypes = extend_list logtypes1 logtypes2,
   171       gram = if prmode = "" then extend_gram gram xprods else gram,
   176       gram = if inout then extend_gram gram xprods else gram,
   172       consts = consts2 union consts1,
   177       consts = consts2 union consts1,
   173       parse_ast_trtab =
   178       parse_ast_trtab =
   174         extend_trtab parse_ast_trtab parse_ast_translation "parse ast translation",
   179         extend_trtab parse_ast_trtab parse_ast_translation "parse ast translation",
   175       parse_ruletab = extend_ruletab parse_ruletab parse_rules,
   180       parse_ruletab = extend_ruletab parse_ruletab parse_rules,
   176       parse_trtab = extend_trtab parse_trtab parse_translation "parse translation",
   181       parse_trtab = extend_trtab parse_trtab parse_translation "parse translation",
   177       print_trtab = extend_trtab print_trtab print_translation "print translation",
   182       print_trtab = extend_trtab print_trtab print_translation "print translation",
   178       print_ruletab = extend_ruletab print_ruletab print_rules,
   183       print_ruletab = extend_ruletab print_ruletab print_rules,
   179       print_ast_trtab =
   184       print_ast_trtab =
   180         extend_trtab print_ast_trtab print_ast_translation "print ast translation",
   185         extend_trtab print_ast_trtab print_ast_translation "print ast translation",
   181       prtabs = extend_prtabs prtabs prmode xprods}
   186       prtabs = prtabs'}
   182   end;
   187   end;
   183 
   188 
   184 
   189 
   185 (* merge_syntaxes *)
   190 (* merge_syntaxes *)
   186 
   191 
   187 fun merge_syntaxes (Syntax tabs1) (Syntax tabs2) =
   192 fun merge_syntaxes (Syntax tabs1) (Syntax tabs2) =
   188   let
   193   let
   189     val {lexicon = lexicon1, logtypes = logtypes1, gram = gram1, consts = consts1,
   194     val {chartrans = _, lexicon = lexicon1, logtypes = logtypes1, gram = gram1,
   190       parse_ast_trtab = parse_ast_trtab1, parse_ruletab = parse_ruletab1,
   195       consts = consts1, parse_ast_trtab = parse_ast_trtab1, parse_ruletab = parse_ruletab1,
   191       parse_trtab = parse_trtab1, print_trtab = print_trtab1,
   196       parse_trtab = parse_trtab1, print_trtab = print_trtab1,
   192       print_ruletab = print_ruletab1, print_ast_trtab = print_ast_trtab1,
   197       print_ruletab = print_ruletab1, print_ast_trtab = print_ast_trtab1,
   193       prtabs = prtabs1} = tabs1;
   198       prtabs = prtabs1} = tabs1;
   194 
   199 
   195     val {lexicon = lexicon2, logtypes = logtypes2, gram = gram2, consts = consts2,
   200     val {chartrans = _, lexicon = lexicon2, logtypes = logtypes2, gram = gram2,
   196       parse_ast_trtab = parse_ast_trtab2, parse_ruletab = parse_ruletab2,
   201       consts = consts2, parse_ast_trtab = parse_ast_trtab2, parse_ruletab = parse_ruletab2,
   197       parse_trtab = parse_trtab2, print_trtab = print_trtab2,
   202       parse_trtab = parse_trtab2, print_trtab = print_trtab2,
   198       print_ruletab = print_ruletab2, print_ast_trtab = print_ast_trtab2,
   203       print_ruletab = print_ruletab2, print_ast_trtab = print_ast_trtab2,
   199       prtabs = prtabs2} = tabs2;
   204       prtabs = prtabs2} = tabs2;
       
   205     val prtabs = merge_prtabs prtabs1 prtabs2;
   200   in
   206   in
   201     Syntax {
   207     Syntax {
       
   208       chartrans = chartrans_of prtabs,
   202       lexicon = merge_lexicons lexicon1 lexicon2,
   209       lexicon = merge_lexicons lexicon1 lexicon2,
   203       logtypes = merge_lists logtypes1 logtypes2,
   210       logtypes = merge_lists logtypes1 logtypes2,
   204       gram = merge_grams gram1 gram2,
   211       gram = merge_grams gram1 gram2,
   205       consts = merge_lists consts1 consts2,
   212       consts = merge_lists consts1 consts2,
   206       parse_ast_trtab =
   213       parse_ast_trtab =
   209       parse_trtab = merge_trtabs parse_trtab1 parse_trtab2 "parse translation",
   216       parse_trtab = merge_trtabs parse_trtab1 parse_trtab2 "parse translation",
   210       print_trtab = merge_trtabs print_trtab1 print_trtab2 "print translation",
   217       print_trtab = merge_trtabs print_trtab1 print_trtab2 "print translation",
   211       print_ruletab = merge_ruletabs print_ruletab1 print_ruletab2,
   218       print_ruletab = merge_ruletabs print_ruletab1 print_ruletab2,
   212       print_ast_trtab =
   219       print_ast_trtab =
   213         merge_trtabs print_ast_trtab1 print_ast_trtab2 "print ast translation",
   220         merge_trtabs print_ast_trtab1 print_ast_trtab2 "print ast translation",
   214       prtabs = merge_prtabs prtabs1 prtabs2}
   221       prtabs = prtabs}
   215   end;
   222   end;
   216 
   223 
   217 
   224 
   218 (* type_syn *)
   225 (* type_syn *)
   219 
   226 
   220 val type_syn = extend_syntax "" empty_syntax type_ext;
   227 val type_syn = extend_syntax ("", true) empty_syntax type_ext;
   221 val pure_syn = extend_syntax "" type_syn pure_ext;
   228 val pure_syn = extend_syntax ("", true) type_syn pure_ext;
   222 
   229 
   223 
   230 
   224 (** inspect syntax **)
   231 (** inspect syntax **)
   225 
   232 
   226 fun pretty_strs_qs name strs =
   233 fun pretty_strs_qs name strs =
   229 
   236 
   230 (* print_gram *)
   237 (* print_gram *)
   231 
   238 
   232 fun print_gram (Syntax tabs) =
   239 fun print_gram (Syntax tabs) =
   233   let
   240   let
   234     val {lexicon, logtypes, gram, prtabs, ...} = tabs;
   241     val pretty_chartrans =
   235   in
   242       map (fn (c, s) => Pretty.str (c ^ " -> " ^ quote s));
       
   243 
       
   244     val {chartrans, lexicon, logtypes, gram, prtabs, ...} = tabs;
       
   245   in
       
   246     Pretty.writeln (Pretty.big_list "chartrans:" (pretty_chartrans chartrans));
   236     Pretty.writeln (pretty_strs_qs "lexicon:" (dest_lexicon lexicon));
   247     Pretty.writeln (pretty_strs_qs "lexicon:" (dest_lexicon lexicon));
   237     Pretty.writeln (Pretty.strs ("logtypes:" :: logtypes));
   248     Pretty.writeln (Pretty.strs ("logtypes:" :: logtypes));
   238     Pretty.writeln (Pretty.big_list "prods:" (pretty_gram gram));
   249     Pretty.writeln (Pretty.big_list "prods:" (pretty_gram gram));
   239     Pretty.writeln (pretty_strs_qs "printer modes:" (prmodes_of prtabs))
   250     Pretty.writeln (pretty_strs_qs "printer modes:" (prmodes_of prtabs))
   240   end;
   251   end;
   275 
   286 
   276 fun test_read (Syntax tabs) root str =
   287 fun test_read (Syntax tabs) root str =
   277   let
   288   let
   278     val {lexicon, gram, parse_ast_trtab, parse_ruletab, ...} = tabs;
   289     val {lexicon, gram, parse_ast_trtab, parse_ruletab, ...} = tabs;
   279 
   290 
   280     val toks = tokenize lexicon false str;
   291     val chars = SymbolFont.read_charnames (explode str);
       
   292     val toks = tokenize lexicon false chars;
   281     val _ = writeln ("tokens: " ^ space_implode " " (map display_token toks));
   293     val _ = writeln ("tokens: " ^ space_implode " " (map display_token toks));
   282 
   294 
   283     fun show_pt pt =
   295     fun show_pt pt =
   284       let
   296       let
   285         val raw_ast = pt_to_ast (K None) pt;
   297         val raw_ast = pt_to_ast (K None) pt;
   298 
   310 
   299 fun read_asts (Syntax tabs) xids root str =
   311 fun read_asts (Syntax tabs) xids root str =
   300   let
   312   let
   301     val {lexicon, gram, parse_ast_trtab, logtypes, ...} = tabs;
   313     val {lexicon, gram, parse_ast_trtab, logtypes, ...} = tabs;
   302     val root' = if root mem logtypes then logic else root;
   314     val root' = if root mem logtypes then logic else root;
   303     val pts = parse gram root' (tokenize lexicon xids str);
   315     val chars = SymbolFont.read_charnames (explode str);
       
   316     val pts = parse gram root' (tokenize lexicon xids chars);
   304 
   317 
   305     fun show_pt pt = writeln (str_of_ast (pt_to_ast (K None) pt));
   318     fun show_pt pt = writeln (str_of_ast (pt_to_ast (K None) pt));
   306   in
   319   in
   307     if length pts > ! ambiguity_level then
   320     if length pts > ! ambiguity_level then
   308       (warning ("Ambiguous input " ^ quote str);
   321       (warning ("Ambiguous input " ^ quote str);
   417 fun ext_syntax mk_syn_ext prmode (syn as Syntax {logtypes, ...}) decls =
   430 fun ext_syntax mk_syn_ext prmode (syn as Syntax {logtypes, ...}) decls =
   418   extend_syntax prmode syn (mk_syn_ext logtypes decls);
   431   extend_syntax prmode syn (mk_syn_ext logtypes decls);
   419 
   432 
   420 
   433 
   421 fun extend_log_types syn logtypes =
   434 fun extend_log_types syn logtypes =
   422   extend_syntax "" syn (syn_ext_logtypes logtypes);
   435   extend_syntax ("", true) syn (syn_ext_logtypes logtypes);
   423 
   436 
   424 val extend_type_gram = ext_syntax syn_ext_types "";
   437 val extend_type_gram = ext_syntax syn_ext_types ("", true);
   425 
   438 
   426 fun extend_const_gram syn prmode = ext_syntax syn_ext_consts prmode syn;
   439 fun extend_const_gram syn prmode = ext_syntax syn_ext_consts prmode syn;
   427 
   440 
   428 val extend_consts = ext_syntax syn_ext_const_names "";
   441 val extend_consts = ext_syntax syn_ext_const_names ("", true);
   429 
   442 
   430 val extend_trfuns = ext_syntax syn_ext_trfuns "";
   443 val extend_trfuns = ext_syntax syn_ext_trfuns ("", true);
   431 
   444 
   432 fun extend_trrules syn rules =
   445 fun extend_trrules syn rules =
   433   ext_syntax syn_ext_rules "" syn (prep_rules (read_pattern syn) rules);
   446   ext_syntax syn_ext_rules ("", true) syn (prep_rules (read_pattern syn) rules);
   434 
   447 
   435 fun extend_trrules_i syn rules =
   448 fun extend_trrules_i syn rules =
   436   ext_syntax syn_ext_rules "" syn (prep_rules I rules);
   449   ext_syntax syn_ext_rules ("", true) syn (prep_rules I rules);
       
   450 
       
   451 
       
   452 
       
   453 (* FIXME test only *)
       
   454 
       
   455 fun prtabs_of (Syntax {prtabs, ...}) = prtabs;
   437 
   456 
   438 end;
   457 end;