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 }