a68g-plugin.h

     
   1  //! @file a68g-plugin.h
   2  //! @author J. Marcel van der Veer
   3  //!
   4  //! @section Copyright
   5  //!
   6  //! This file is part of Algol68G - an Algol 68 compiler-interpreter.
   7  //! Copyright 2001-2023 J. Marcel van der Veer [algol68g@xs4all.nl].
   8  //!
   9  //! @section License
  10  //!
  11  //! This program is free software; you can redistribute it and/or modify it 
  12  //! under the terms of the GNU General Public License as published by the 
  13  //! Free Software Foundation; either version 3 of the License, or 
  14  //! (at your option) any later version.
  15  //!
  16  //! This program is distributed in the hope that it will be useful, but 
  17  //! WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
  18  //! or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 
  19  //! more details. You should have received a copy of the GNU General Public 
  20  //! License along with this program. If not, see [http://www.gnu.org/licenses/].
  21  
  22  #if ! defined (__A68G_PLUGIN_H__)
  23  #define __A68G_PLUGIN_H__
  24  
  25  typedef union UFU UFU;
  26  
  27  union UFU
  28  {
  29    UNSIGNED_T u;
  30    REAL_T f;
  31  };
  32  
  33  #define BASIC(p, n) (basic_unit (stems_from ((p), (n))))
  34  
  35  #define CON "const"
  36  #define ELM "elem"
  37  #define TMP "tmp"
  38  #define ARG "arg"
  39  #define ARR "array"
  40  #define DEC "declarer"
  41  #define DRF "deref"
  42  #define DSP "display"
  43  #define FUN "function"
  44  #define PUP "pop"
  45  #define REF "ref"
  46  #define SEL "field"
  47  #define TUP "tuple"
  48  
  49  #define A68_MAKE_NOTHING 0
  50  #define A68_MAKE_OTHERS 1
  51  #define A68_MAKE_FUNCTION 2
  52  
  53  #define OFFSET_OFF(s) (OFFSET (NODE_PACK (SUB (s))))
  54  #define WIDEN_TO(p, a, b) (MOID (p) == MODE (b) && MOID (SUB (p)) == MODE (a))
  55  
  56  #define NEEDS_DNS(m) (m != NO_MOID && (IS (m, REF_SYMBOL) || IS (m, PROC_SYMBOL) || IS (m, UNION_SYMBOL) || IS (m, FORMAT_SYMBOL)))
  57  
  58  #define CODE_EXECUTE(p) {\
  59    indentf (out, snprintf (A68 (edit_line), SNPRINTF_SIZE, "EXECUTE_UNIT_TRACE (_NODE_ (%d));", NUMBER (p)));\
  60    }
  61  
  62  #define NAME_SIZE 200
  63  
  64  extern BOOK_T *signed_in (int, int, char *);
  65  extern BOOL_T basic_argument (NODE_T *);
  66  extern BOOL_T basic_call (NODE_T *);
  67  extern BOOL_T basic_collateral (NODE_T *);
  68  extern BOOL_T basic_conditional (NODE_T *);
  69  extern BOOL_T basic_formula (NODE_T *);
  70  extern BOOL_T basic_indexer (NODE_T *);
  71  extern BOOL_T basic_mode (MOID_T *);
  72  extern BOOL_T basic_mode_non_row (MOID_T *);
  73  extern BOOL_T basic_monadic_formula (NODE_T *);
  74  extern BOOL_T basic_serial (NODE_T *, int);
  75  extern BOOL_T basic_slice (NODE_T *);
  76  extern BOOL_T basic_unit (NODE_T *);
  77  extern BOOL_T basic_unit (NODE_T *);
  78  extern BOOL_T need_initialise_frame (NODE_T *);
  79  extern BOOL_T primitive_mode (MOID_T *);
  80  extern BOOL_T same_tree (NODE_T *, NODE_T *);
  81  extern char *compile_call (NODE_T *, FILE_T);
  82  extern char *compile_cast (NODE_T *, FILE_T);
  83  extern char *compile_denotation (NODE_T *, FILE_T);
  84  extern char *compile_dereference_identifier (NODE_T *, FILE_T);
  85  extern char *compile_formula (NODE_T *, FILE_T);
  86  extern char *compile_identifier (NODE_T *, FILE_T);
  87  extern char *gen_basic_conditional (NODE_T *, FILE_T, int);
  88  extern char *gen_basic (NODE_T *, FILE_T);
  89  extern char *gen_call (NODE_T *, FILE_T, int);
  90  extern char *gen_cast (NODE_T *, FILE_T, int);
  91  extern char *gen_closed_clause (NODE_T *, FILE_T, int);
  92  extern char *gen_code_clause (NODE_T *, FILE_T, int);
  93  extern char *gen_collateral_clause (NODE_T *, FILE_T, int);
  94  extern char *gen_conditional_clause (NODE_T *, FILE_T, int);
  95  extern char *gen_denotation (NODE_T *, FILE_T, int);
  96  extern char *gen_deproceduring (NODE_T *, FILE_T, int);
  97  extern char *gen_dereference_identifier (NODE_T *, FILE_T, int);
  98  extern char *gen_dereference_selection (NODE_T *, FILE_T, int);
  99  extern char *gen_dereference_slice (NODE_T *, FILE_T, int);
 100  extern char *gen_formula (NODE_T *, FILE_T, int);
 101  extern char *gen_identifier (NODE_T *, FILE_T, int);
 102  extern char *gen_identity_relation (NODE_T *, FILE_T, int);
 103  extern char *gen_int_case_clause (NODE_T *, FILE_T, int);
 104  extern char *gen_loop_clause (NODE_T *, FILE_T, int);
 105  extern char *gen_selection (NODE_T *, FILE_T, int);
 106  extern char *gen_slice (NODE_T *, FILE_T, int);
 107  extern char *gen_uniting (NODE_T *, FILE_T, int);
 108  extern char *gen_unit (NODE_T *, FILE_T, BOOL_T);
 109  extern char *gen_voiding_assignation_identifier (NODE_T *, FILE_T, int);
 110  extern char *gen_voiding_assignation_selection (NODE_T *, FILE_T, int);
 111  extern char *gen_voiding_assignation_slice (NODE_T *, FILE_T, int);
 112  extern char *gen_voiding_call (NODE_T *, FILE_T, int);
 113  extern char *gen_voiding_deproceduring (NODE_T *, FILE_T, int);
 114  extern char *gen_voiding_formula (NODE_T *, FILE_T, int);
 115  extern char *inline_mode (MOID_T *);
 116  extern char *internal_mode (MOID_T *);
 117  extern char *make_name (char *, char *, char *, int);
 118  extern char *make_unic_name (char *, char *, char *, char *);
 119  extern char *moid_with_name (char *, MOID_T *, char *);
 120  extern DEC_T *add_declaration (DEC_T **, char *, int, char *);
 121  extern DEC_T *add_identifier (DEC_T **, int, char *);
 122  extern NODE_T *stems_from (NODE_T *, int);
 123  extern void comment_source (NODE_T *, FILE_T);
 124  extern void constant_folder (NODE_T *, FILE_T, int);
 125  extern void gen_assign (NODE_T *, FILE_T, char *);
 126  extern void gen_basics (NODE_T *, FILE_T);
 127  extern void gen_check_init (NODE_T *, FILE_T, char *);
 128  extern void gen_declaration_list (NODE_T *, FILE_T, int *, char *);
 129  extern void gen_push (NODE_T *, FILE_T);
 130  extern void gen_serial_clause (NODE_T *, FILE_T, NODE_T **, int *, int *, char *, int);
 131  extern void gen_units (NODE_T *, FILE_T);
 132  extern void get_stack (NODE_T *, FILE_T, char *, char *);
 133  extern void indentf (FILE_T, int);
 134  extern void indentf (FILE_T, int);
 135  extern void indent (FILE_T, char *);
 136  extern void indent (FILE_T, char *);
 137  extern void init_static_frame (FILE_T, NODE_T *);
 138  extern void inline_arguments (NODE_T *, FILE_T, int, int *);
 139  extern void inline_call (NODE_T *, FILE_T, int);
 140  extern void inline_closed (NODE_T *, FILE_T, int);
 141  extern void inline_collateral (NODE_T *, FILE_T, int);
 142  extern void inline_collateral_units (NODE_T *, FILE_T, int);
 143  extern void inline_comment_source (NODE_T *, FILE_T);
 144  extern void inline_conditional (NODE_T *, FILE_T, int);
 145  extern void inline_denotation (NODE_T *, FILE_T, int);
 146  extern void inline_dereference_identifier (NODE_T *, FILE_T, int);
 147  extern void inline_dereference_selection (NODE_T *, FILE_T, int);
 148  extern void inline_dereference_slice (NODE_T *, FILE_T, int);
 149  extern void inline_formula (NODE_T *, FILE_T, int);
 150  extern void inline_identifier (NODE_T *, FILE_T, int);
 151  extern void inline_identity_relation (NODE_T *, FILE_T, int);
 152  extern void inline_indexer (NODE_T *, FILE_T, int, INT_T *, char *);
 153  extern void inline_monadic_formula (NODE_T *, FILE_T, int);
 154  extern void inline_ref_identifier (NODE_T *, FILE_T, int);
 155  extern void inline_selection (NODE_T *, FILE_T, int);
 156  extern void inline_selection_ref_to_ref (NODE_T *, FILE_T, int);
 157  extern void inline_single_argument (NODE_T *, FILE_T, int);
 158  extern void inline_slice (NODE_T *, FILE_T, int);
 159  extern void inline_slice_ref_to_ref (NODE_T *, FILE_T, int);
 160  extern void inline_unit (NODE_T *, FILE_T, int);
 161  extern void inline_unit (NODE_T *, FILE_T, int);
 162  extern void inline_widening (NODE_T *, FILE_T, int);
 163  extern void print_declarations (FILE_T, DEC_T *);
 164  extern void sign_in (int, int, char *, void *, int);
 165  extern void sign_in_name (char *, int *);
 166  extern void undentf (FILE_T, int);
 167  extern void undent (FILE_T, char *);
 168  extern void write_fun_postlude (NODE_T *, FILE_T, char *);
 169  extern void write_fun_prelude (NODE_T *, FILE_T, char *);
 170  extern void write_prelude (FILE_T);
 171  
 172  // The phases we go through.
 173  
 174  enum
 175  { L_NONE = 0, L_DECLARE = 1, L_INITIALISE, L_EXECUTE, L_EXECUTE_2, L_YIELD, L_PUSH };
 176  
 177  #define UNIC_NAME(k) (A68_OPT (unic_functions)[k].fun)
 178  
 179  enum
 180  { UNIC_EXISTS, UNIC_MAKE_NEW, UNIC_MAKE_ALT };
 181  
 182  // TRANSLATION tabulates translations for genie actions.
 183  // This tells what to call for an A68 action.
 184  
 185  typedef int LEVEL_T;
 186  
 187  typedef struct
 188  {
 189    GPROC *procedure;
 190    char *code;
 191  } TRANSLATION;
 192  
 193  extern TRANSLATION *monadics, *dyadics, *functions;
 194  
 195  extern TRANSLATION monadics_nocheck[];
 196  extern TRANSLATION monadics_check[];
 197  extern TRANSLATION dyadics_nocheck[];
 198  extern TRANSLATION dyadics_check[];
 199  extern TRANSLATION functions_nocheck[];
 200  extern TRANSLATION functions_check[];
 201  extern TRANSLATION constants[];
 202  
 203  #endif