a68g-non-terminal.c

     
   1  //! @file a68g-non-terminal.c
   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  //! @section Synopsis
  23  //!
  24  //! Non-terminal tables.
  25  
  26  #include "a68g.h"
  27  #include "a68g-prelude.h"
  28  #include "a68g-mp.h"
  29  #include "a68g-genie.h"
  30  #include "a68g-postulates.h"
  31  #include "a68g-parser.h"
  32  #include "a68g-options.h"
  33  #include "a68g-optimiser.h"
  34  #include "a68g-listing.h"
  35  
  36  // Translate int attributes to string names.
  37  
  38  static char *attribute_names[WILDCARD + 1] = {
  39    NO_TEXT,
  40    "A68_PATTERN",
  41    "ACCO_SYMBOL",
  42    "ACTUAL_DECLARER_MARK",
  43    "ALIF_IF_PART",
  44    "ALIF_PART",
  45    "ALIF_SYMBOL",
  46    "ALT_DO_PART",
  47    "ALT_DO_SYMBOL",
  48    "ALT_EQUALS_SYMBOL",
  49    "ALT_FORMAL_BOUNDS_LIST",
  50    "ANDF_SYMBOL",
  51    "AND_FUNCTION",
  52    "ANONYMOUS",
  53    "ARGUMENT",
  54    "ARGUMENT_LIST",
  55    "ASSERTION",
  56    "ASSERT_SYMBOL",
  57    "ASSIGNATION",
  58    "ASSIGN_SYMBOL",
  59    "ASSIGN_TO_SYMBOL",
  60    "AT_SYMBOL",
  61    "BEGIN_SYMBOL",
  62    "BITS_C_PATTERN",
  63    "BITS_DENOTATION",
  64    "BITS_PATTERN",
  65    "BITS_SYMBOL",
  66    "BOLD_COMMENT_SYMBOL",
  67    "BOLD_PRAGMAT_SYMBOL",
  68    "BOLD_TAG",
  69    "BOOLEAN_PATTERN",
  70    "BOOL_SYMBOL",
  71    "BOUND",
  72    "BOUNDS",
  73    "BOUNDS_LIST",
  74    "BRIEF_OUSE_PART",
  75    "BRIEF_CONFORMITY_OUSE_PART",
  76    "BRIEF_ELIF_PART",
  77    "BRIEF_OPERATOR_DECLARATION",
  78    "BUS_SYMBOL",
  79    "BYTES_SYMBOL",
  80    "BY_PART",
  81    "BY_SYMBOL",
  82    "CALL",
  83    "CASE_CHOICE_CLAUSE",
  84    "CASE_CLAUSE",
  85    "CASE_IN_PART",
  86    "CASE_OUSE_PART",
  87    "CASE_PART",
  88    "CASE_SYMBOL",
  89    "CAST",
  90    "CHANNEL_SYMBOL",
  91    "CHAR_C_PATTERN",
  92    "CHAR_SYMBOL",
  93    "CHOICE",
  94    "CHOICE_PATTERN",
  95    "CLASS_SYMBOL",
  96    "CLOSED_CLAUSE",
  97    "CLOSE_SYMBOL",
  98    "CODE_CLAUSE",
  99    "CODE_LIST",
 100    "CODE_SYMBOL",
 101    "COLLATERAL_CLAUSE",
 102    "COLLECTION",
 103    "COLON_SYMBOL",
 104    "COLUMN_FUNCTION",
 105    "COLUMN_SYMBOL",
 106    "COMMA_SYMBOL",
 107    "COMPLEX_PATTERN",
 108    "COMPLEX_SYMBOL",
 109    "COMPL_SYMBOL",
 110    "CONDITIONAL_CLAUSE",
 111    "CONFORMITY_CHOICE",
 112    "CONFORMITY_CLAUSE",
 113    "CONFORMITY_IN_PART",
 114    "CONFORMITY_OUSE_PART",
 115    "CONSTRUCT",
 116    "DECLARATION_LIST",
 117    "DECLARER",
 118    "DEFINING_IDENTIFIER",
 119    "DEFINING_INDICANT",
 120    "DEFINING_OPERATOR",
 121    "DENOTATION",
 122    "DEPROCEDURING",
 123    "DEREFERENCING",
 124    "DIAGONAL_FUNCTION",
 125    "DIAGONAL_SYMBOL",
 126    "DOTDOT_SYMBOL",
 127    "DOWNTO_SYMBOL",
 128    "DO_PART",
 129    "DO_SYMBOL",
 130    "DYNAMIC_REPLICATOR",
 131    "EDOC_SYMBOL",
 132    "ELIF_IF_PART",
 133    "ELIF_PART",
 134    "ELIF_SYMBOL",
 135    "ELSE_BAR_SYMBOL",
 136    "ELSE_OPEN_PART",
 137    "ELSE_PART",
 138    "ELSE_SYMBOL",
 139    "EMPTY_SYMBOL",
 140    "ENCLOSED_CLAUSE",
 141    "END_SYMBOL",
 142    "ENQUIRY_CLAUSE",
 143    "ENVIRON_NAME",
 144    "ENVIRON_SYMBOL",
 145    "EQUALS_SYMBOL",
 146    "ERROR",
 147    "ERROR_IDENTIFIER",
 148    "ESAC_SYMBOL",
 149    "EXIT_SYMBOL",
 150    "EXPONENT_FRAME",
 151    "FALSE_SYMBOL",
 152    "FIELD",
 153    "FIELD_IDENTIFIER",
 154    "FILE_SYMBOL",
 155    "FIRM",
 156    "FIXED_C_PATTERN",
 157    "FI_SYMBOL",
 158    "FLEX_SYMBOL",
 159    "FLOAT_C_PATTERN",
 160    "FORMAL_BOUNDS",
 161    "FORMAL_BOUNDS_LIST",
 162    "FORMAL_DECLARERS",
 163    "FORMAL_DECLARERS_LIST",
 164    "FORMAL_DECLARER_MARK",
 165    "FORMAT_A_FRAME",
 166    "FORMAT_CLOSE_SYMBOL",
 167    "FORMAT_DELIMITER_SYMBOL",
 168    "FORMAT_D_FRAME",
 169    "FORMAT_E_FRAME",
 170    "FORMAT_IDENTIFIER",
 171    "FORMAT_ITEM_A",
 172    "FORMAT_ITEM_B",
 173    "FORMAT_ITEM_C",
 174    "FORMAT_ITEM_D",
 175    "FORMAT_ITEM_E",
 176    "FORMAT_ITEM_ESCAPE",
 177    "FORMAT_ITEM_F",
 178    "FORMAT_ITEM_G",
 179    "FORMAT_ITEM_H",
 180    "FORMAT_ITEM_I",
 181    "FORMAT_ITEM_J",
 182    "FORMAT_ITEM_K",
 183    "FORMAT_ITEM_L",
 184    "FORMAT_ITEM_M",
 185    "FORMAT_ITEM_MINUS",
 186    "FORMAT_ITEM_N",
 187    "FORMAT_ITEM_O",
 188    "FORMAT_ITEM_P",
 189    "FORMAT_ITEM_PLUS",
 190    "FORMAT_ITEM_POINT",
 191    "FORMAT_ITEM_Q",
 192    "FORMAT_ITEM_R",
 193    "FORMAT_ITEM_S",
 194    "FORMAT_ITEM_T",
 195    "FORMAT_ITEM_U",
 196    "FORMAT_ITEM_V",
 197    "FORMAT_ITEM_W",
 198    "FORMAT_ITEM_X",
 199    "FORMAT_ITEM_Y",
 200    "FORMAT_ITEM_Z",
 201    "FORMAT_I_FRAME",
 202    "FORMAT_OPEN_SYMBOL",
 203    "FORMAT_PATTERN",
 204    "FORMAT_POINT_FRAME",
 205    "FORMAT_SYMBOL",
 206    "FORMAT_TEXT",
 207    "FORMAT_Z_FRAME",
 208    "FORMULA",
 209    "FOR_PART",
 210    "FOR_SYMBOL",
 211    "FROM_PART",
 212    "FROM_SYMBOL",
 213    "GENERAL_C_PATTERN",
 214    "GENERAL_PATTERN",
 215    "GENERATOR",
 216    "GENERIC_ARGUMENT",
 217    "GENERIC_ARGUMENT_LIST",
 218    "GOTO_SYMBOL",
 219    "GO_SYMBOL",
 220    "GUARDED_CONDITIONAL_CLAUSE",
 221    "GUARDED_LOOP_CLAUSE",
 222    "HEAP_SYMBOL",
 223    "IDENTIFIER",
 224    "IDENTITY_DECLARATION",
 225    "IDENTITY_RELATION",
 226    "IF_PART",
 227    "IF_SYMBOL",
 228    "INDICANT",
 229    "INITIALISER_SERIES",
 230    "INSERTION",
 231    "INTEGRAL_C_PATTERN",
 232    "INTEGRAL_MOULD",
 233    "INTEGRAL_PATTERN",
 234    "INT_DENOTATION",
 235    "INT_SYMBOL",
 236    "IN_SYMBOL",
 237    "IN_TYPE_MODE",
 238    "ISNT_SYMBOL",
 239    "IS_SYMBOL",
 240    "JUMP",
 241    "KEYWORD",
 242    "LABEL",
 243    "LABELED_UNIT",
 244    "LABEL_IDENTIFIER",
 245    "LABEL_SEQUENCE",
 246    "LITERAL",
 247    "LOCAL_LABEL",
 248    "LOC_SYMBOL",
 249    "LONGETY",
 250    "LONG_SYMBOL",
 251    "LOOP_CLAUSE",
 252    "LOOP_IDENTIFIER",
 253    "MAIN_SYMBOL",
 254    "MEEK",
 255    "MODE_BITS",
 256    "MODE_BOOL",
 257    "MODE_BYTES",
 258    "MODE_CHAR",
 259    "MODE_COMPLEX",
 260    "MODE_DECLARATION",
 261    "MODE_FILE",
 262    "MODE_FORMAT",
 263    "MODE_INT",
 264    "MODE_LONG_LONG_BITS",
 265    "MODE_LONG_LONG_COMPLEX",
 266    "MODE_LONG_LONG_INT",
 267    "MODE_LONG_LONG_REAL",
 268    "MODE_LONG_BITS",
 269    "MODE_LONG_BYTES",
 270    "MODE_LONG_COMPLEX",
 271    "MODE_LONG_INT",
 272    "MODE_LONG_REAL",
 273    "MODE_NO_CHECK",
 274    "MODE_PIPE",
 275    "MODE_REAL",
 276    "MODE_SOUND",
 277    "MODE_SYMBOL",
 278    "MONADIC_FORMULA",
 279    "MONAD_SEQUENCE",
 280    "NEW_SYMBOL",
 281    "NIHIL",
 282    "NIL_SYMBOL",
 283    "NORMAL_IDENTIFIER",
 284    "NO_SORT",
 285    "OCCA_SYMBOL",
 286    "OD_SYMBOL",
 287    "OF_SYMBOL",
 288    "OPEN_PART",
 289    "OPEN_SYMBOL",
 290    "OPERATOR",
 291    "OPERATOR_DECLARATION",
 292    "OPERATOR_PLAN",
 293    "OP_SYMBOL",
 294    "ORF_SYMBOL",
 295    "OR_FUNCTION",
 296    "OUSE_PART",
 297    "OUSE_SYMBOL",
 298    "OUT_PART",
 299    "OUT_SYMBOL",
 300    "OUT_TYPE_MODE",
 301    "PARALLEL_CLAUSE",
 302    "PARAMETER",
 303    "PARAMETER_IDENTIFIER",
 304    "PARAMETER_LIST",
 305    "PARAMETER_PACK",
 306    "PARTICULAR_PROGRAM",
 307    "PAR_SYMBOL",
 308    "PICTURE",
 309    "PICTURE_LIST",
 310    "PIPE_SYMBOL",
 311    "POINT_SYMBOL",
 312    "PRIMARY",
 313    "PRIORITY",
 314    "PRIORITY_DECLARATION",
 315    "PRIO_SYMBOL",
 316    "PROCEDURE_DECLARATION",
 317    "PROCEDURE_VARIABLE_DECLARATION",
 318    "PROCEDURING",
 319    "PROC_SYMBOL",
 320    "QUALIFIER",
 321    "RADIX_FRAME",
 322    "REAL_DENOTATION",
 323    "REAL_PATTERN",
 324    "REAL_SYMBOL",
 325    "REF_SYMBOL",
 326    "REPLICATOR",
 327    "ROUTINE_TEXT",
 328    "ROUTINE_UNIT",
 329    "ROWING",
 330    "ROWS_SYMBOL",
 331    "ROW_CHAR_DENOTATION",
 332    "ROW_FUNCTION",
 333    "ROW_SYMBOL",
 334    "SECONDARY",
 335    "SELECTION",
 336    "SELECTOR",
 337    "SEMA_SYMBOL",
 338    "SEMI_SYMBOL",
 339    "SERIAL_CLAUSE",
 340    "SERIES_MODE",
 341    "SHORTETY",
 342    "SHORT_SYMBOL",
 343    "SIGN_MOULD",
 344    "SKIP",
 345    "SKIP_SYMBOL",
 346    "SLICE",
 347    "SOFT",
 348    "SOME_CLAUSE",
 349    "SOUND_SYMBOL",
 350    "SPECIFICATION",
 351    "SPECIFIED_UNIT",
 352    "SPECIFIED_UNIT_LIST",
 353    "SPECIFIED_UNIT_UNIT",
 354    "SPECIFIER",
 355    "SPECIFIER_IDENTIFIER",
 356    "STANDARD",
 357    "STATIC_REPLICATOR",
 358    "STOWED_MODE",
 359    "STRING_C_PATTERN",
 360    "STRING_PATTERN",
 361    "STRING_SYMBOL",
 362    "STRONG",
 363    "STRUCTURED_FIELD",
 364    "STRUCTURED_FIELD_LIST",
 365    "STRUCTURE_PACK",
 366    "STRUCT_SYMBOL",
 367    "STYLE_II_COMMENT_SYMBOL",
 368    "STYLE_I_COMMENT_SYMBOL",
 369    "STYLE_I_PRAGMAT_SYMBOL",
 370    "SUB_SYMBOL",
 371    "SUB_UNIT",
 372    "TERTIARY",
 373    "THEN_BAR_SYMBOL",
 374    "THEN_PART",
 375    "THEN_SYMBOL",
 376    "TO_PART",
 377    "TO_SYMBOL",
 378    "TRANSPOSE_FUNCTION",
 379    "TRANSPOSE_SYMBOL",
 380    "TRIMMER",
 381    "TRUE_SYMBOL",
 382    "UNION_DECLARER_LIST",
 383    "UNION_PACK",
 384    "UNION_SYMBOL",
 385    "UNIT",
 386    "UNITING",
 387    "UNIT_LIST",
 388    "UNIT_SERIES",
 389    "UNTIL_PART",
 390    "UNTIL_SYMBOL",
 391    "VARIABLE_DECLARATION",
 392    "VIRTUAL_DECLARER_MARK",
 393    "VOIDING",
 394    "VOID_SYMBOL",
 395    "WEAK",
 396    "WHILE_PART",
 397    "WHILE_SYMBOL",
 398    "WIDENING",
 399    "WILDCARD"
 400  };
 401  
 402  //! @brief Non_terminal_string.
 403  
 404  char *non_terminal_string (char *buf, int att)
 405  {
 406    if (att > 0 && att < WILDCARD) {
 407      if (attribute_names[att] != NO_TEXT) {
 408        char *q = buf;
 409        bufcpy (q, attribute_names[att], BUFFER_SIZE);
 410        while (q[0] != NULL_CHAR) {
 411          if (q[0] == '_') {
 412            q[0] = '-';
 413          } else {
 414            q[0] = (char) TO_LOWER (q[0]);
 415          }
 416          q++;
 417        }
 418        return buf;
 419      } else {
 420        return NO_TEXT;
 421      }
 422    } else {
 423      return NO_TEXT;
 424    }
 425  }