src/Pure/Syntax/syntax.ML
author blanchet
Thu, 30 Jan 2014 15:01:40 +0100
changeset 55184 6e2295db4cf8
parent 52160 7746c9f1baf3
child 55828 42ac3cfb89f6
permissions -rw-r--r--
keep formula right before skolemization, because the universal variables might be different (or differently ordered) as in the original axiom or negated conjecture from which it was skolemized
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
18
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents: 0
diff changeset
     1
(*  Title:      Pure/Syntax/syntax.ML
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     2
    Author:     Tobias Nipkow and Markus Wenzel, TU Muenchen
18
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents: 0
diff changeset
     3
24263
aff00d8b2e32 added generic wrapper for parse/read functions;
wenzelm
parents: 24247
diff changeset
     4
Standard Isabelle syntax, based on arbitrary context-free grammars
aff00d8b2e32 added generic wrapper for parse/read functions;
wenzelm
parents: 24247
diff changeset
     5
(specified by mixfix declarations).
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     6
*)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     7
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
     8
signature SYNTAX =
2383
4127499d9b52 added extend_trfunsT;
wenzelm
parents: 2366
diff changeset
     9
sig
42382
dcd983ee2c29 provide structure Syntax early (before structure Type), back-patch check/uncheck later;
wenzelm
parents: 42360
diff changeset
    10
  type operations
dcd983ee2c29 provide structure Syntax early (before structure Type), back-patch check/uncheck later;
wenzelm
parents: 42360
diff changeset
    11
  val install_operations: operations -> unit
42288
2074b31650e6 discontinued special treatment of structure Syntax_Ext (formerly Syn_Ext);
wenzelm
parents: 42287
diff changeset
    12
  val root: string Config.T
46512
4f9f61f9b535 simplified configuration options for syntax ambiguity;
wenzelm
parents: 46506
diff changeset
    13
  val ambiguity_warning_raw: Config.raw
4f9f61f9b535 simplified configuration options for syntax ambiguity;
wenzelm
parents: 46506
diff changeset
    14
  val ambiguity_warning: bool Config.T
46506
c7faa011bfa7 simplified configuration options for syntax ambiguity;
wenzelm
parents: 46483
diff changeset
    15
  val ambiguity_limit_raw: Config.raw
42268
01401287c3f7 discontinued user-defined token translations;
wenzelm
parents: 42264
diff changeset
    16
  val ambiguity_limit: int Config.T
30573
49899f26fbd1 de-camelized Symbol_Pos;
wenzelm
parents: 30364
diff changeset
    17
  val read_token: string -> Symbol_Pos.T list * Position.T
46849
36f392239b6a tuned signature;
wenzelm
parents: 46512
diff changeset
    18
  val read_token_pos: string -> Position.T
43731
70072780e095 inner syntax supports inlined YXML according to Term_XML (particularly useful for producing text under program control);
wenzelm
parents: 43558
diff changeset
    19
  val parse_token: Proof.context -> (XML.tree list -> 'a) ->
70072780e095 inner syntax supports inlined YXML according to Term_XML (particularly useful for producing text under program control);
wenzelm
parents: 43558
diff changeset
    20
    Markup.T -> (Symbol_Pos.T list * Position.T -> 'a) -> string -> 'a
24263
aff00d8b2e32 added generic wrapper for parse/read functions;
wenzelm
parents: 24247
diff changeset
    21
  val parse_sort: Proof.context -> string -> sort
aff00d8b2e32 added generic wrapper for parse/read functions;
wenzelm
parents: 24247
diff changeset
    22
  val parse_typ: Proof.context -> string -> typ
aff00d8b2e32 added generic wrapper for parse/read functions;
wenzelm
parents: 24247
diff changeset
    23
  val parse_term: Proof.context -> string -> term
aff00d8b2e32 added generic wrapper for parse/read functions;
wenzelm
parents: 24247
diff changeset
    24
  val parse_prop: Proof.context -> string -> term
24768
123e219b66c2 added unparse interfaces (still unused);
wenzelm
parents: 24709
diff changeset
    25
  val unparse_sort: Proof.context -> sort -> Pretty.T
24923
9e095546cdac generic Syntax.pretty/string_of operations;
wenzelm
parents: 24768
diff changeset
    26
  val unparse_classrel: Proof.context -> class list -> Pretty.T
9e095546cdac generic Syntax.pretty/string_of operations;
wenzelm
parents: 24768
diff changeset
    27
  val unparse_arity: Proof.context -> arity -> Pretty.T
24768
123e219b66c2 added unparse interfaces (still unused);
wenzelm
parents: 24709
diff changeset
    28
  val unparse_typ: Proof.context -> typ -> Pretty.T
123e219b66c2 added unparse interfaces (still unused);
wenzelm
parents: 24709
diff changeset
    29
  val unparse_term: Proof.context -> term -> Pretty.T
24488
646e782ba8ff turned type_check into separate typ/term_check;
wenzelm
parents: 24372
diff changeset
    30
  val check_sort: Proof.context -> sort -> sort
24512
fc4959967b30 added singleton check_typ/term/prop;
wenzelm
parents: 24488
diff changeset
    31
  val check_typ: Proof.context -> typ -> typ
fc4959967b30 added singleton check_typ/term/prop;
wenzelm
parents: 24488
diff changeset
    32
  val check_term: Proof.context -> term -> term
fc4959967b30 added singleton check_typ/term/prop;
wenzelm
parents: 24488
diff changeset
    33
  val check_prop: Proof.context -> term -> term
24488
646e782ba8ff turned type_check into separate typ/term_check;
wenzelm
parents: 24372
diff changeset
    34
  val check_typs: Proof.context -> typ list -> typ list
24263
aff00d8b2e32 added generic wrapper for parse/read functions;
wenzelm
parents: 24247
diff changeset
    35
  val check_terms: Proof.context -> term list -> term list
aff00d8b2e32 added generic wrapper for parse/read functions;
wenzelm
parents: 24247
diff changeset
    36
  val check_props: Proof.context -> term list -> term list
24923
9e095546cdac generic Syntax.pretty/string_of operations;
wenzelm
parents: 24768
diff changeset
    37
  val uncheck_sort: Proof.context -> sort -> sort
9e095546cdac generic Syntax.pretty/string_of operations;
wenzelm
parents: 24768
diff changeset
    38
  val uncheck_arity: Proof.context -> arity -> arity
9e095546cdac generic Syntax.pretty/string_of operations;
wenzelm
parents: 24768
diff changeset
    39
  val uncheck_classrel: Proof.context -> class list -> class list
24768
123e219b66c2 added unparse interfaces (still unused);
wenzelm
parents: 24709
diff changeset
    40
  val uncheck_typs: Proof.context -> typ list -> typ list
123e219b66c2 added unparse interfaces (still unused);
wenzelm
parents: 24709
diff changeset
    41
  val uncheck_terms: Proof.context -> term list -> term list
24263
aff00d8b2e32 added generic wrapper for parse/read functions;
wenzelm
parents: 24247
diff changeset
    42
  val read_sort: Proof.context -> string -> sort
aff00d8b2e32 added generic wrapper for parse/read functions;
wenzelm
parents: 24247
diff changeset
    43
  val read_typ: Proof.context -> string -> typ
24488
646e782ba8ff turned type_check into separate typ/term_check;
wenzelm
parents: 24372
diff changeset
    44
  val read_term: Proof.context -> string -> term
646e782ba8ff turned type_check into separate typ/term_check;
wenzelm
parents: 24372
diff changeset
    45
  val read_prop: Proof.context -> string -> term
46989
88b0a8052c75 added Syntax.read_typs;
wenzelm
parents: 46849
diff changeset
    46
  val read_typs: Proof.context -> string list -> typ list
24263
aff00d8b2e32 added generic wrapper for parse/read functions;
wenzelm
parents: 24247
diff changeset
    47
  val read_terms: Proof.context -> string list -> term list
aff00d8b2e32 added generic wrapper for parse/read functions;
wenzelm
parents: 24247
diff changeset
    48
  val read_props: Proof.context -> string list -> term list
24709
ecfb9dcb6c4c removed redundant global_parse operations;
wenzelm
parents: 24680
diff changeset
    49
  val read_sort_global: theory -> string -> sort
ecfb9dcb6c4c removed redundant global_parse operations;
wenzelm
parents: 24680
diff changeset
    50
  val read_typ_global: theory -> string -> typ
ecfb9dcb6c4c removed redundant global_parse operations;
wenzelm
parents: 24680
diff changeset
    51
  val read_term_global: theory -> string -> term
ecfb9dcb6c4c removed redundant global_parse operations;
wenzelm
parents: 24680
diff changeset
    52
  val read_prop_global: theory -> string -> term
24923
9e095546cdac generic Syntax.pretty/string_of operations;
wenzelm
parents: 24768
diff changeset
    53
  val pretty_term: Proof.context -> term -> Pretty.T
9e095546cdac generic Syntax.pretty/string_of operations;
wenzelm
parents: 24768
diff changeset
    54
  val pretty_typ: Proof.context -> typ -> Pretty.T
9e095546cdac generic Syntax.pretty/string_of operations;
wenzelm
parents: 24768
diff changeset
    55
  val pretty_sort: Proof.context -> sort -> Pretty.T
9e095546cdac generic Syntax.pretty/string_of operations;
wenzelm
parents: 24768
diff changeset
    56
  val pretty_classrel: Proof.context -> class list -> Pretty.T
9e095546cdac generic Syntax.pretty/string_of operations;
wenzelm
parents: 24768
diff changeset
    57
  val pretty_arity: Proof.context -> arity -> Pretty.T
9e095546cdac generic Syntax.pretty/string_of operations;
wenzelm
parents: 24768
diff changeset
    58
  val string_of_term: Proof.context -> term -> string
9e095546cdac generic Syntax.pretty/string_of operations;
wenzelm
parents: 24768
diff changeset
    59
  val string_of_typ: Proof.context -> typ -> string
9e095546cdac generic Syntax.pretty/string_of operations;
wenzelm
parents: 24768
diff changeset
    60
  val string_of_sort: Proof.context -> sort -> string
9e095546cdac generic Syntax.pretty/string_of operations;
wenzelm
parents: 24768
diff changeset
    61
  val string_of_classrel: Proof.context -> class list -> string
9e095546cdac generic Syntax.pretty/string_of operations;
wenzelm
parents: 24768
diff changeset
    62
  val string_of_arity: Proof.context -> arity -> string
26951
030e4a818b39 moved global pretty/string_of functions from Sign to Syntax;
wenzelm
parents: 26704
diff changeset
    63
  val is_pretty_global: Proof.context -> bool
030e4a818b39 moved global pretty/string_of functions from Sign to Syntax;
wenzelm
parents: 26704
diff changeset
    64
  val set_pretty_global: bool -> Proof.context -> Proof.context
030e4a818b39 moved global pretty/string_of functions from Sign to Syntax;
wenzelm
parents: 26704
diff changeset
    65
  val init_pretty_global: theory -> Proof.context
42383
0ae4ad40d7b5 simplified pretty printing context, which is only required for certain kernel operations;
wenzelm
parents: 42382
diff changeset
    66
  val init_pretty: Context.pretty -> Proof.context
26951
030e4a818b39 moved global pretty/string_of functions from Sign to Syntax;
wenzelm
parents: 26704
diff changeset
    67
  val pretty_term_global: theory -> term -> Pretty.T
030e4a818b39 moved global pretty/string_of functions from Sign to Syntax;
wenzelm
parents: 26704
diff changeset
    68
  val pretty_typ_global: theory -> typ -> Pretty.T
030e4a818b39 moved global pretty/string_of functions from Sign to Syntax;
wenzelm
parents: 26704
diff changeset
    69
  val pretty_sort_global: theory -> sort -> Pretty.T
030e4a818b39 moved global pretty/string_of functions from Sign to Syntax;
wenzelm
parents: 26704
diff changeset
    70
  val string_of_term_global: theory -> term -> string
030e4a818b39 moved global pretty/string_of functions from Sign to Syntax;
wenzelm
parents: 26704
diff changeset
    71
  val string_of_typ_global: theory -> typ -> string
030e4a818b39 moved global pretty/string_of functions from Sign to Syntax;
wenzelm
parents: 26704
diff changeset
    72
  val string_of_sort_global: theory -> sort -> string
39135
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
    73
  type syntax
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
    74
  val eq_syntax: syntax * syntax -> bool
45632
b23c42b9f78a prefer Parser.make_gram over Parser.merge_gram, to approximate n-ary merges on theory import;
wenzelm
parents: 45490
diff changeset
    75
  val force_syntax: syntax -> unit
42298
d622145603ee more accurate markup for syntax consts, notably binders which point back to the original logical entity;
wenzelm
parents: 42297
diff changeset
    76
  val lookup_const: syntax -> string -> string option
39135
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
    77
  val is_keyword: syntax -> string -> bool
42251
050cc12dd985 explicit Syntax.tokenize, Syntax.parse;
wenzelm
parents: 42247
diff changeset
    78
  val tokenize: syntax -> bool -> Symbol_Pos.T list -> Lexicon.token list
45641
20ef9135a9fb removed obsolete argument (cf. 954e9d6782ea);
wenzelm
parents: 45632
diff changeset
    79
  val parse: syntax -> string -> Lexicon.token list -> Parser.parsetree list
42253
c539d3c9c023 more abstract syntax translation;
wenzelm
parents: 42251
diff changeset
    80
  val parse_ast_translation: syntax -> string -> (Proof.context -> Ast.ast list -> Ast.ast) option
42255
097c93dcd877 eliminated slightly odd Syntax.rep_syntax;
wenzelm
parents: 42254
diff changeset
    81
  val parse_rules: syntax -> string -> (Ast.ast * Ast.ast) list
42253
c539d3c9c023 more abstract syntax translation;
wenzelm
parents: 42251
diff changeset
    82
  val parse_translation: syntax -> string -> (Proof.context -> term list -> term) option
42254
f427c9890c46 more abstract print translation;
wenzelm
parents: 42253
diff changeset
    83
  val print_translation: syntax -> string ->
f427c9890c46 more abstract print translation;
wenzelm
parents: 42253
diff changeset
    84
    Proof.context -> typ -> term list -> term  (*exception Match*)
42255
097c93dcd877 eliminated slightly odd Syntax.rep_syntax;
wenzelm
parents: 42254
diff changeset
    85
  val print_rules: syntax -> string -> (Ast.ast * Ast.ast) list
42254
f427c9890c46 more abstract print translation;
wenzelm
parents: 42253
diff changeset
    86
  val print_ast_translation: syntax -> string ->
f427c9890c46 more abstract print translation;
wenzelm
parents: 42253
diff changeset
    87
    Proof.context -> Ast.ast list -> Ast.ast  (*exception Match*)
42255
097c93dcd877 eliminated slightly odd Syntax.rep_syntax;
wenzelm
parents: 42254
diff changeset
    88
  val prtabs: syntax -> Printer.prtabs
39135
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
    89
  type mode
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
    90
  val mode_default: mode
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
    91
  val mode_input: mode
42294
0f4372a2d2e4 simplified Pure syntax bootstrap;
wenzelm
parents: 42293
diff changeset
    92
  val empty_syntax: syntax
45632
b23c42b9f78a prefer Parser.make_gram over Parser.merge_gram, to approximate n-ary merges on theory import;
wenzelm
parents: 45490
diff changeset
    93
  val merge_syntax: syntax * syntax -> syntax
39135
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
    94
  val print_gram: syntax -> unit
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
    95
  val print_trans: syntax -> unit
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
    96
  val print_syntax: syntax -> unit
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
    97
  val guess_infix: syntax -> string -> mixfix option
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
    98
  datatype 'a trrule =
42204
b3277168c1e7 added Position.reports convenience;
wenzelm
parents: 42134
diff changeset
    99
    Parse_Rule of 'a * 'a |
b3277168c1e7 added Position.reports convenience;
wenzelm
parents: 42134
diff changeset
   100
    Print_Rule of 'a * 'a |
b3277168c1e7 added Position.reports convenience;
wenzelm
parents: 42134
diff changeset
   101
    Parse_Print_Rule of 'a * 'a
39135
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   102
  val map_trrule: ('a -> 'b) -> 'a trrule -> 'b trrule
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   103
  val update_trfuns:
42224
578a51fae383 discontinued special treatment of structure Ast: no pervasive content, no inclusion in structure Syntax;
wenzelm
parents: 42223
diff changeset
   104
    (string * ((Proof.context -> Ast.ast list -> Ast.ast) * stamp)) list *
39135
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   105
    (string * ((Proof.context -> term list -> term) * stamp)) list *
42247
12fe41a92cd5 typed_print_translation: discontinued show_sorts argument;
wenzelm
parents: 42245
diff changeset
   106
    (string * ((Proof.context -> typ -> term list -> term) * stamp)) list *
42224
578a51fae383 discontinued special treatment of structure Ast: no pervasive content, no inclusion in structure Syntax;
wenzelm
parents: 42223
diff changeset
   107
    (string * ((Proof.context -> Ast.ast list -> Ast.ast) * stamp)) list -> syntax -> syntax
39135
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   108
  val update_type_gram: bool -> mode -> (string * typ * mixfix) list -> syntax -> syntax
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   109
  val update_const_gram: bool -> (string -> bool) ->
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   110
    mode -> (string * typ * mixfix) list -> syntax -> syntax
42224
578a51fae383 discontinued special treatment of structure Ast: no pervasive content, no inclusion in structure Syntax;
wenzelm
parents: 42223
diff changeset
   111
  val update_trrules: Ast.ast trrule list -> syntax -> syntax
578a51fae383 discontinued special treatment of structure Ast: no pervasive content, no inclusion in structure Syntax;
wenzelm
parents: 42223
diff changeset
   112
  val remove_trrules: Ast.ast trrule list -> syntax -> syntax
42476
d0bc1268ef09 clarified auxiliary structure Lexicon.Syntax;
wenzelm
parents: 42408
diff changeset
   113
  val const: string -> term
d0bc1268ef09 clarified auxiliary structure Lexicon.Syntax;
wenzelm
parents: 42408
diff changeset
   114
  val free: string -> term
d0bc1268ef09 clarified auxiliary structure Lexicon.Syntax;
wenzelm
parents: 42408
diff changeset
   115
  val var: indexname -> term
2383
4127499d9b52 added extend_trfunsT;
wenzelm
parents: 2366
diff changeset
   116
end;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   117
12094
wenzelm
parents: 12073
diff changeset
   118
structure Syntax: SYNTAX =
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   119
struct
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   120
42288
2074b31650e6 discontinued special treatment of structure Syntax_Ext (formerly Syn_Ext);
wenzelm
parents: 42287
diff changeset
   121
39135
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   122
(** inner syntax operations **)
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   123
42382
dcd983ee2c29 provide structure Syntax early (before structure Type), back-patch check/uncheck later;
wenzelm
parents: 42360
diff changeset
   124
(* back-patched operations *)
dcd983ee2c29 provide structure Syntax early (before structure Type), back-patch check/uncheck later;
wenzelm
parents: 42360
diff changeset
   125
dcd983ee2c29 provide structure Syntax early (before structure Type), back-patch check/uncheck later;
wenzelm
parents: 42360
diff changeset
   126
type operations =
dcd983ee2c29 provide structure Syntax early (before structure Type), back-patch check/uncheck later;
wenzelm
parents: 42360
diff changeset
   127
 {parse_sort: Proof.context -> string -> sort,
dcd983ee2c29 provide structure Syntax early (before structure Type), back-patch check/uncheck later;
wenzelm
parents: 42360
diff changeset
   128
  parse_typ: Proof.context -> string -> typ,
dcd983ee2c29 provide structure Syntax early (before structure Type), back-patch check/uncheck later;
wenzelm
parents: 42360
diff changeset
   129
  parse_term: Proof.context -> string -> term,
dcd983ee2c29 provide structure Syntax early (before structure Type), back-patch check/uncheck later;
wenzelm
parents: 42360
diff changeset
   130
  parse_prop: Proof.context -> string -> term,
dcd983ee2c29 provide structure Syntax early (before structure Type), back-patch check/uncheck later;
wenzelm
parents: 42360
diff changeset
   131
  unparse_sort: Proof.context -> sort -> Pretty.T,
dcd983ee2c29 provide structure Syntax early (before structure Type), back-patch check/uncheck later;
wenzelm
parents: 42360
diff changeset
   132
  unparse_typ: Proof.context -> typ -> Pretty.T,
dcd983ee2c29 provide structure Syntax early (before structure Type), back-patch check/uncheck later;
wenzelm
parents: 42360
diff changeset
   133
  unparse_term: Proof.context -> term -> Pretty.T,
dcd983ee2c29 provide structure Syntax early (before structure Type), back-patch check/uncheck later;
wenzelm
parents: 42360
diff changeset
   134
  check_typs: Proof.context -> typ list -> typ list,
dcd983ee2c29 provide structure Syntax early (before structure Type), back-patch check/uncheck later;
wenzelm
parents: 42360
diff changeset
   135
  check_terms: Proof.context -> term list -> term list,
dcd983ee2c29 provide structure Syntax early (before structure Type), back-patch check/uncheck later;
wenzelm
parents: 42360
diff changeset
   136
  check_props: Proof.context -> term list -> term list,
dcd983ee2c29 provide structure Syntax early (before structure Type), back-patch check/uncheck later;
wenzelm
parents: 42360
diff changeset
   137
  uncheck_typs: Proof.context -> typ list -> typ list,
dcd983ee2c29 provide structure Syntax early (before structure Type), back-patch check/uncheck later;
wenzelm
parents: 42360
diff changeset
   138
  uncheck_terms: Proof.context -> term list -> term list};
dcd983ee2c29 provide structure Syntax early (before structure Type), back-patch check/uncheck later;
wenzelm
parents: 42360
diff changeset
   139
dcd983ee2c29 provide structure Syntax early (before structure Type), back-patch check/uncheck later;
wenzelm
parents: 42360
diff changeset
   140
val operations: operations Single_Assignment.var = Single_Assignment.var "Syntax.operations";
dcd983ee2c29 provide structure Syntax early (before structure Type), back-patch check/uncheck later;
wenzelm
parents: 42360
diff changeset
   141
fun install_operations ops = Single_Assignment.assign operations ops;
dcd983ee2c29 provide structure Syntax early (before structure Type), back-patch check/uncheck later;
wenzelm
parents: 42360
diff changeset
   142
dcd983ee2c29 provide structure Syntax early (before structure Type), back-patch check/uncheck later;
wenzelm
parents: 42360
diff changeset
   143
fun operation which ctxt x =
dcd983ee2c29 provide structure Syntax early (before structure Type), back-patch check/uncheck later;
wenzelm
parents: 42360
diff changeset
   144
  (case Single_Assignment.peek operations of
dcd983ee2c29 provide structure Syntax early (before structure Type), back-patch check/uncheck later;
wenzelm
parents: 42360
diff changeset
   145
    NONE => raise Fail "Inner syntax operations not installed"
dcd983ee2c29 provide structure Syntax early (before structure Type), back-patch check/uncheck later;
wenzelm
parents: 42360
diff changeset
   146
  | SOME ops => which ops ctxt x);
dcd983ee2c29 provide structure Syntax early (before structure Type), back-patch check/uncheck later;
wenzelm
parents: 42360
diff changeset
   147
dcd983ee2c29 provide structure Syntax early (before structure Type), back-patch check/uncheck later;
wenzelm
parents: 42360
diff changeset
   148
42268
01401287c3f7 discontinued user-defined token translations;
wenzelm
parents: 42264
diff changeset
   149
(* configuration options *)
01401287c3f7 discontinued user-defined token translations;
wenzelm
parents: 42264
diff changeset
   150
42293
6cca0343ea48 renamed sprop "prop#" to "prop'" -- proper identifier;
wenzelm
parents: 42290
diff changeset
   151
val root = Config.string (Config.declare "syntax_root" (K (Config.String "any")));
42288
2074b31650e6 discontinued special treatment of structure Syntax_Ext (formerly Syn_Ext);
wenzelm
parents: 42287
diff changeset
   152
46512
4f9f61f9b535 simplified configuration options for syntax ambiguity;
wenzelm
parents: 46506
diff changeset
   153
val ambiguity_warning_raw = Config.declare "syntax_ambiguity_warning" (fn _ => Config.Bool true);
4f9f61f9b535 simplified configuration options for syntax ambiguity;
wenzelm
parents: 46506
diff changeset
   154
val ambiguity_warning = Config.bool ambiguity_warning_raw;
42268
01401287c3f7 discontinued user-defined token translations;
wenzelm
parents: 42264
diff changeset
   155
46506
c7faa011bfa7 simplified configuration options for syntax ambiguity;
wenzelm
parents: 46483
diff changeset
   156
val ambiguity_limit_raw = Config.declare "syntax_ambiguity_limit" (fn _ => Config.Int 10);
c7faa011bfa7 simplified configuration options for syntax ambiguity;
wenzelm
parents: 46483
diff changeset
   157
val ambiguity_limit = Config.int ambiguity_limit_raw;
44069
d7c7ec248ef0 make syntax ambiguity warnings a config option
kleing
parents: 43731
diff changeset
   158
42268
01401287c3f7 discontinued user-defined token translations;
wenzelm
parents: 42264
diff changeset
   159
43731
70072780e095 inner syntax supports inlined YXML according to Term_XML (particularly useful for producing text under program control);
wenzelm
parents: 43558
diff changeset
   160
(* outer syntax token -- with optional YXML content *)
39135
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   161
46849
36f392239b6a tuned signature;
wenzelm
parents: 46512
diff changeset
   162
fun token_position (XML.Elem ((name, props), _)) =
50201
c26369c9eda6 Isabelle-specific implementation of quasi-abstract markup elements -- back to module arrangement before d83797ef0d2d;
wenzelm
parents: 49674
diff changeset
   163
      if name = Markup.tokenN then Position.of_properties props
46849
36f392239b6a tuned signature;
wenzelm
parents: 46512
diff changeset
   164
      else Position.none
36f392239b6a tuned signature;
wenzelm
parents: 46512
diff changeset
   165
  | token_position (XML.Text _) = Position.none;
36f392239b6a tuned signature;
wenzelm
parents: 46512
diff changeset
   166
43731
70072780e095 inner syntax supports inlined YXML according to Term_XML (particularly useful for producing text under program control);
wenzelm
parents: 43558
diff changeset
   167
fun explode_token tree =
39135
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   168
  let
39555
ccb223a4d49c added XML.content_of convenience -- cover XML.body, which is the general situation;
wenzelm
parents: 39510
diff changeset
   169
    val text = XML.content_of [tree];
46849
36f392239b6a tuned signature;
wenzelm
parents: 46512
diff changeset
   170
    val pos = token_position tree;
39135
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   171
  in (Symbol_Pos.explode (text, pos), pos) end;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   172
43731
70072780e095 inner syntax supports inlined YXML according to Term_XML (particularly useful for producing text under program control);
wenzelm
parents: 43558
diff changeset
   173
fun read_token str = explode_token (YXML.parse str handle Fail msg => error msg);
46849
36f392239b6a tuned signature;
wenzelm
parents: 46512
diff changeset
   174
fun read_token_pos str = token_position (YXML.parse str handle Fail msg => error msg);
43731
70072780e095 inner syntax supports inlined YXML according to Term_XML (particularly useful for producing text under program control);
wenzelm
parents: 43558
diff changeset
   175
70072780e095 inner syntax supports inlined YXML according to Term_XML (particularly useful for producing text under program control);
wenzelm
parents: 43558
diff changeset
   176
fun parse_token ctxt decode markup parse str =
70072780e095 inner syntax supports inlined YXML according to Term_XML (particularly useful for producing text under program control);
wenzelm
parents: 43558
diff changeset
   177
  let
70072780e095 inner syntax supports inlined YXML according to Term_XML (particularly useful for producing text under program control);
wenzelm
parents: 43558
diff changeset
   178
    fun parse_tree tree =
70072780e095 inner syntax supports inlined YXML according to Term_XML (particularly useful for producing text under program control);
wenzelm
parents: 43558
diff changeset
   179
      let
70072780e095 inner syntax supports inlined YXML according to Term_XML (particularly useful for producing text under program control);
wenzelm
parents: 43558
diff changeset
   180
        val (syms, pos) = explode_token tree;
70072780e095 inner syntax supports inlined YXML according to Term_XML (particularly useful for producing text under program control);
wenzelm
parents: 43558
diff changeset
   181
        val _ = Context_Position.report ctxt pos markup;
70072780e095 inner syntax supports inlined YXML according to Term_XML (particularly useful for producing text under program control);
wenzelm
parents: 43558
diff changeset
   182
      in parse (syms, pos) end;
70072780e095 inner syntax supports inlined YXML according to Term_XML (particularly useful for producing text under program control);
wenzelm
parents: 43558
diff changeset
   183
  in
70072780e095 inner syntax supports inlined YXML according to Term_XML (particularly useful for producing text under program control);
wenzelm
parents: 43558
diff changeset
   184
    (case YXML.parse_body str handle Fail msg => error msg of
70072780e095 inner syntax supports inlined YXML according to Term_XML (particularly useful for producing text under program control);
wenzelm
parents: 43558
diff changeset
   185
      body as [tree as XML.Elem ((name, _), _)] =>
50201
c26369c9eda6 Isabelle-specific implementation of quasi-abstract markup elements -- back to module arrangement before d83797ef0d2d;
wenzelm
parents: 49674
diff changeset
   186
        if name = Markup.tokenN then parse_tree tree else decode body
43731
70072780e095 inner syntax supports inlined YXML according to Term_XML (particularly useful for producing text under program control);
wenzelm
parents: 43558
diff changeset
   187
    | [tree as XML.Text _] => parse_tree tree
70072780e095 inner syntax supports inlined YXML according to Term_XML (particularly useful for producing text under program control);
wenzelm
parents: 43558
diff changeset
   188
    | body => decode body)
70072780e095 inner syntax supports inlined YXML according to Term_XML (particularly useful for producing text under program control);
wenzelm
parents: 43558
diff changeset
   189
  end;
70072780e095 inner syntax supports inlined YXML according to Term_XML (particularly useful for producing text under program control);
wenzelm
parents: 43558
diff changeset
   190
39135
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   191
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   192
(* (un)parsing *)
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   193
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   194
val parse_sort = operation #parse_sort;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   195
val parse_typ = operation #parse_typ;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   196
val parse_term = operation #parse_term;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   197
val parse_prop = operation #parse_prop;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   198
val unparse_sort = operation #unparse_sort;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   199
val unparse_typ = operation #unparse_typ;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   200
val unparse_term = operation #unparse_term;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   201
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   202
45429
fd58cbf8cae3 tuned signature;
wenzelm
parents: 45423
diff changeset
   203
(* (un)checking *)
42382
dcd983ee2c29 provide structure Syntax early (before structure Type), back-patch check/uncheck later;
wenzelm
parents: 42360
diff changeset
   204
dcd983ee2c29 provide structure Syntax early (before structure Type), back-patch check/uncheck later;
wenzelm
parents: 42360
diff changeset
   205
val check_typs = operation #check_typs;
dcd983ee2c29 provide structure Syntax early (before structure Type), back-patch check/uncheck later;
wenzelm
parents: 42360
diff changeset
   206
val check_terms = operation #check_terms;
dcd983ee2c29 provide structure Syntax early (before structure Type), back-patch check/uncheck later;
wenzelm
parents: 42360
diff changeset
   207
val check_props = operation #check_props;
39135
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   208
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   209
val check_typ = singleton o check_typs;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   210
val check_term = singleton o check_terms;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   211
val check_prop = singleton o check_props;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   212
42382
dcd983ee2c29 provide structure Syntax early (before structure Type), back-patch check/uncheck later;
wenzelm
parents: 42360
diff changeset
   213
val uncheck_typs = operation #uncheck_typs;
dcd983ee2c29 provide structure Syntax early (before structure Type), back-patch check/uncheck later;
wenzelm
parents: 42360
diff changeset
   214
val uncheck_terms = operation #uncheck_terms;
42402
c7139609b67d simplified check/uncheck interfaces: result comparison is hardwired by default;
wenzelm
parents: 42383
diff changeset
   215
c7139609b67d simplified check/uncheck interfaces: result comparison is hardwired by default;
wenzelm
parents: 42383
diff changeset
   216
c7139609b67d simplified check/uncheck interfaces: result comparison is hardwired by default;
wenzelm
parents: 42383
diff changeset
   217
(* derived operations for algebra of sorts *)
c7139609b67d simplified check/uncheck interfaces: result comparison is hardwired by default;
wenzelm
parents: 42383
diff changeset
   218
c7139609b67d simplified check/uncheck interfaces: result comparison is hardwired by default;
wenzelm
parents: 42383
diff changeset
   219
local
c7139609b67d simplified check/uncheck interfaces: result comparison is hardwired by default;
wenzelm
parents: 42383
diff changeset
   220
c7139609b67d simplified check/uncheck interfaces: result comparison is hardwired by default;
wenzelm
parents: 42383
diff changeset
   221
fun map_sort f S =
c7139609b67d simplified check/uncheck interfaces: result comparison is hardwired by default;
wenzelm
parents: 42383
diff changeset
   222
  (case f (TFree ("", S)) of
c7139609b67d simplified check/uncheck interfaces: result comparison is hardwired by default;
wenzelm
parents: 42383
diff changeset
   223
    TFree ("", S') => S'
c7139609b67d simplified check/uncheck interfaces: result comparison is hardwired by default;
wenzelm
parents: 42383
diff changeset
   224
  | _ => raise TYPE ("map_sort", [TFree ("", S)], []));
c7139609b67d simplified check/uncheck interfaces: result comparison is hardwired by default;
wenzelm
parents: 42383
diff changeset
   225
c7139609b67d simplified check/uncheck interfaces: result comparison is hardwired by default;
wenzelm
parents: 42383
diff changeset
   226
in
c7139609b67d simplified check/uncheck interfaces: result comparison is hardwired by default;
wenzelm
parents: 42383
diff changeset
   227
c7139609b67d simplified check/uncheck interfaces: result comparison is hardwired by default;
wenzelm
parents: 42383
diff changeset
   228
val check_sort = map_sort o check_typ;
39135
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   229
val uncheck_sort = map_sort o singleton o uncheck_typs;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   230
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   231
end;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   232
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   233
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   234
val uncheck_classrel = map o singleton o uncheck_sort;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   235
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   236
fun unparse_classrel ctxt cs = Pretty.block (flat
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   237
  (separate [Pretty.str " <", Pretty.brk 1] (map (single o unparse_sort ctxt o single) cs)));
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   238
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   239
fun uncheck_arity ctxt (a, Ss, S) =
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   240
  let
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   241
    val T = Type (a, replicate (length Ss) dummyT);
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   242
    val a' =
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   243
      (case singleton (uncheck_typs ctxt) T of
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   244
        Type (a', _) => a'
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   245
      | T => raise TYPE ("uncheck_arity", [T], []));
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   246
    val Ss' = map (uncheck_sort ctxt) Ss;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   247
    val S' = uncheck_sort ctxt S;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   248
  in (a', Ss', S') end;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   249
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   250
fun unparse_arity ctxt (a, Ss, S) =
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   251
  let
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   252
    val prtT = unparse_typ ctxt (Type (a, []));
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   253
    val dom =
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   254
      if null Ss then []
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   255
      else [Pretty.list "(" ")" (map (unparse_sort ctxt) Ss), Pretty.brk 1];
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   256
  in Pretty.block ([prtT, Pretty.str " ::", Pretty.brk 1] @ dom @ [unparse_sort ctxt S]) end;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   257
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   258
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   259
(* read = parse + check *)
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   260
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   261
fun read_sort ctxt = parse_sort ctxt #> check_sort ctxt;
46989
88b0a8052c75 added Syntax.read_typs;
wenzelm
parents: 46849
diff changeset
   262
88b0a8052c75 added Syntax.read_typs;
wenzelm
parents: 46849
diff changeset
   263
fun read_typs ctxt =
88b0a8052c75 added Syntax.read_typs;
wenzelm
parents: 46849
diff changeset
   264
  grouped 10 (Par_List.map_name "Syntax.read_typs") (parse_typ ctxt) #> check_typs ctxt;
39135
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   265
46989
88b0a8052c75 added Syntax.read_typs;
wenzelm
parents: 46849
diff changeset
   266
fun read_terms ctxt =
88b0a8052c75 added Syntax.read_typs;
wenzelm
parents: 46849
diff changeset
   267
  grouped 10 (Par_List.map_name "Syntax.read_terms") (parse_term ctxt) #> check_terms ctxt;
39135
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   268
46989
88b0a8052c75 added Syntax.read_typs;
wenzelm
parents: 46849
diff changeset
   269
fun read_props ctxt =
88b0a8052c75 added Syntax.read_typs;
wenzelm
parents: 46849
diff changeset
   270
  grouped 10 (Par_List.map_name "Syntax.read_props") (parse_prop ctxt) #> check_props ctxt;
88b0a8052c75 added Syntax.read_typs;
wenzelm
parents: 46849
diff changeset
   271
88b0a8052c75 added Syntax.read_typs;
wenzelm
parents: 46849
diff changeset
   272
val read_typ = singleton o read_typs;
39135
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   273
val read_term = singleton o read_terms;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   274
val read_prop = singleton o read_props;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   275
42360
da8817d01e7c modernized structure Proof_Context;
wenzelm
parents: 42298
diff changeset
   276
val read_sort_global = read_sort o Proof_Context.init_global;
da8817d01e7c modernized structure Proof_Context;
wenzelm
parents: 42298
diff changeset
   277
val read_typ_global = read_typ o Proof_Context.init_global;
da8817d01e7c modernized structure Proof_Context;
wenzelm
parents: 42298
diff changeset
   278
val read_term_global = read_term o Proof_Context.init_global;
da8817d01e7c modernized structure Proof_Context;
wenzelm
parents: 42298
diff changeset
   279
val read_prop_global = read_prop o Proof_Context.init_global;
39135
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   280
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   281
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   282
(* pretty = uncheck + unparse *)
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   283
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   284
fun pretty_term ctxt = singleton (uncheck_terms ctxt) #> unparse_term ctxt;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   285
fun pretty_typ ctxt = singleton (uncheck_typs ctxt) #> unparse_typ ctxt;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   286
fun pretty_sort ctxt = uncheck_sort ctxt #> unparse_sort ctxt;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   287
fun pretty_classrel ctxt = uncheck_classrel ctxt #> unparse_classrel ctxt;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   288
fun pretty_arity ctxt = uncheck_arity ctxt #> unparse_arity ctxt;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   289
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   290
val string_of_term = Pretty.string_of oo pretty_term;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   291
val string_of_typ = Pretty.string_of oo pretty_typ;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   292
val string_of_sort = Pretty.string_of oo pretty_sort;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   293
val string_of_classrel = Pretty.string_of oo pretty_classrel;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   294
val string_of_arity = Pretty.string_of oo pretty_arity;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   295
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   296
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   297
(* global pretty printing *)
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   298
39508
dfacdb01e1ec simplified some internal flags using Config.T instead of full-blown Proof_Data;
wenzelm
parents: 39507
diff changeset
   299
val pretty_global = Config.bool (Config.declare "Syntax.pretty_global" (K (Config.Bool false)));
dfacdb01e1ec simplified some internal flags using Config.T instead of full-blown Proof_Data;
wenzelm
parents: 39507
diff changeset
   300
fun is_pretty_global ctxt = Config.get ctxt pretty_global;
dfacdb01e1ec simplified some internal flags using Config.T instead of full-blown Proof_Data;
wenzelm
parents: 39507
diff changeset
   301
val set_pretty_global = Config.put pretty_global;
42360
da8817d01e7c modernized structure Proof_Context;
wenzelm
parents: 42298
diff changeset
   302
val init_pretty_global = set_pretty_global true o Proof_Context.init_global;
42383
0ae4ad40d7b5 simplified pretty printing context, which is only required for certain kernel operations;
wenzelm
parents: 42382
diff changeset
   303
val init_pretty = Context.pretty_context init_pretty_global;
39135
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   304
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   305
val pretty_term_global = pretty_term o init_pretty_global;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   306
val pretty_typ_global = pretty_typ o init_pretty_global;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   307
val pretty_sort_global = pretty_sort o init_pretty_global;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   308
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   309
val string_of_term_global = string_of_term o init_pretty_global;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   310
val string_of_typ_global = string_of_typ o init_pretty_global;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   311
val string_of_sort_global = string_of_sort o init_pretty_global;
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   312
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   313
6f5f64542405 structure Syntax: define "interfaces" before actual implementations;
wenzelm
parents: 39126
diff changeset
   314
237
a7d3e712767a MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
wenzelm
parents: 175
diff changeset
   315
(** tables of translation functions **)
a7d3e712767a MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
wenzelm
parents: 175
diff changeset
   316
5692
2e873c5f0e2c no open;
wenzelm
parents: 4887
diff changeset
   317
(* parse (ast) translations *)
2e873c5f0e2c no open;
wenzelm
parents: 4887
diff changeset
   318
23655
d2d1138e0ddc replaced exception TableFun/GraphFun.DUPS by TableFun/GraphFun.DUP;
wenzelm
parents: 23631
diff changeset
   319
fun err_dup_trfun name c =
d2d1138e0ddc replaced exception TableFun/GraphFun.DUPS by TableFun/GraphFun.DUP;
wenzelm
parents: 23631
diff changeset
   320
  error ("More than one " ^ name ^ " for " ^ quote c);
237
a7d3e712767a MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
wenzelm
parents: 175
diff changeset
   321
42253
c539d3c9c023 more abstract syntax translation;
wenzelm
parents: 42251
diff changeset
   322
fun lookup_tr tab c = Option.map fst (Symtab.lookup tab c);
c539d3c9c023 more abstract syntax translation;
wenzelm
parents: 42251
diff changeset
   323
42288
2074b31650e6 discontinued special treatment of structure Syntax_Ext (formerly Syn_Ext);
wenzelm
parents: 42287
diff changeset
   324
fun remove_trtab trfuns = fold (Symtab.remove Syntax_Ext.eq_trfun) trfuns;
21536
f119c730f509 extend_trtab: allow identical trfuns to be overwritten;
wenzelm
parents: 20784
diff changeset
   325
29004
a5a91f387791 removed Table.extend, NameSpace.extend_table
haftmann
parents: 28904
diff changeset
   326
fun update_trtab name trfuns tab = fold Symtab.update_new trfuns (remove_trtab trfuns tab)
23655
d2d1138e0ddc replaced exception TableFun/GraphFun.DUPS by TableFun/GraphFun.DUP;
wenzelm
parents: 23631
diff changeset
   327
  handle Symtab.DUP c => err_dup_trfun name c;
237
a7d3e712767a MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
wenzelm
parents: 175
diff changeset
   328
42288
2074b31650e6 discontinued special treatment of structure Syntax_Ext (formerly Syn_Ext);
wenzelm
parents: 42287
diff changeset
   329
fun merge_trtabs name tab1 tab2 = Symtab.merge Syntax_Ext.eq_trfun (tab1, tab2)
23655
d2d1138e0ddc replaced exception TableFun/GraphFun.DUPS by TableFun/GraphFun.DUP;
wenzelm
parents: 23631
diff changeset
   330
  handle Symtab.DUP c => err_dup_trfun name c;
237
a7d3e712767a MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
wenzelm
parents: 175
diff changeset
   331
a7d3e712767a MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
wenzelm
parents: 175
diff changeset
   332
5692
2e873c5f0e2c no open;
wenzelm
parents: 4887
diff changeset
   333
(* print (ast) translations *)
2e873c5f0e2c no open;
wenzelm
parents: 4887
diff changeset
   334
42254
f427c9890c46 more abstract print translation;
wenzelm
parents: 42253
diff changeset
   335
fun apply_tr' tab c ctxt T args =
f427c9890c46 more abstract print translation;
wenzelm
parents: 42253
diff changeset
   336
  let
f427c9890c46 more abstract print translation;
wenzelm
parents: 42253
diff changeset
   337
    val fns = map fst (Symtab.lookup_list tab c);
f427c9890c46 more abstract print translation;
wenzelm
parents: 42253
diff changeset
   338
    fun app_first [] = raise Match
f427c9890c46 more abstract print translation;
wenzelm
parents: 42253
diff changeset
   339
      | app_first (f :: fs) = f ctxt T args handle Match => app_first fs;
f427c9890c46 more abstract print translation;
wenzelm
parents: 42253
diff changeset
   340
  in app_first fns end;
f427c9890c46 more abstract print translation;
wenzelm
parents: 42253
diff changeset
   341
f427c9890c46 more abstract print translation;
wenzelm
parents: 42253
diff changeset
   342
fun apply_ast_tr' tab c ctxt args =
f427c9890c46 more abstract print translation;
wenzelm
parents: 42253
diff changeset
   343
  let
f427c9890c46 more abstract print translation;
wenzelm
parents: 42253
diff changeset
   344
    val fns = map fst (Symtab.lookup_list tab c);
f427c9890c46 more abstract print translation;
wenzelm
parents: 42253
diff changeset
   345
    fun app_first [] = raise Match
f427c9890c46 more abstract print translation;
wenzelm
parents: 42253
diff changeset
   346
      | app_first (f :: fs) = f ctxt args handle Match => app_first fs;
f427c9890c46 more abstract print translation;
wenzelm
parents: 42253
diff changeset
   347
  in app_first fns end;
42253
c539d3c9c023 more abstract syntax translation;
wenzelm
parents: 42251
diff changeset
   348
42288
2074b31650e6 discontinued special treatment of structure Syntax_Ext (formerly Syn_Ext);
wenzelm
parents: 42287
diff changeset
   349
fun update_tr'tab trfuns = fold_rev (Symtab.update_list Syntax_Ext.eq_trfun) trfuns;
2074b31650e6 discontinued special treatment of structure Syntax_Ext (formerly Syn_Ext);
wenzelm
parents: 42287
diff changeset
   350
fun remove_tr'tab trfuns = fold (Symtab.remove_list Syntax_Ext.eq_trfun) trfuns;
2074b31650e6 discontinued special treatment of structure Syntax_Ext (formerly Syn_Ext);
wenzelm
parents: 42287
diff changeset
   351
fun merge_tr'tabs tab1 tab2 = Symtab.merge_list Syntax_Ext.eq_trfun (tab1, tab2);
5692
2e873c5f0e2c no open;
wenzelm
parents: 4887
diff changeset
   352
2e873c5f0e2c no open;
wenzelm
parents: 4887
diff changeset
   353
237
a7d3e712767a MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
wenzelm
parents: 175
diff changeset
   354
a7d3e712767a MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
wenzelm
parents: 175
diff changeset
   355
(** tables of translation rules **)
a7d3e712767a MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
wenzelm
parents: 175
diff changeset
   356
5692
2e873c5f0e2c no open;
wenzelm
parents: 4887
diff changeset
   357
type ruletab = (Ast.ast * Ast.ast) list Symtab.table;
237
a7d3e712767a MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
wenzelm
parents: 175
diff changeset
   358
19482
9f11af8f7ef9 tuned basic list operators (flat, maps, map_filter);
wenzelm
parents: 19375
diff changeset
   359
fun dest_ruletab tab = maps snd (Symtab.dest tab);
237
a7d3e712767a MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
wenzelm
parents: 175
diff changeset
   360
25394
db25c98f32e1 syntax operations: turned extend'' into update'' (absorb duplicates);
wenzelm
parents: 25387
diff changeset
   361
val update_ruletab = fold_rev (fn r => Symtab.update_list (op =) (Ast.head_of_rule r, r));
18931
427df66052a1 TableFun: renamed xxx_multi to xxx_list;
wenzelm
parents: 18921
diff changeset
   362
val remove_ruletab = fold (fn r => Symtab.remove_list (op =) (Ast.head_of_rule r, r));
427df66052a1 TableFun: renamed xxx_multi to xxx_list;
wenzelm
parents: 18921
diff changeset
   363
fun merge_ruletabs tab1 tab2 = Symtab.merge_list (op =) (tab1, tab2);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   364
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   365
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   366
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   367
(** datatype syntax **)
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   368
237
a7d3e712767a MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
wenzelm
parents: 175
diff changeset
   369
datatype syntax =
a7d3e712767a MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
wenzelm
parents: 175
diff changeset
   370
  Syntax of {
42288
2074b31650e6 discontinued special treatment of structure Syntax_Ext (formerly Syn_Ext);
wenzelm
parents: 42287
diff changeset
   371
    input: Syntax_Ext.xprod list,
4703
a50ab39756db adapted to symbols, scan;
wenzelm
parents: 4618
diff changeset
   372
    lexicon: Scan.lexicon,
45632
b23c42b9f78a prefer Parser.make_gram over Parser.merge_gram, to approximate n-ary merges on theory import;
wenzelm
parents: 45490
diff changeset
   373
    gram: Parser.gram lazy,
42298
d622145603ee more accurate markup for syntax consts, notably binders which point back to the original logical entity;
wenzelm
parents: 42297
diff changeset
   374
    consts: string Symtab.table,
2913
ce271fa4d8e2 fixed diagnostic output of print modes;
wenzelm
parents: 2706
diff changeset
   375
    prmodes: string list,
21772
7c7ade4f537b advanced translation functions: Proof.context;
wenzelm
parents: 21731
diff changeset
   376
    parse_ast_trtab: ((Proof.context -> Ast.ast list -> Ast.ast) * stamp) Symtab.table,
237
a7d3e712767a MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
wenzelm
parents: 175
diff changeset
   377
    parse_ruletab: ruletab,
21772
7c7ade4f537b advanced translation functions: Proof.context;
wenzelm
parents: 21731
diff changeset
   378
    parse_trtab: ((Proof.context -> term list -> term) * stamp) Symtab.table,
42247
12fe41a92cd5 typed_print_translation: discontinued show_sorts argument;
wenzelm
parents: 42245
diff changeset
   379
    print_trtab: ((Proof.context -> typ -> term list -> term) * stamp) list Symtab.table,
237
a7d3e712767a MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
wenzelm
parents: 175
diff changeset
   380
    print_ruletab: ruletab,
21772
7c7ade4f537b advanced translation functions: Proof.context;
wenzelm
parents: 21731
diff changeset
   381
    print_ast_trtab: ((Proof.context -> Ast.ast list -> Ast.ast) * stamp) list Symtab.table,
17079
ce9663987126 added eq_syntax;
wenzelm
parents: 16716
diff changeset
   382
    prtabs: Printer.prtabs} * stamp;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   383
17079
ce9663987126 added eq_syntax;
wenzelm
parents: 16716
diff changeset
   384
fun eq_syntax (Syntax (_, s1), Syntax (_, s2)) = s1 = s2;
ce9663987126 added eq_syntax;
wenzelm
parents: 16716
diff changeset
   385
45632
b23c42b9f78a prefer Parser.make_gram over Parser.merge_gram, to approximate n-ary merges on theory import;
wenzelm
parents: 45490
diff changeset
   386
fun force_syntax (Syntax ({gram, ...}, _)) = ignore (Lazy.force gram);
44802
65c397cc44ec explicit join_syntax ensures command transaction integrity of 'theory';
wenzelm
parents: 44113
diff changeset
   387
42298
d622145603ee more accurate markup for syntax consts, notably binders which point back to the original logical entity;
wenzelm
parents: 42297
diff changeset
   388
fun lookup_const (Syntax ({consts, ...}, _)) = Symtab.lookup consts;
17079
ce9663987126 added eq_syntax;
wenzelm
parents: 16716
diff changeset
   389
fun is_keyword (Syntax ({lexicon, ...}, _)) = Scan.is_literal lexicon o Symbol.explode;
42251
050cc12dd985 explicit Syntax.tokenize, Syntax.parse;
wenzelm
parents: 42247
diff changeset
   390
fun tokenize (Syntax ({lexicon, ...}, _)) = Lexicon.tokenize lexicon;
45641
20ef9135a9fb removed obsolete argument (cf. 954e9d6782ea);
wenzelm
parents: 45632
diff changeset
   391
fun parse (Syntax ({gram, ...}, _)) = Parser.parse (Lazy.force gram);
14687
e089757b952a added is_keyword;
wenzelm
parents: 14648
diff changeset
   392
42253
c539d3c9c023 more abstract syntax translation;
wenzelm
parents: 42251
diff changeset
   393
fun parse_ast_translation (Syntax ({parse_ast_trtab, ...}, _)) = lookup_tr parse_ast_trtab;
c539d3c9c023 more abstract syntax translation;
wenzelm
parents: 42251
diff changeset
   394
fun parse_translation (Syntax ({parse_trtab, ...}, _)) = lookup_tr parse_trtab;
42255
097c93dcd877 eliminated slightly odd Syntax.rep_syntax;
wenzelm
parents: 42254
diff changeset
   395
fun parse_rules (Syntax ({parse_ruletab, ...}, _)) = Symtab.lookup_list parse_ruletab;
42254
f427c9890c46 more abstract print translation;
wenzelm
parents: 42253
diff changeset
   396
fun print_translation (Syntax ({print_trtab, ...}, _)) = apply_tr' print_trtab;
42255
097c93dcd877 eliminated slightly odd Syntax.rep_syntax;
wenzelm
parents: 42254
diff changeset
   397
fun print_rules (Syntax ({print_ruletab, ...}, _)) = Symtab.lookup_list print_ruletab;
42254
f427c9890c46 more abstract print translation;
wenzelm
parents: 42253
diff changeset
   398
fun print_ast_translation (Syntax ({print_ast_trtab, ...}, _)) = apply_ast_tr' print_ast_trtab;
42253
c539d3c9c023 more abstract syntax translation;
wenzelm
parents: 42251
diff changeset
   399
42255
097c93dcd877 eliminated slightly odd Syntax.rep_syntax;
wenzelm
parents: 42254
diff changeset
   400
fun prtabs (Syntax ({prtabs, ...}, _)) = prtabs;
097c93dcd877 eliminated slightly odd Syntax.rep_syntax;
wenzelm
parents: 42254
diff changeset
   401
20784
eece9aaaf352 Syntax.mode;
wenzelm
parents: 20664
diff changeset
   402
type mode = string * bool;
24970
050afeec89a7 renamed Syntax.XXX_mode to Syntax.mode_XXX;
wenzelm
parents: 24923
diff changeset
   403
val mode_default = ("", true);
37146
f652333bbf8e renamed structure PrintMode to Print_Mode, keeping the old name as legacy alias for some time;
wenzelm
parents: 36739
diff changeset
   404
val mode_input = (Print_Mode.input, true);
15755
50ac97ebe7d8 expect translations functions to be stamped already;
wenzelm
parents: 15574
diff changeset
   405
18
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents: 0
diff changeset
   406
237
a7d3e712767a MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
wenzelm
parents: 175
diff changeset
   407
(* empty_syntax *)
18
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents: 0
diff changeset
   408
17079
ce9663987126 added eq_syntax;
wenzelm
parents: 16716
diff changeset
   409
val empty_syntax = Syntax
ce9663987126 added eq_syntax;
wenzelm
parents: 16716
diff changeset
   410
  ({input = [],
4703
a50ab39756db adapted to symbols, scan;
wenzelm
parents: 4618
diff changeset
   411
    lexicon = Scan.empty_lexicon,
45632
b23c42b9f78a prefer Parser.make_gram over Parser.merge_gram, to approximate n-ary merges on theory import;
wenzelm
parents: 45490
diff changeset
   412
    gram = Lazy.value Parser.empty_gram,
42298
d622145603ee more accurate markup for syntax consts, notably binders which point back to the original logical entity;
wenzelm
parents: 42297
diff changeset
   413
    consts = Symtab.empty,
2913
ce271fa4d8e2 fixed diagnostic output of print modes;
wenzelm
parents: 2706
diff changeset
   414
    prmodes = [],
5692
2e873c5f0e2c no open;
wenzelm
parents: 4887
diff changeset
   415
    parse_ast_trtab = Symtab.empty,
2e873c5f0e2c no open;
wenzelm
parents: 4887
diff changeset
   416
    parse_ruletab = Symtab.empty,
2e873c5f0e2c no open;
wenzelm
parents: 4887
diff changeset
   417
    parse_trtab = Symtab.empty,
2e873c5f0e2c no open;
wenzelm
parents: 4887
diff changeset
   418
    print_trtab = Symtab.empty,
2e873c5f0e2c no open;
wenzelm
parents: 4887
diff changeset
   419
    print_ruletab = Symtab.empty,
2e873c5f0e2c no open;
wenzelm
parents: 4887
diff changeset
   420
    print_ast_trtab = Symtab.empty,
17079
ce9663987126 added eq_syntax;
wenzelm
parents: 16716
diff changeset
   421
    prtabs = Printer.empty_prtabs}, stamp ());
167
128e122acc89 added (partial) extend_tables;
wenzelm
parents: 144
diff changeset
   422
128e122acc89 added (partial) extend_tables;
wenzelm
parents: 144
diff changeset
   423
25394
db25c98f32e1 syntax operations: turned extend'' into update'' (absorb duplicates);
wenzelm
parents: 25387
diff changeset
   424
(* update_syntax *)
167
128e122acc89 added (partial) extend_tables;
wenzelm
parents: 144
diff changeset
   425
42298
d622145603ee more accurate markup for syntax consts, notably binders which point back to the original logical entity;
wenzelm
parents: 42297
diff changeset
   426
fun update_const (c, b) tab =
d622145603ee more accurate markup for syntax consts, notably binders which point back to the original logical entity;
wenzelm
parents: 42297
diff changeset
   427
  if c = "" orelse (b = "" andalso (Lexicon.is_marked c orelse Symtab.defined tab c))
d622145603ee more accurate markup for syntax consts, notably binders which point back to the original logical entity;
wenzelm
parents: 42297
diff changeset
   428
  then tab
d622145603ee more accurate markup for syntax consts, notably binders which point back to the original logical entity;
wenzelm
parents: 42297
diff changeset
   429
  else Symtab.update (c, b) tab;
d622145603ee more accurate markup for syntax consts, notably binders which point back to the original logical entity;
wenzelm
parents: 42297
diff changeset
   430
25394
db25c98f32e1 syntax operations: turned extend'' into update'' (absorb duplicates);
wenzelm
parents: 25387
diff changeset
   431
fun update_syntax (mode, inout) syn_ext (Syntax (tabs, _)) =
167
128e122acc89 added (partial) extend_tables;
wenzelm
parents: 144
diff changeset
   432
  let
42268
01401287c3f7 discontinued user-defined token translations;
wenzelm
parents: 42264
diff changeset
   433
    val {input, lexicon, gram, consts = consts1, prmodes, parse_ast_trtab, parse_ruletab,
01401287c3f7 discontinued user-defined token translations;
wenzelm
parents: 42264
diff changeset
   434
      parse_trtab, print_trtab, print_ruletab, print_ast_trtab, prtabs} = tabs;
42288
2074b31650e6 discontinued special treatment of structure Syntax_Ext (formerly Syn_Ext);
wenzelm
parents: 42287
diff changeset
   435
    val Syntax_Ext.Syn_Ext {xprods, consts = consts2, parse_ast_translation,
42268
01401287c3f7 discontinued user-defined token translations;
wenzelm
parents: 42264
diff changeset
   436
      parse_rules, parse_translation, print_translation, print_rules,
01401287c3f7 discontinued user-defined token translations;
wenzelm
parents: 42264
diff changeset
   437
      print_ast_translation} = syn_ext;
36208
74c5e6e3c1d3 update_syntax: add new productions only once, to allow repeated local notation, for example;
wenzelm
parents: 35668
diff changeset
   438
    val new_xprods =
74c5e6e3c1d3 update_syntax: add new productions only once, to allow repeated local notation, for example;
wenzelm
parents: 35668
diff changeset
   439
      if inout then distinct (op =) (filter_out (member (op =) input) xprods) else [];
19546
00d5c7c7ce07 extend/remove_syntax: observe inout flag for translations, too;
wenzelm
parents: 19482
diff changeset
   440
    fun if_inout xs = if inout then xs else [];
167
128e122acc89 added (partial) extend_tables;
wenzelm
parents: 144
diff changeset
   441
  in
17079
ce9663987126 added eq_syntax;
wenzelm
parents: 16716
diff changeset
   442
    Syntax
36208
74c5e6e3c1d3 update_syntax: add new productions only once, to allow repeated local notation, for example;
wenzelm
parents: 35668
diff changeset
   443
    ({input = new_xprods @ input,
42288
2074b31650e6 discontinued special treatment of structure Syntax_Ext (formerly Syn_Ext);
wenzelm
parents: 42287
diff changeset
   444
      lexicon = fold Scan.extend_lexicon (Syntax_Ext.delims_of new_xprods) lexicon,
45632
b23c42b9f78a prefer Parser.make_gram over Parser.merge_gram, to approximate n-ary merges on theory import;
wenzelm
parents: 45490
diff changeset
   445
      gram = Lazy.value (Parser.extend_gram new_xprods (Lazy.force gram)),
42298
d622145603ee more accurate markup for syntax consts, notably binders which point back to the original logical entity;
wenzelm
parents: 42297
diff changeset
   446
      consts = fold update_const consts2 consts1,
42268
01401287c3f7 discontinued user-defined token translations;
wenzelm
parents: 42264
diff changeset
   447
      prmodes = insert (op =) mode prmodes,
167
128e122acc89 added (partial) extend_tables;
wenzelm
parents: 144
diff changeset
   448
      parse_ast_trtab =
25394
db25c98f32e1 syntax operations: turned extend'' into update'' (absorb duplicates);
wenzelm
parents: 25387
diff changeset
   449
        update_trtab "parse ast translation" (if_inout parse_ast_translation) parse_ast_trtab,
db25c98f32e1 syntax operations: turned extend'' into update'' (absorb duplicates);
wenzelm
parents: 25387
diff changeset
   450
      parse_ruletab = update_ruletab (if_inout parse_rules) parse_ruletab,
db25c98f32e1 syntax operations: turned extend'' into update'' (absorb duplicates);
wenzelm
parents: 25387
diff changeset
   451
      parse_trtab = update_trtab "parse translation" (if_inout parse_translation) parse_trtab,
db25c98f32e1 syntax operations: turned extend'' into update'' (absorb duplicates);
wenzelm
parents: 25387
diff changeset
   452
      print_trtab = update_tr'tab print_translation print_trtab,
db25c98f32e1 syntax operations: turned extend'' into update'' (absorb duplicates);
wenzelm
parents: 25387
diff changeset
   453
      print_ruletab = update_ruletab print_rules print_ruletab,
db25c98f32e1 syntax operations: turned extend'' into update'' (absorb duplicates);
wenzelm
parents: 25387
diff changeset
   454
      print_ast_trtab = update_tr'tab print_ast_translation print_ast_trtab,
db25c98f32e1 syntax operations: turned extend'' into update'' (absorb duplicates);
wenzelm
parents: 25387
diff changeset
   455
      prtabs = Printer.update_prtabs mode xprods prtabs}, stamp ())
18
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents: 0
diff changeset
   456
  end;
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents: 0
diff changeset
   457
15755
50ac97ebe7d8 expect translations functions to be stamped already;
wenzelm
parents: 15574
diff changeset
   458
50ac97ebe7d8 expect translations functions to be stamped already;
wenzelm
parents: 15574
diff changeset
   459
(* remove_syntax *)
50ac97ebe7d8 expect translations functions to be stamped already;
wenzelm
parents: 15574
diff changeset
   460
17079
ce9663987126 added eq_syntax;
wenzelm
parents: 16716
diff changeset
   461
fun remove_syntax (mode, inout) syn_ext (Syntax (tabs, _)) =
15755
50ac97ebe7d8 expect translations functions to be stamped already;
wenzelm
parents: 15574
diff changeset
   462
  let
42288
2074b31650e6 discontinued special treatment of structure Syntax_Ext (formerly Syn_Ext);
wenzelm
parents: 42287
diff changeset
   463
    val Syntax_Ext.Syn_Ext {xprods, consts = _, parse_ast_translation, parse_rules,
42268
01401287c3f7 discontinued user-defined token translations;
wenzelm
parents: 42264
diff changeset
   464
      parse_translation, print_translation, print_rules, print_ast_translation} = syn_ext;
01401287c3f7 discontinued user-defined token translations;
wenzelm
parents: 42264
diff changeset
   465
    val {input, lexicon, gram, consts, prmodes, parse_ast_trtab, parse_ruletab,
01401287c3f7 discontinued user-defined token translations;
wenzelm
parents: 42264
diff changeset
   466
      parse_trtab, print_trtab, print_ruletab, print_ast_trtab, prtabs} = tabs;
19300
7689f81f8996 subtract (op =);
wenzelm
parents: 19262
diff changeset
   467
    val input' = if inout then subtract (op =) xprods input else input;
25394
db25c98f32e1 syntax operations: turned extend'' into update'' (absorb duplicates);
wenzelm
parents: 25387
diff changeset
   468
    val changed = length input <> length input';
19546
00d5c7c7ce07 extend/remove_syntax: observe inout flag for translations, too;
wenzelm
parents: 19482
diff changeset
   469
    fun if_inout xs = if inout then xs else [];
15755
50ac97ebe7d8 expect translations functions to be stamped already;
wenzelm
parents: 15574
diff changeset
   470
  in
17079
ce9663987126 added eq_syntax;
wenzelm
parents: 16716
diff changeset
   471
    Syntax
ce9663987126 added eq_syntax;
wenzelm
parents: 16716
diff changeset
   472
    ({input = input',
42288
2074b31650e6 discontinued special treatment of structure Syntax_Ext (formerly Syn_Ext);
wenzelm
parents: 42287
diff changeset
   473
      lexicon = if changed then Scan.make_lexicon (Syntax_Ext.delims_of input') else lexicon,
45632
b23c42b9f78a prefer Parser.make_gram over Parser.merge_gram, to approximate n-ary merges on theory import;
wenzelm
parents: 45490
diff changeset
   474
      gram = if changed then Lazy.value (Parser.make_gram input') else gram,
15755
50ac97ebe7d8 expect translations functions to be stamped already;
wenzelm
parents: 15574
diff changeset
   475
      consts = consts,
50ac97ebe7d8 expect translations functions to be stamped already;
wenzelm
parents: 15574
diff changeset
   476
      prmodes = prmodes,
19546
00d5c7c7ce07 extend/remove_syntax: observe inout flag for translations, too;
wenzelm
parents: 19482
diff changeset
   477
      parse_ast_trtab = remove_trtab (if_inout parse_ast_translation) parse_ast_trtab,
00d5c7c7ce07 extend/remove_syntax: observe inout flag for translations, too;
wenzelm
parents: 19482
diff changeset
   478
      parse_ruletab = remove_ruletab (if_inout parse_rules) parse_ruletab,
00d5c7c7ce07 extend/remove_syntax: observe inout flag for translations, too;
wenzelm
parents: 19482
diff changeset
   479
      parse_trtab = remove_trtab (if_inout parse_translation) parse_trtab,
15755
50ac97ebe7d8 expect translations functions to be stamped already;
wenzelm
parents: 15574
diff changeset
   480
      print_trtab = remove_tr'tab print_translation print_trtab,
50ac97ebe7d8 expect translations functions to be stamped already;
wenzelm
parents: 15574
diff changeset
   481
      print_ruletab = remove_ruletab print_rules print_ruletab,
50ac97ebe7d8 expect translations functions to be stamped already;
wenzelm
parents: 15574
diff changeset
   482
      print_ast_trtab = remove_tr'tab print_ast_translation print_ast_trtab,
17079
ce9663987126 added eq_syntax;
wenzelm
parents: 16716
diff changeset
   483
      prtabs = Printer.remove_prtabs mode xprods prtabs}, stamp ())
15755
50ac97ebe7d8 expect translations functions to be stamped already;
wenzelm
parents: 15574
diff changeset
   484
  end;
14904
7d8dc92fcb7f removed separate logtypes field of syntax; removed test_read, simple_str_of_sort, simple_string_of_typ; provide default_mode;
wenzelm
parents: 14798
diff changeset
   485
18
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents: 0
diff changeset
   486
45632
b23c42b9f78a prefer Parser.make_gram over Parser.merge_gram, to approximate n-ary merges on theory import;
wenzelm
parents: 45490
diff changeset
   487
(* merge_syntax *)
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   488
45632
b23c42b9f78a prefer Parser.make_gram over Parser.merge_gram, to approximate n-ary merges on theory import;
wenzelm
parents: 45490
diff changeset
   489
fun merge_syntax (Syntax (tabs1, _), Syntax (tabs2, _)) =
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   490
  let
15755
50ac97ebe7d8 expect translations functions to be stamped already;
wenzelm
parents: 15574
diff changeset
   491
    val {input = input1, lexicon = lexicon1, gram = gram1, consts = consts1,
42268
01401287c3f7 discontinued user-defined token translations;
wenzelm
parents: 42264
diff changeset
   492
      prmodes = prmodes1, parse_ast_trtab = parse_ast_trtab1, parse_ruletab = parse_ruletab1,
01401287c3f7 discontinued user-defined token translations;
wenzelm
parents: 42264
diff changeset
   493
      parse_trtab = parse_trtab1, print_trtab = print_trtab1, print_ruletab = print_ruletab1,
01401287c3f7 discontinued user-defined token translations;
wenzelm
parents: 42264
diff changeset
   494
      print_ast_trtab = print_ast_trtab1, prtabs = prtabs1} = tabs1;
237
a7d3e712767a MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
wenzelm
parents: 175
diff changeset
   495
15755
50ac97ebe7d8 expect translations functions to be stamped already;
wenzelm
parents: 15574
diff changeset
   496
    val {input = input2, lexicon = lexicon2, gram = gram2, consts = consts2,
42268
01401287c3f7 discontinued user-defined token translations;
wenzelm
parents: 42264
diff changeset
   497
      prmodes = prmodes2, parse_ast_trtab = parse_ast_trtab2, parse_ruletab = parse_ruletab2,
01401287c3f7 discontinued user-defined token translations;
wenzelm
parents: 42264
diff changeset
   498
      parse_trtab = parse_trtab2, print_trtab = print_trtab2, print_ruletab = print_ruletab2,
01401287c3f7 discontinued user-defined token translations;
wenzelm
parents: 42264
diff changeset
   499
      print_ast_trtab = print_ast_trtab2, prtabs = prtabs2} = tabs2;
45632
b23c42b9f78a prefer Parser.make_gram over Parser.merge_gram, to approximate n-ary merges on theory import;
wenzelm
parents: 45490
diff changeset
   500
b23c42b9f78a prefer Parser.make_gram over Parser.merge_gram, to approximate n-ary merges on theory import;
wenzelm
parents: 45490
diff changeset
   501
    val (input', gram') =
b23c42b9f78a prefer Parser.make_gram over Parser.merge_gram, to approximate n-ary merges on theory import;
wenzelm
parents: 45490
diff changeset
   502
      (case subtract (op =) input1 input2 of
b23c42b9f78a prefer Parser.make_gram over Parser.merge_gram, to approximate n-ary merges on theory import;
wenzelm
parents: 45490
diff changeset
   503
        [] => (input1, gram1)
b23c42b9f78a prefer Parser.make_gram over Parser.merge_gram, to approximate n-ary merges on theory import;
wenzelm
parents: 45490
diff changeset
   504
      | new_xprods2 =>
b23c42b9f78a prefer Parser.make_gram over Parser.merge_gram, to approximate n-ary merges on theory import;
wenzelm
parents: 45490
diff changeset
   505
          if subset (op =) (input1, input2) then (input2, gram2)
b23c42b9f78a prefer Parser.make_gram over Parser.merge_gram, to approximate n-ary merges on theory import;
wenzelm
parents: 45490
diff changeset
   506
          else
b23c42b9f78a prefer Parser.make_gram over Parser.merge_gram, to approximate n-ary merges on theory import;
wenzelm
parents: 45490
diff changeset
   507
            let
b23c42b9f78a prefer Parser.make_gram over Parser.merge_gram, to approximate n-ary merges on theory import;
wenzelm
parents: 45490
diff changeset
   508
              val input' = new_xprods2 @ input1;
b23c42b9f78a prefer Parser.make_gram over Parser.merge_gram, to approximate n-ary merges on theory import;
wenzelm
parents: 45490
diff changeset
   509
              val gram' = Lazy.lazy (fn () => Parser.make_gram input');
b23c42b9f78a prefer Parser.make_gram over Parser.merge_gram, to approximate n-ary merges on theory import;
wenzelm
parents: 45490
diff changeset
   510
            in (input', gram') end);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   511
  in
17079
ce9663987126 added eq_syntax;
wenzelm
parents: 16716
diff changeset
   512
    Syntax
45632
b23c42b9f78a prefer Parser.make_gram over Parser.merge_gram, to approximate n-ary merges on theory import;
wenzelm
parents: 45490
diff changeset
   513
    ({input = input',
27768
398c64b2acef adapted Scan.extend_lexicon/merge_lexicons;
wenzelm
parents: 27265
diff changeset
   514
      lexicon = Scan.merge_lexicons (lexicon1, lexicon2),
45632
b23c42b9f78a prefer Parser.make_gram over Parser.merge_gram, to approximate n-ary merges on theory import;
wenzelm
parents: 45490
diff changeset
   515
      gram = gram',
42298
d622145603ee more accurate markup for syntax consts, notably binders which point back to the original logical entity;
wenzelm
parents: 42297
diff changeset
   516
      consts = Symtab.merge (K true) (consts1, consts2),
18921
f47c46d7d654 canonical member/insert/merge;
wenzelm
parents: 18857
diff changeset
   517
      prmodes = Library.merge (op =) (prmodes1, prmodes2),
237
a7d3e712767a MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
wenzelm
parents: 175
diff changeset
   518
      parse_ast_trtab =
15755
50ac97ebe7d8 expect translations functions to be stamped already;
wenzelm
parents: 15574
diff changeset
   519
        merge_trtabs "parse ast translation" parse_ast_trtab1 parse_ast_trtab2,
237
a7d3e712767a MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
wenzelm
parents: 175
diff changeset
   520
      parse_ruletab = merge_ruletabs parse_ruletab1 parse_ruletab2,
15755
50ac97ebe7d8 expect translations functions to be stamped already;
wenzelm
parents: 15574
diff changeset
   521
      parse_trtab = merge_trtabs "parse translation" parse_trtab1 parse_trtab2,
5692
2e873c5f0e2c no open;
wenzelm
parents: 4887
diff changeset
   522
      print_trtab = merge_tr'tabs print_trtab1 print_trtab2,
237
a7d3e712767a MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
wenzelm
parents: 175
diff changeset
   523
      print_ruletab = merge_ruletabs print_ruletab1 print_ruletab2,
5692
2e873c5f0e2c no open;
wenzelm
parents: 4887
diff changeset
   524
      print_ast_trtab = merge_tr'tabs print_ast_trtab1 print_ast_trtab2,
17079
ce9663987126 added eq_syntax;
wenzelm
parents: 16716
diff changeset
   525
      prtabs = Printer.merge_prtabs prtabs1 prtabs2}, stamp ())
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   526
  end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   527
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   528
4887
bbc13af86c16 added trfun_names;
wenzelm
parents: 4703
diff changeset
   529
15759
wenzelm
parents: 15755
diff changeset
   530
(** print syntax **)
wenzelm
parents: 15755
diff changeset
   531
wenzelm
parents: 15755
diff changeset
   532
local
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   533
260
967813b8a7bf added simple_string_of_typ, simple_pprint_typ;
wenzelm
parents: 237
diff changeset
   534
fun pretty_strs_qs name strs =
28840
wenzelm
parents: 28413
diff changeset
   535
  Pretty.strs (name :: map quote (sort_strings strs));
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   536
17079
ce9663987126 added eq_syntax;
wenzelm
parents: 16716
diff changeset
   537
fun pretty_gram (Syntax (tabs, _)) =
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   538
  let
32784
1a5dde5079ac eliminated redundant bindings;
wenzelm
parents: 32738
diff changeset
   539
    val {lexicon, prmodes, gram, ...} = tabs;
28375
c879d88d038a eliminated polymorphic equality;
wenzelm
parents: 27889
diff changeset
   540
    val prmodes' = sort_strings (filter_out (fn s => s = "") prmodes);
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   541
  in
8720
840c75ab2a7f Pretty.chunks;
wenzelm
parents: 7944
diff changeset
   542
    [pretty_strs_qs "lexicon:" (Scan.dest_lexicon lexicon),
45632
b23c42b9f78a prefer Parser.make_gram over Parser.merge_gram, to approximate n-ary merges on theory import;
wenzelm
parents: 45490
diff changeset
   543
      Pretty.big_list "prods:" (Parser.pretty_gram (Lazy.force gram)),
8720
840c75ab2a7f Pretty.chunks;
wenzelm
parents: 7944
diff changeset
   544
      pretty_strs_qs "print modes:" prmodes']
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   545
  end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   546
17079
ce9663987126 added eq_syntax;
wenzelm
parents: 16716
diff changeset
   547
fun pretty_trans (Syntax (tabs, _)) =
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   548
  let
42298
d622145603ee more accurate markup for syntax consts, notably binders which point back to the original logical entity;
wenzelm
parents: 42297
diff changeset
   549
    fun pretty_tab name tab =
d622145603ee more accurate markup for syntax consts, notably binders which point back to the original logical entity;
wenzelm
parents: 42297
diff changeset
   550
      pretty_strs_qs name (sort_strings (Symtab.keys tab));
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   551
260
967813b8a7bf added simple_string_of_typ, simple_pprint_typ;
wenzelm
parents: 237
diff changeset
   552
    fun pretty_ruletab name tab =
51580
64ef8260dc60 Pretty.item markup for improved readability of lists of items;
wenzelm
parents: 50201
diff changeset
   553
      Pretty.big_list name (map (Pretty.item o single o Ast.pretty_rule) (dest_ruletab tab));
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   554
237
a7d3e712767a MAJOR INTERNAL CHANGE: extend and merge operations of syntax tables
wenzelm
parents: 175
diff changeset
   555
    val {consts, parse_ast_trtab, parse_ruletab, parse_trtab, print_trtab,
42268
01401287c3f7 discontinued user-defined token translations;
wenzelm
parents: 42264
diff changeset
   556
      print_ruletab, print_ast_trtab, ...} = tabs;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   557
  in
42298
d622145603ee more accurate markup for syntax consts, notably binders which point back to the original logical entity;
wenzelm
parents: 42297
diff changeset
   558
   [pretty_tab "consts:" consts,
d622145603ee more accurate markup for syntax consts, notably binders which point back to the original logical entity;
wenzelm
parents: 42297
diff changeset
   559
    pretty_tab "parse_ast_translation:" parse_ast_trtab,
d622145603ee more accurate markup for syntax consts, notably binders which point back to the original logical entity;
wenzelm
parents: 42297
diff changeset
   560
    pretty_ruletab "parse_rules:" parse_ruletab,
d622145603ee more accurate markup for syntax consts, notably binders which point back to the original logical entity;
wenzelm
parents: 42297
diff changeset
   561
    pretty_tab "parse_translation:" parse_trtab,
d622145603ee more accurate markup for syntax consts, notably binders which point back to the original logical entity;
wenzelm
parents: 42297
diff changeset
   562
    pretty_tab "print_translation:" print_trtab,
d622145603ee more accurate markup for syntax consts, notably binders which point back to the original logical entity;
wenzelm
parents: 42297
diff changeset
   563
    pretty_ruletab "print_rules:" print_ruletab,
d622145603ee more accurate markup for syntax consts, notably binders which point back to the original logical entity;
wenzelm
parents: 42297
diff changeset
   564
    pretty_tab "print_ast_translation:" print_ast_trtab]
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   565
  end;
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   566
15759
wenzelm
parents: 15755
diff changeset
   567
in
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   568
15759
wenzelm
parents: 15755
diff changeset
   569
fun print_gram syn = Pretty.writeln (Pretty.chunks (pretty_gram syn));
wenzelm
parents: 15755
diff changeset
   570
fun print_trans syn = Pretty.writeln (Pretty.chunks (pretty_trans syn));
wenzelm
parents: 15755
diff changeset
   571
fun print_syntax syn = Pretty.writeln (Pretty.chunks (pretty_gram syn @ pretty_trans syn));
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   572
15759
wenzelm
parents: 15755
diff changeset
   573
end;
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   574
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   575
26951
030e4a818b39 moved global pretty/string_of functions from Sign to Syntax;
wenzelm
parents: 26704
diff changeset
   576
(* reconstructing infixes -- educated guessing *)
030e4a818b39 moved global pretty/string_of functions from Sign to Syntax;
wenzelm
parents: 26704
diff changeset
   577
030e4a818b39 moved global pretty/string_of functions from Sign to Syntax;
wenzelm
parents: 26704
diff changeset
   578
fun guess_infix (Syntax ({gram, ...}, _)) c =
45632
b23c42b9f78a prefer Parser.make_gram over Parser.merge_gram, to approximate n-ary merges on theory import;
wenzelm
parents: 45490
diff changeset
   579
  (case Parser.guess_infix_lr (Lazy.force gram) c of
26951
030e4a818b39 moved global pretty/string_of functions from Sign to Syntax;
wenzelm
parents: 26704
diff changeset
   580
    SOME (s, l, r, j) => SOME
35130
0991c84e8dcf renamed InfixName to Infix etc.;
wenzelm
parents: 35111
diff changeset
   581
     (if l then Mixfix.Infixl (s, j)
0991c84e8dcf renamed InfixName to Infix etc.;
wenzelm
parents: 35111
diff changeset
   582
      else if r then Mixfix.Infixr (s, j)
0991c84e8dcf renamed InfixName to Infix etc.;
wenzelm
parents: 35111
diff changeset
   583
      else Mixfix.Infix (s, j))
26951
030e4a818b39 moved global pretty/string_of functions from Sign to Syntax;
wenzelm
parents: 26704
diff changeset
   584
  | NONE => NONE);
030e4a818b39 moved global pretty/string_of functions from Sign to Syntax;
wenzelm
parents: 26704
diff changeset
   585
030e4a818b39 moved global pretty/string_of functions from Sign to Syntax;
wenzelm
parents: 26704
diff changeset
   586
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   587
1158
96804ce95516 added extend_trrules_i;
wenzelm
parents: 1147
diff changeset
   588
(** prepare translation rules **)
96804ce95516 added extend_trrules_i;
wenzelm
parents: 1147
diff changeset
   589
42204
b3277168c1e7 added Position.reports convenience;
wenzelm
parents: 42134
diff changeset
   590
(* rules *)
b3277168c1e7 added Position.reports convenience;
wenzelm
parents: 42134
diff changeset
   591
1158
96804ce95516 added extend_trrules_i;
wenzelm
parents: 1147
diff changeset
   592
datatype 'a trrule =
42204
b3277168c1e7 added Position.reports convenience;
wenzelm
parents: 42134
diff changeset
   593
  Parse_Rule of 'a * 'a |
b3277168c1e7 added Position.reports convenience;
wenzelm
parents: 42134
diff changeset
   594
  Print_Rule of 'a * 'a |
b3277168c1e7 added Position.reports convenience;
wenzelm
parents: 42134
diff changeset
   595
  Parse_Print_Rule of 'a * 'a;
888
3a1de9454d13 improved read_xrules: patterns no longer read twice;
wenzelm
parents: 882
diff changeset
   596
42204
b3277168c1e7 added Position.reports convenience;
wenzelm
parents: 42134
diff changeset
   597
fun map_trrule f (Parse_Rule (x, y)) = Parse_Rule (f x, f y)
b3277168c1e7 added Position.reports convenience;
wenzelm
parents: 42134
diff changeset
   598
  | map_trrule f (Print_Rule (x, y)) = Print_Rule (f x, f y)
b3277168c1e7 added Position.reports convenience;
wenzelm
parents: 42134
diff changeset
   599
  | map_trrule f (Parse_Print_Rule (x, y)) = Parse_Print_Rule (f x, f y);
1158
96804ce95516 added extend_trrules_i;
wenzelm
parents: 1147
diff changeset
   600
42204
b3277168c1e7 added Position.reports convenience;
wenzelm
parents: 42134
diff changeset
   601
fun parse_rule (Parse_Rule pats) = SOME pats
b3277168c1e7 added Position.reports convenience;
wenzelm
parents: 42134
diff changeset
   602
  | parse_rule (Print_Rule _) = NONE
b3277168c1e7 added Position.reports convenience;
wenzelm
parents: 42134
diff changeset
   603
  | parse_rule (Parse_Print_Rule pats) = SOME pats;
1158
96804ce95516 added extend_trrules_i;
wenzelm
parents: 1147
diff changeset
   604
42204
b3277168c1e7 added Position.reports convenience;
wenzelm
parents: 42134
diff changeset
   605
fun print_rule (Parse_Rule _) = NONE
b3277168c1e7 added Position.reports convenience;
wenzelm
parents: 42134
diff changeset
   606
  | print_rule (Print_Rule pats) = SOME (swap pats)
b3277168c1e7 added Position.reports convenience;
wenzelm
parents: 42134
diff changeset
   607
  | print_rule (Parse_Print_Rule pats) = SOME (swap pats);
1158
96804ce95516 added extend_trrules_i;
wenzelm
parents: 1147
diff changeset
   608
96804ce95516 added extend_trrules_i;
wenzelm
parents: 1147
diff changeset
   609
42204
b3277168c1e7 added Position.reports convenience;
wenzelm
parents: 42134
diff changeset
   610
(* check_rules *)
b3277168c1e7 added Position.reports convenience;
wenzelm
parents: 42134
diff changeset
   611
19262
b98b48496819 added remove_trrules(_i);
wenzelm
parents: 19046
diff changeset
   612
local
b98b48496819 added remove_trrules(_i);
wenzelm
parents: 19046
diff changeset
   613
42048
afd11ca8e018 support for encoded positions (for id_position, longid_position) as pseudo type-constraints -- still inactive;
wenzelm
parents: 42044
diff changeset
   614
fun check_rule rule =
5692
2e873c5f0e2c no open;
wenzelm
parents: 4887
diff changeset
   615
  (case Ast.rule_error rule of
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 14981
diff changeset
   616
    SOME msg =>
1158
96804ce95516 added extend_trrules_i;
wenzelm
parents: 1147
diff changeset
   617
      error ("Error in syntax translation rule: " ^ msg ^ "\n" ^
42048
afd11ca8e018 support for encoded positions (for id_position, longid_position) as pseudo type-constraints -- still inactive;
wenzelm
parents: 42044
diff changeset
   618
        Pretty.string_of (Ast.pretty_rule rule))
15531
08c8dad8e399 Deleted Library.option type.
skalberg
parents: 14981
diff changeset
   619
  | NONE => rule);
888
3a1de9454d13 improved read_xrules: patterns no longer read twice;
wenzelm
parents: 882
diff changeset
   620
42204
b3277168c1e7 added Position.reports convenience;
wenzelm
parents: 42134
diff changeset
   621
in
b3277168c1e7 added Position.reports convenience;
wenzelm
parents: 42134
diff changeset
   622
b3277168c1e7 added Position.reports convenience;
wenzelm
parents: 42134
diff changeset
   623
fun check_rules rules =
b3277168c1e7 added Position.reports convenience;
wenzelm
parents: 42134
diff changeset
   624
 (map check_rule (map_filter parse_rule rules),
b3277168c1e7 added Position.reports convenience;
wenzelm
parents: 42134
diff changeset
   625
  map check_rule (map_filter print_rule rules));
b3277168c1e7 added Position.reports convenience;
wenzelm
parents: 42134
diff changeset
   626
b3277168c1e7 added Position.reports convenience;
wenzelm
parents: 42134
diff changeset
   627
end;
b3277168c1e7 added Position.reports convenience;
wenzelm
parents: 42134
diff changeset
   628
b3277168c1e7 added Position.reports convenience;
wenzelm
parents: 42134
diff changeset
   629
18
c9ec452ff08f lots of internal cleaning and tuning;
wenzelm
parents: 0
diff changeset
   630
19262
b98b48496819 added remove_trrules(_i);
wenzelm
parents: 19046
diff changeset
   631
(** modify syntax **)
383
fcea89074e4c added incremental extension functions: extend_log_types, extend_type_gram,
wenzelm
parents: 330
diff changeset
   632
52143
36ffe23b25f8 syntax translations always depend on context;
wenzelm
parents: 51612
diff changeset
   633
val update_trfuns = update_syntax mode_default o Syntax_Ext.syn_ext_trfuns;
5692
2e873c5f0e2c no open;
wenzelm
parents: 4887
diff changeset
   634
35412
b8dead547d9e more uniform treatment of syntax for types vs. consts;
wenzelm
parents: 35394
diff changeset
   635
fun update_type_gram add prmode decls =
b8dead547d9e more uniform treatment of syntax for types vs. consts;
wenzelm
parents: 35394
diff changeset
   636
  (if add then update_syntax else remove_syntax) prmode (Mixfix.syn_ext_types decls);
25387
d9ab1e3a8acb added update_const_gram (avoids duplicates);
wenzelm
parents: 25122
diff changeset
   637
35412
b8dead547d9e more uniform treatment of syntax for types vs. consts;
wenzelm
parents: 35394
diff changeset
   638
fun update_const_gram add is_logtype prmode decls =
b8dead547d9e more uniform treatment of syntax for types vs. consts;
wenzelm
parents: 35394
diff changeset
   639
  (if add then update_syntax else remove_syntax) prmode (Mixfix.syn_ext_consts is_logtype decls);
15755
50ac97ebe7d8 expect translations functions to be stamped already;
wenzelm
parents: 15574
diff changeset
   640
52143
36ffe23b25f8 syntax translations always depend on context;
wenzelm
parents: 51612
diff changeset
   641
val update_trrules = update_syntax mode_default o Syntax_Ext.syn_ext_rules o check_rules;
42288
2074b31650e6 discontinued special treatment of structure Syntax_Ext (formerly Syn_Ext);
wenzelm
parents: 42287
diff changeset
   642
val remove_trrules = remove_syntax mode_default o Syntax_Ext.syn_ext_rules o check_rules;
5692
2e873c5f0e2c no open;
wenzelm
parents: 4887
diff changeset
   643
42476
d0bc1268ef09 clarified auxiliary structure Lexicon.Syntax;
wenzelm
parents: 42408
diff changeset
   644
d0bc1268ef09 clarified auxiliary structure Lexicon.Syntax;
wenzelm
parents: 42408
diff changeset
   645
open Lexicon.Syntax;
d0bc1268ef09 clarified auxiliary structure Lexicon.Syntax;
wenzelm
parents: 42408
diff changeset
   646
0
a5a9c433f639 Initial revision
clasohm
parents:
diff changeset
   647
end;
5692
2e873c5f0e2c no open;
wenzelm
parents: 4887
diff changeset
   648