103
|
1 |
|
|
2 |
Hints
|
|
3 |
=====
|
|
4 |
|
|
5 |
This is an incomprehensive list of facts about the new version of the syntax
|
|
6 |
module (the macro system).
|
|
7 |
|
|
8 |
|
|
9 |
- Syntax of "translations" section is list of <xrule> where: (metachars: [ | ])
|
|
10 |
|
|
11 |
<xrule> ::= [(<id>)] <string> [ => | <= | == ] [(<id>)] <string>
|
|
12 |
|
|
13 |
One such line specifies a parse rule (=>) or a print rule (<=) or both (==).
|
|
14 |
The optional <id> before each <string> specifies the name of the syntactic
|
|
15 |
category to be used for parsing the string; the default is logic. Note that
|
|
16 |
this has no influence on the applicability of rules.
|
|
17 |
|
|
18 |
Example:
|
|
19 |
|
|
20 |
translations
|
|
21 |
(prop) "x:X" == (prop) "|- x:X"
|
|
22 |
"Lam x:A.B" == "Abs(A, %x.B)"
|
|
23 |
"Pi x:A.B" => "Prod(A, %x.B)"
|
|
24 |
|
|
25 |
All rules of a theory will be shown in their internal (ast * ast) form by
|
|
26 |
Syntax.print_trans.
|
|
27 |
|
|
28 |
- Caveat: rewrite rules know no "context" nor "semantics", e.g. something
|
|
29 |
like "('a, Nil)Cons", "% Nil Cons. Cons(a, Nil)" or "Cons(a, [])" will be
|
|
30 |
rewritten by the rules "[x]" <= "Cons(x, [])", "[]" <= "Nil"; (this is a
|
|
31 |
general problem with macro systems);
|
|
32 |
|
|
33 |
- syn_of: theory -> Syntax.syntax
|
|
34 |
|
|
35 |
- Syntax.print_gram shows grammer of syntax
|
|
36 |
|
|
37 |
- Syntax.print_trans shows translations of syntax
|
|
38 |
|
|
39 |
- Syntax.print_syntax shows grammer and translations of syntax
|
|
40 |
|
|
41 |
- Ast.stat_normalize := true enables output of statistics after normalizing;
|
|
42 |
|
|
43 |
- Ast.trace_normalize := true enables verbose output while normalizing and
|
|
44 |
statistics;
|
|
45 |
|
|
46 |
- eta_contract := false disables eta contraction when printing terms;
|
|
47 |
|
|
48 |
- asts: (see also Pure/Syntax/ast.ML *)
|
|
49 |
|
|
50 |
(*Asts come in two flavours:
|
|
51 |
- proper asts representing terms and types: Variables are treated like
|
|
52 |
Constants;
|
|
53 |
- patterns used as lhs and rhs in rules: Variables are placeholders for
|
|
54 |
proper asts.*)
|
|
55 |
|
|
56 |
datatype ast =
|
|
57 |
Constant of string | (* "not", "_%", "fun" *)
|
|
58 |
Variable of string | (* x, ?x, 'a, ?'a *)
|
|
59 |
Appl of ast list; (* (f x y z), ("fun" 'a 'b) *)
|
|
60 |
|
|
61 |
(*the list of subasts of an Appl node has to contain at least 2 elements, i.e.
|
|
62 |
there are no empty asts or nullary applications; use mk_appl for convenience*)
|
|
63 |
|
|
64 |
- ast output style:
|
|
65 |
Constant a -> "a"
|
|
66 |
Variable a -> a
|
|
67 |
Appl [ast1, ..., astn] -> (ast1 ... astn)
|
|
68 |
|
|
69 |
- sext: (see also Pure/Syntax/sextension.ML)
|
|
70 |
|
|
71 |
(** datatype sext **)
|
|
72 |
|
|
73 |
datatype xrule =
|
|
74 |
op |-> of (string * string) * (string * string) |
|
|
75 |
op <-| of (string * string) * (string * string) |
|
|
76 |
op <-> of (string * string) * (string * string);
|
|
77 |
|
|
78 |
datatype sext =
|
|
79 |
Sext of {
|
|
80 |
mixfix: mixfix list,
|
|
81 |
parse_translation: (string * (term list -> term)) list,
|
|
82 |
print_translation: (string * (term list -> term)) list} |
|
|
83 |
NewSext of {
|
|
84 |
mixfix: mixfix list,
|
|
85 |
xrules: xrule list,
|
|
86 |
parse_ast_translation: (string * (ast list -> ast)) list,
|
|
87 |
parse_preproc: (ast -> ast) option,
|
|
88 |
parse_postproc: (ast -> ast) option,
|
|
89 |
parse_translation: (string * (term list -> term)) list,
|
|
90 |
print_translation: (string * (term list -> term)) list,
|
|
91 |
print_preproc: (ast -> ast) option,
|
|
92 |
print_postproc: (ast -> ast) option,
|
|
93 |
print_ast_translation: (string * (ast list -> ast)) list};
|
|
94 |
|
|
95 |
- local (thy, ext) order of rules is preserved, global (merge) order is
|
|
96 |
unspecified;
|
|
97 |
|
|
98 |
- read asts contain a mixture of Constant and Variable atoms (some
|
|
99 |
Variables become Const later);
|
|
100 |
|
|
101 |
- *.thy-file/ML-section: all declarations will be exported, therefore
|
|
102 |
one should use local-in-end constructs where appropriate; especially
|
|
103 |
the examples in Logics/Defining could be better behaved;
|
|
104 |
|
|
105 |
- [document the asts generated by the standard syntactic categories
|
|
106 |
(idt, idts, args, ...)];
|
|
107 |
|
|
108 |
- print(_ast)_translation: the constant has to disappear or execption
|
|
109 |
Match raised, otherwise the printer will not terminate;
|
|
110 |
|
|
111 |
- binders are implemented traditionally, i.e. as parse/print_translations
|
|
112 |
(compatibility, alpha, eta, HOL hack easy);
|
|
113 |
|
|
114 |
- changes to the term/ast "parsetree" structure: renamed most constants
|
|
115 |
(_args, _idts, ...), unified typ applications, _tapp/_tappl, type atoms
|
|
116 |
no Const rather than Free;
|
|
117 |
|
|
118 |
- misfeature: eta-contraction before rewriting therefore bounded quantifiers,
|
|
119 |
Collect etc. may fall back to internal form;
|
|
120 |
|
|
121 |
- changes and fixes to printing of types:
|
|
122 |
|
|
123 |
"'a => 'b => 'c" now printed as "['a,'b] => 'c";
|
|
124 |
|
|
125 |
constraints now printed iff not dummyT and show_types enabled, changed
|
|
126 |
internal print_translations accordingly; old translations that intruduce
|
|
127 |
frees may cause printing of constraints at all occurences;
|
|
128 |
|
|
129 |
constraints of bound vars now printed where bound (i.e. "%x::'a. x" rather
|
|
130 |
than "%x. x::'a") and put in braces if necessary ("%(x::'a) y::'b. f(x,y)");
|
|
131 |
|
|
132 |
constraints of bound var printed even if a free var in another scope happens
|
|
133 |
to have the same name and type;
|
|
134 |
|
|
135 |
- [man: toplevel pretty printers for NJ];
|
|
136 |
|
|
137 |
- (syntactic constants "_..." (e.g. "_idts") are reserved, you may use "@..."
|
|
138 |
or "*..." instead);
|
|
139 |
|
|
140 |
- Printer: clash of fun/type constants with concrete syntax type/fun
|
|
141 |
constants causes incorrect printing of of applications;
|
|
142 |
|