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 }