File : sprint.ads


   1 ------------------------------------------------------------------------------
   2 --                                                                          --
   3 --                         GNAT COMPILER COMPONENTS                         --
   4 --                                                                          --
   5 --                               S P R I N T                                --
   6 --                                                                          --
   7 --                                 S p e c                                  --
   8 --                                                                          --
   9 --          Copyright (C) 1992-2013, Free Software Foundation, Inc.         --
  10 --                                                                          --
  11 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
  12 -- terms of the  GNU General Public License as published  by the Free Soft- --
  13 -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
  14 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
  15 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
  16 -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
  17 -- for  more details.  You should have  received  a copy of the GNU General --
  18 -- Public License  distributed with GNAT; see file COPYING3.  If not, go to --
  19 -- http://www.gnu.org/licenses for a complete copy of the license.          --
  20 --                                                                          --
  21 -- GNAT was originally developed  by the GNAT team at  New York University. --
  22 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
  23 --                                                                          --
  24 ------------------------------------------------------------------------------
  25 
  26 --  This package (source print) contains routines for printing the source
  27 --  program corresponding to a specified syntax tree. These routines are
  28 --  intended for debugging use in the compiler (not as a user level pretty
  29 --  print tool). Only information present in the tree is output (e.g. no
  30 --  comments are present in the output), and as far as possible we avoid
  31 --  making any assumptions about the correctness of the tree, so a bad
  32 --  tree may either blow up on a debugging check, or list incorrect source.
  33 
  34 with Types; use Types;
  35 
  36 package Sprint is
  37 
  38    -----------------------
  39    -- Syntax Extensions --
  40    -----------------------
  41 
  42    --  When the generated tree is printed, it contains constructs that are not
  43    --  pure Ada. For convenience, syntactic extensions to Ada have been defined
  44    --  purely for the purposes of this printout (they are not recognized by the
  45    --  parser)
  46 
  47    --  Could use more documentation for all of these ???
  48 
  49    --    Allocator                           new xxx [storage_pool = xxx]
  50    --    Cleanup action                      at end procedure name;
  51    --    Conversion wi Float_Truncate        target^(source)
  52    --    Convert wi Conversion_OK            target?(source)
  53    --    Convert wi Rounded_Result           target@(source)
  54    --    Divide wi Treat_Fixed_As_Integer    x #/ y
  55    --    Divide wi Rounded_Result            x @/ y
  56    --    Expression with actions             do action; .. action; in expr end
  57    --    Expression with range check         {expression}
  58    --    Free statement                      free expr [storage_pool = xxx]
  59    --    Freeze entity with freeze actions   freeze entityname [ actions ]
  60    --    Freeze generic entity               freeze_generic entityname
  61    --    Implicit call to run time routine   $routine-name
  62    --    Implicit exportation                $pragma import (...)
  63    --    Implicit importation                $pragma export (...)
  64    --    Interpretation                      interpretation type [, entity]
  65    --    Intrinsic calls                     function-name!(arg, arg, arg)
  66    --    Itype declaration                   [(sub)type declaration without ;]
  67    --    Itype reference                     reference itype
  68    --    Label declaration                   labelname : label
  69    --    Mod wi Treat_Fixed_As_Integer       x #mod y
  70    --    Multiple concatenation              expr && expr && expr ... && expr
  71    --    Multiply wi Treat_Fixed_As_Integer  x #* y
  72    --    Multiply wi Rounded_Result          x @* y
  73    --    Operator with range check           {operator} (e.g. {+})
  74    --    Others choice for cleanup           when all others
  75    --    Pop exception label                 %pop_xxx_exception_label
  76    --    Push exception label                %push_xxx_exception_label (label)
  77    --    Raise xxx error                     [xxx_error [when cond]]
  78    --    Raise xxx error with msg            [xxx_error [when cond], "msg"]
  79    --    Rational literal                    [expression]
  80    --    Rem wi Treat_Fixed_As_Integer       x #rem y
  81    --    Reference                           expression'reference
  82    --    Shift nodes                         shift_name!(expr, count)
  83    --    Static declaration                  name : static xxx
  84    --    Unchecked conversion                target_type!(source_expression)
  85    --    Unchecked expression                `(expression)
  86    --    Validate_Unchecked_Conversion       validate unchecked_conversion
  87    --                                                  (src-type, target-typ);
  88 
  89    --  Note: the storage_pool parameters for allocators and the free node are
  90    --  omitted if the Storage_Pool field is Empty, indicating use of the
  91    --  standard default pool.
  92 
  93    -----------------
  94    -- Subprograms --
  95    -----------------
  96 
  97    procedure Source_Dump;
  98    --  This routine is called from the GNAT main program to dump source as
  99    --  requested by debug options. The relevant debug options are:
 100    --    -ds  print source from tree, both original and generated code
 101    --    -dg  print source from tree, including only the generated code
 102    --    -do  print source from tree, including only the original code
 103    --    -df  modify the above to include all units, not just the main unit
 104    --    -sz  print source from tree for package Standard
 105 
 106    procedure Sprint_Comma_List (List : List_Id);
 107    --  Prints the nodes in a list, with separating commas. If the list is empty
 108    --  then no output is generated.
 109 
 110    procedure Sprint_Paren_Comma_List (List : List_Id);
 111    --  Prints the nodes in a list, surrounded by parentheses, and separated by
 112    --  commas. If the list is empty, then no output is generated. A blank is
 113    --  output before the initial left parenthesis.
 114 
 115    procedure Sprint_Opt_Paren_Comma_List (List : List_Id);
 116    --  Same as normal Sprint_Paren_Comma_List procedure, except that an extra
 117    --  blank is output if List is non-empty, and nothing at all is printed it
 118    --  the argument is No_List.
 119 
 120    procedure Sprint_Node_List (List : List_Id; New_Lines : Boolean := False);
 121    --  Prints the nodes in a list with no separating characters. This is used
 122    --  in the case of lists of items which are printed on separate lines using
 123    --  the current indentation amount. New_Lines controls the generation of
 124    --  New_Line calls. If False, no New_Line calls are generated. If True,
 125    --  then New_Line calls are generated as needed to ensure that each list
 126    --  item starts at the beginning of a line.
 127 
 128    procedure Sprint_Opt_Node_List (List : List_Id);
 129    --  Like Sprint_Node_List, but prints nothing if List = No_List
 130 
 131    procedure Sprint_Indented_List (List : List_Id);
 132    --  Like Sprint_Line_List, except that the indentation level is increased
 133    --  before outputting the list of items, and then decremented (back to its
 134    --  original level) before returning to the caller.
 135 
 136    procedure Sprint_Node (Node : Node_Id);
 137    --  Prints a single node. No new lines are output, except as required for
 138    --  splitting lines that are too long to fit on a single physical line.
 139    --  No output is generated at all if Node is Empty. No trailing or leading
 140    --  blank characters are generated.
 141 
 142    procedure Sprint_Opt_Node (Node : Node_Id);
 143    --  Same as normal Sprint_Node procedure, except that one leading blank is
 144    --  output before the node if it is non-empty.
 145 
 146    procedure pg (Arg : Union_Id);
 147    pragma Export (Ada, pg);
 148    --  Print generated source for argument N (like -gnatdg output). Intended
 149    --  only for use from gdb for debugging purposes. Currently, Arg may be a
 150    --  List_Id or a Node_Id (anything else outputs a blank line).
 151 
 152    procedure po (Arg : Union_Id);
 153    pragma Export (Ada, po);
 154    --  Like pg, but prints original source for the argument (like -gnatdo
 155    --  output). Intended only for use from gdb for debugging purposes. In
 156    --  the list case, an end of line is output to separate list elements.
 157 
 158    procedure ps (Arg : Union_Id);
 159    pragma Export (Ada, ps);
 160    --  Like pg, but prints generated and original source for the argument (like
 161    --  -gnatds output). Intended only for use from gdb for debugging purposes.
 162    --  In the list case, an end of line is output to separate list elements.
 163 
 164 end Sprint;