a68g-compiler.h

You can download the current version of Algol 68 Genie and its documentation here.

   1 //! @file a68g-compiler.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 .
   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 .
  21 
  22 #if ! defined (__A68G_COMPILER_H__)
  23 #define __A68G_COMPILER_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