src/Pure/Syntax/ast.ML
changeset 1506 192c48376d25
parent 1127 42ec82147d83
child 2229 64acb485ecce
equal deleted inserted replaced
1505:14f4c55bbe9a 1506:192c48376d25
     4 
     4 
     5 Abstract syntax trees, translation rules, matching and normalization of asts.
     5 Abstract syntax trees, translation rules, matching and normalization of asts.
     6 *)
     6 *)
     7 
     7 
     8 signature AST0 =
     8 signature AST0 =
     9 sig
     9   sig
    10   datatype ast =
    10   datatype ast =
    11     Constant of string |
    11     Constant of string |
    12     Variable of string |
    12     Variable of string |
    13     Appl of ast list
    13     Appl of ast list
    14   exception AST of string * ast list
    14   exception AST of string * ast list
    15 end;
    15   end;
    16 
    16 
    17 signature AST1 =
    17 signature AST1 =
    18 sig
    18   sig
    19   include AST0
    19   include AST0
    20   structure Pretty: PRETTY
       
    21   val mk_appl: ast -> ast list -> ast
    20   val mk_appl: ast -> ast list -> ast
    22   val str_of_ast: ast -> string
    21   val str_of_ast: ast -> string
    23   val pretty_ast: ast -> Pretty.T
    22   val pretty_ast: ast -> Pretty.T
    24   val pretty_rule: ast * ast -> Pretty.T
    23   val pretty_rule: ast * ast -> Pretty.T
    25   val pprint_ast: ast -> pprint_args -> unit
    24   val pprint_ast: ast -> pprint_args -> unit
    26   val trace_norm_ast: bool ref
    25   val trace_norm_ast: bool ref
    27   val stat_norm_ast: bool ref
    26   val stat_norm_ast: bool ref
    28 end;
    27   end;
    29 
    28 
    30 signature AST =
    29 signature AST =
    31 sig
    30   sig
    32   include AST1
    31   include AST1
    33   val raise_ast: string -> ast list -> 'a
    32   val raise_ast: string -> ast list -> 'a
    34   val head_of_rule: ast * ast -> string
    33   val head_of_rule: ast * ast -> string
    35   val rule_error: ast * ast -> string option
    34   val rule_error: ast * ast -> string option
    36   val fold_ast: string -> ast list -> ast
    35   val fold_ast: string -> ast list -> ast
    37   val fold_ast_p: string -> ast list * ast -> ast
    36   val fold_ast_p: string -> ast list * ast -> ast
    38   val unfold_ast: string -> ast -> ast list
    37   val unfold_ast: string -> ast -> ast list
    39   val unfold_ast_p: string -> ast -> ast list * ast
    38   val unfold_ast_p: string -> ast -> ast list * ast
    40   val normalize: bool -> bool -> (string -> (ast * ast) list) option -> ast -> ast
    39   val normalize: bool -> bool -> (string -> (ast * ast) list) option -> ast -> ast
    41   val normalize_ast: (string -> (ast * ast) list) option -> ast -> ast
    40   val normalize_ast: (string -> (ast * ast) list) option -> ast -> ast
    42 end;
    41   end;
    43 
    42 
    44 functor AstFun(Pretty: PRETTY): AST =
    43 structure Ast : AST =
    45 struct
    44 struct
    46 
       
    47 structure Pretty = Pretty;
       
    48 
       
    49 
    45 
    50 (** abstract syntax trees **)
    46 (** abstract syntax trees **)
    51 
    47 
    52 (*asts come in two flavours:
    48 (*asts come in two flavours:
    53    - ordinary asts representing terms and typs: Variables are (often) treated
    49    - ordinary asts representing terms and typs: Variables are (often) treated
   291 (* normalize_ast *)
   287 (* normalize_ast *)
   292 
   288 
   293 fun normalize_ast get_rules ast =
   289 fun normalize_ast get_rules ast =
   294   normalize (! trace_norm_ast) (! stat_norm_ast) get_rules ast;
   290   normalize (! trace_norm_ast) (! stat_norm_ast) get_rules ast;
   295 
   291 
   296 
       
   297 end;
   292 end;
       
   293