a68g-keywords.c

     
   1  //! @file a68g-keywords.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  //! Algol 68 keyword 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  //! @brief Add token to the token tree.
  37  
  38  TOKEN_T *add_token (TOKEN_T ** p, char *t)
  39  {
  40    char *z = new_fixed_string (t);
  41    while (*p != NO_TOKEN) {
  42      int k = strcmp (z, TEXT (*p));
  43      if (k < 0) {
  44        p = &LESS (*p);
  45      } else if (k > 0) {
  46        p = &MORE (*p);
  47      } else {
  48        return *p;
  49      }
  50    }
  51    *p = (TOKEN_T *) get_fixed_heap_space ((size_t) SIZE_ALIGNED (TOKEN_T));
  52    TEXT (*p) = z;
  53    LESS (*p) = MORE (*p) = NO_TOKEN;
  54    return *p;
  55  }
  56  
  57  //! @brief Find keyword, from token name.
  58  
  59  KEYWORD_T *find_keyword (KEYWORD_T * p, char *t)
  60  {
  61    while (p != NO_KEYWORD) {
  62      int k = strcmp (t, TEXT (p));
  63      if (k < 0) {
  64        p = LESS (p);
  65      } else if (k > 0) {
  66        p = MORE (p);
  67      } else {
  68        return p;
  69      }
  70    }
  71    return NO_KEYWORD;
  72  }
  73  
  74  //! @brief Find keyword, from attribute.
  75  
  76  KEYWORD_T *find_keyword_from_attribute (KEYWORD_T * p, int a)
  77  {
  78    if (p == NO_KEYWORD) {
  79      return NO_KEYWORD;
  80    } else if (a == ATTRIBUTE (p)) {
  81      return p;
  82    } else {
  83      KEYWORD_T *z;
  84      if ((z = find_keyword_from_attribute (LESS (p), a)) != NO_KEYWORD) {
  85        return z;
  86      } else if ((z = find_keyword_from_attribute (MORE (p), a)) != NO_KEYWORD) {
  87        return z;
  88      } else {
  89        return NO_KEYWORD;
  90      }
  91    }
  92  }
  93  
  94  //! @brief Add keyword to the tree.
  95  
  96  void add_keyword (KEYWORD_T ** p, int a, char *t)
  97  {
  98    while (*p != NO_KEYWORD) {
  99      int k = strcmp (t, TEXT (*p));
 100      if (k < 0) {
 101        p = &LESS (*p);
 102      } else {
 103        p = &MORE (*p);
 104      }
 105    }
 106    *p = (KEYWORD_T *) get_fixed_heap_space ((size_t) SIZE_ALIGNED (KEYWORD_T));
 107    ATTRIBUTE (*p) = a;
 108    TEXT (*p) = t;
 109    LESS (*p) = MORE (*p) = NO_KEYWORD;
 110  }
 111  
 112  //! @brief Make tables of keywords and non-terminals.
 113  
 114  void set_up_tables (void)
 115  {
 116  // Entries are randomised to balance the tree.
 117    if (OPTION_STRICT (&A68_JOB) == A68_FALSE) {
 118      add_keyword (&A68 (top_keyword), ENVIRON_SYMBOL, "ENVIRON");
 119      add_keyword (&A68 (top_keyword), DOWNTO_SYMBOL, "DOWNTO");
 120      add_keyword (&A68 (top_keyword), UNTIL_SYMBOL, "UNTIL");
 121      add_keyword (&A68 (top_keyword), CLASS_SYMBOL, "CLASS");
 122      add_keyword (&A68 (top_keyword), NEW_SYMBOL, "NEW");
 123      add_keyword (&A68 (top_keyword), DIAGONAL_SYMBOL, "DIAG");
 124      add_keyword (&A68 (top_keyword), TRANSPOSE_SYMBOL, "TRNSP");
 125      add_keyword (&A68 (top_keyword), ROW_SYMBOL, "ROW");
 126      add_keyword (&A68 (top_keyword), COLUMN_SYMBOL, "COL");
 127      add_keyword (&A68 (top_keyword), CODE_SYMBOL, "CODE");
 128      add_keyword (&A68 (top_keyword), EDOC_SYMBOL, "EDOC");
 129      add_keyword (&A68 (top_keyword), ANDF_SYMBOL, "THEF");
 130      add_keyword (&A68 (top_keyword), ORF_SYMBOL, "ELSF");
 131      add_keyword (&A68 (top_keyword), ANDF_SYMBOL, "ANDTH");
 132      add_keyword (&A68 (top_keyword), ORF_SYMBOL, "OREL");
 133      add_keyword (&A68 (top_keyword), ANDF_SYMBOL, "ANDF");
 134      add_keyword (&A68 (top_keyword), ORF_SYMBOL, "ORF");
 135      add_keyword (&A68 (top_keyword), ALIF_SYMBOL, "ALIF");
 136    }
 137    add_keyword (&A68 (top_keyword), POINT_SYMBOL, ".");
 138    add_keyword (&A68 (top_keyword), COMPLEX_SYMBOL, "COMPLEX");
 139    add_keyword (&A68 (top_keyword), ACCO_SYMBOL, "{");
 140    add_keyword (&A68 (top_keyword), OCCA_SYMBOL, "}");
 141    add_keyword (&A68 (top_keyword), SOUND_SYMBOL, "SOUND");
 142    add_keyword (&A68 (top_keyword), COLON_SYMBOL, ":");
 143    add_keyword (&A68 (top_keyword), THEN_BAR_SYMBOL, "|");
 144    add_keyword (&A68 (top_keyword), SUB_SYMBOL, "[");
 145    add_keyword (&A68 (top_keyword), BY_SYMBOL, "BY");
 146    add_keyword (&A68 (top_keyword), OP_SYMBOL, "OP");
 147    add_keyword (&A68 (top_keyword), COMMA_SYMBOL, ",");
 148    add_keyword (&A68 (top_keyword), AT_SYMBOL, "AT");
 149    add_keyword (&A68 (top_keyword), PRIO_SYMBOL, "PRIO");
 150    add_keyword (&A68 (top_keyword), STYLE_I_COMMENT_SYMBOL, "CO");
 151    add_keyword (&A68 (top_keyword), END_SYMBOL, "END");
 152    add_keyword (&A68 (top_keyword), GO_SYMBOL, "GO");
 153    add_keyword (&A68 (top_keyword), TO_SYMBOL, "TO");
 154    add_keyword (&A68 (top_keyword), ELSE_BAR_SYMBOL, "|:");
 155    add_keyword (&A68 (top_keyword), THEN_SYMBOL, "THEN");
 156    add_keyword (&A68 (top_keyword), TRUE_SYMBOL, "TRUE");
 157    add_keyword (&A68 (top_keyword), PROC_SYMBOL, "PROC");
 158    add_keyword (&A68 (top_keyword), FOR_SYMBOL, "FOR");
 159    add_keyword (&A68 (top_keyword), GOTO_SYMBOL, "GOTO");
 160    add_keyword (&A68 (top_keyword), WHILE_SYMBOL, "WHILE");
 161    add_keyword (&A68 (top_keyword), IS_SYMBOL, ":=:");
 162    add_keyword (&A68 (top_keyword), ASSIGN_TO_SYMBOL, "=:");
 163    add_keyword (&A68 (top_keyword), COMPL_SYMBOL, "COMPL");
 164    add_keyword (&A68 (top_keyword), FROM_SYMBOL, "FROM");
 165    add_keyword (&A68 (top_keyword), BOLD_PRAGMAT_SYMBOL, "PRAGMAT");
 166    add_keyword (&A68 (top_keyword), BOLD_COMMENT_SYMBOL, "COMMENT");
 167    add_keyword (&A68 (top_keyword), DO_SYMBOL, "DO");
 168    add_keyword (&A68 (top_keyword), STYLE_II_COMMENT_SYMBOL, "#");
 169    add_keyword (&A68 (top_keyword), CASE_SYMBOL, "CASE");
 170    add_keyword (&A68 (top_keyword), LOC_SYMBOL, "LOC");
 171    add_keyword (&A68 (top_keyword), CHAR_SYMBOL, "CHAR");
 172    add_keyword (&A68 (top_keyword), ISNT_SYMBOL, ":/=:");
 173    add_keyword (&A68 (top_keyword), REF_SYMBOL, "REF");
 174    add_keyword (&A68 (top_keyword), NIL_SYMBOL, "NIL");
 175    add_keyword (&A68 (top_keyword), ASSIGN_SYMBOL, ":=");
 176    add_keyword (&A68 (top_keyword), FI_SYMBOL, "FI");
 177    add_keyword (&A68 (top_keyword), FILE_SYMBOL, "FILE");
 178    add_keyword (&A68 (top_keyword), PAR_SYMBOL, "PAR");
 179    add_keyword (&A68 (top_keyword), ASSERT_SYMBOL, "ASSERT");
 180    add_keyword (&A68 (top_keyword), OUSE_SYMBOL, "OUSE");
 181    add_keyword (&A68 (top_keyword), IN_SYMBOL, "IN");
 182    add_keyword (&A68 (top_keyword), LONG_SYMBOL, "LONG");
 183    add_keyword (&A68 (top_keyword), SEMI_SYMBOL, ";");
 184    add_keyword (&A68 (top_keyword), EMPTY_SYMBOL, "EMPTY");
 185    add_keyword (&A68 (top_keyword), MODE_SYMBOL, "MODE");
 186    add_keyword (&A68 (top_keyword), IF_SYMBOL, "IF");
 187    add_keyword (&A68 (top_keyword), OD_SYMBOL, "OD");
 188    add_keyword (&A68 (top_keyword), OF_SYMBOL, "OF");
 189    add_keyword (&A68 (top_keyword), STRUCT_SYMBOL, "STRUCT");
 190    add_keyword (&A68 (top_keyword), STYLE_I_PRAGMAT_SYMBOL, "PR");
 191    add_keyword (&A68 (top_keyword), BUS_SYMBOL, "]");
 192    add_keyword (&A68 (top_keyword), SKIP_SYMBOL, "SKIP");
 193    add_keyword (&A68 (top_keyword), SHORT_SYMBOL, "SHORT");
 194    add_keyword (&A68 (top_keyword), IS_SYMBOL, "IS");
 195    add_keyword (&A68 (top_keyword), ESAC_SYMBOL, "ESAC");
 196    add_keyword (&A68 (top_keyword), CHANNEL_SYMBOL, "CHANNEL");
 197    add_keyword (&A68 (top_keyword), REAL_SYMBOL, "REAL");
 198    add_keyword (&A68 (top_keyword), STRING_SYMBOL, "STRING");
 199    add_keyword (&A68 (top_keyword), BOOL_SYMBOL, "BOOL");
 200    add_keyword (&A68 (top_keyword), ISNT_SYMBOL, "ISNT");
 201    add_keyword (&A68 (top_keyword), FALSE_SYMBOL, "FALSE");
 202    add_keyword (&A68 (top_keyword), UNION_SYMBOL, "UNION");
 203    add_keyword (&A68 (top_keyword), OUT_SYMBOL, "OUT");
 204    add_keyword (&A68 (top_keyword), OPEN_SYMBOL, "(");
 205    add_keyword (&A68 (top_keyword), BEGIN_SYMBOL, "BEGIN");
 206    add_keyword (&A68 (top_keyword), FLEX_SYMBOL, "FLEX");
 207    add_keyword (&A68 (top_keyword), VOID_SYMBOL, "VOID");
 208    add_keyword (&A68 (top_keyword), BITS_SYMBOL, "BITS");
 209    add_keyword (&A68 (top_keyword), ELSE_SYMBOL, "ELSE");
 210    add_keyword (&A68 (top_keyword), EXIT_SYMBOL, "EXIT");
 211    add_keyword (&A68 (top_keyword), HEAP_SYMBOL, "HEAP");
 212    add_keyword (&A68 (top_keyword), INT_SYMBOL, "INT");
 213    add_keyword (&A68 (top_keyword), BYTES_SYMBOL, "BYTES");
 214    add_keyword (&A68 (top_keyword), PIPE_SYMBOL, "PIPE");
 215    add_keyword (&A68 (top_keyword), FORMAT_SYMBOL, "FORMAT");
 216    add_keyword (&A68 (top_keyword), SEMA_SYMBOL, "SEMA");
 217    add_keyword (&A68 (top_keyword), CLOSE_SYMBOL, ")");
 218    add_keyword (&A68 (top_keyword), AT_SYMBOL, "@");
 219    add_keyword (&A68 (top_keyword), ELIF_SYMBOL, "ELIF");
 220    add_keyword (&A68 (top_keyword), FORMAT_DELIMITER_SYMBOL, "$");
 221  }