This commit adds code to manage the table of keywords (bold words) in the Algol 68 front-end.
Signed-off-by: Jose E. Marchesi <[email protected]> Co-authored-by: Marcel van der Veer <[email protected]> --- gcc/algol68/a68-parser-keywords.cc | 243 +++++++++++++++++++++++++++++ 1 file changed, 243 insertions(+) create mode 100644 gcc/algol68/a68-parser-keywords.cc diff --git a/gcc/algol68/a68-parser-keywords.cc b/gcc/algol68/a68-parser-keywords.cc new file mode 100644 index 00000000000..ed7cceba6b1 --- /dev/null +++ b/gcc/algol68/a68-parser-keywords.cc @@ -0,0 +1,243 @@ +/* Keyword tables. + Copyright (C) 2001-2023 J. Marcel van der Veer. + Copyright (C) 2025 Jose E. Marchesi. + + Original implementation by J. Marcel van der Veer. + Adapted for GCC by Jose E. Marchesi. + + GCC is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + GCC is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU General Public License + along with GCC; see the file COPYING3. If not see + <http://www.gnu.org/licenses/>. */ + +#include "config.h" +#include "system.h" +#include "coretypes.h" + +#include "a68.h" + +/* Apply stropping to the given keyword and return its written form, which must + be upper-case. */ + +char * +a68_strop_keyword (const char *keyword) +{ + char *stropped = xstrdup (keyword); + + if (OPTION_STROPPING (&A68_JOB) == SUPPER_STROPPING) + { + for (char *p = stropped; *p; ++p) + *p = TOLOWER (*p); + } + + return stropped; +} + +/* Add token to the token tree. */ + +TOKEN_T * +a68_add_token (TOKEN_T **p, const char *t) +{ + char *z = xstrdup (t); + while (*p != NO_TOKEN) + { + int k = strcmp (z, TEXT (*p)); + + if (k < 0) + p = &LESS (*p); + else if (k > 0) + p = &MORE (*p); + else + return *p; + } + + *p = (TOKEN_T *) xmalloc (sizeof (TOKEN_T)); + TEXT (*p) = z; + LESS (*p) = MORE (*p) = NO_TOKEN; + return *p; +} + +/* Find keyword, from token name. */ + +KEYWORD_T * +a68_find_keyword (KEYWORD_T *p, const char *t) +{ + while (p != NO_KEYWORD) + { + bool case_insensitive = (OPTION_STROPPING (&A68_JOB) == SUPPER_STROPPING); + int k = (case_insensitive + ? strcasecmp (t, TEXT (p)) + : strcmp (t, TEXT (p))); + + if (k < 0) + p = LESS (p); + else if (k > 0) + p = MORE (p); + else + return p; + } + + return NO_KEYWORD; +} + +/* Find keyword, from attribute. */ + +KEYWORD_T * +a68_find_keyword_from_attribute (KEYWORD_T *p, enum a68_attribute a) +{ + if (p == NO_KEYWORD) + return NO_KEYWORD; + else if (a == ATTRIBUTE (p)) + return p; + else + { + KEYWORD_T *z; + + if ((z = a68_find_keyword_from_attribute (LESS (p), a)) != NO_KEYWORD) + return z; + else if ((z = a68_find_keyword_from_attribute (MORE (p), a)) != NO_KEYWORD) + return z; + } + + return NO_KEYWORD; +} + +/* Add keyword to the tree. */ + +static void +add_keyword (KEYWORD_T **p, enum a68_attribute a, const char *t) +{ + while (*p != NO_KEYWORD) + { + bool case_insensitive = (OPTION_STROPPING (&A68_JOB) == SUPPER_STROPPING); + int k = (case_insensitive + ? strcasecmp (t, TEXT (*p)) + : strcmp (t, TEXT (*p))); + if (k < 0) + p = &LESS (*p); + else + p = &MORE (*p); + } + + *p = (KEYWORD_T *) xmalloc (sizeof (KEYWORD_T)); + ATTRIBUTE (*p) = a; + TEXT (*p) = t; + LESS (*p) = MORE (*p) = NO_KEYWORD; +} + +/* Make tables of keywords and non-terminals. */ + +void +a68_set_up_tables (void) +{ + /* Entries are randomised to balance the tree. */ + if (OPTION_STRICT (&A68_JOB) == false) + { + add_keyword (&A68 (top_keyword), ANDF_SYMBOL, "ANDTH"); + add_keyword (&A68 (top_keyword), ORF_SYMBOL, "OREL"); + add_keyword (&A68 (top_keyword), BRIEF_COMMENT_BEGIN_SYMBOL, "{"); + add_keyword (&A68 (top_keyword), BRIEF_COMMENT_END_SYMBOL, "}"); + + if (OPTION_STROPPING (&A68_JOB) != SUPPER_STROPPING) + { + add_keyword (&A68 (top_keyword), BOLD_COMMENT_BEGIN_SYMBOL, "NOTE"); + add_keyword (&A68 (top_keyword), BOLD_COMMENT_END_SYMBOL, "ETON"); + } + } + + if (OPTION_STROPPING (&A68_JOB) != SUPPER_STROPPING) + { + /* The following representations do not work well with stropping regimes + in which reserved words live in the same namespace than + tags/identifiers. The alternative "brief" representations for these + symbols shall be used instead. */ + add_keyword (&A68 (top_keyword), STYLE_I_COMMENT_SYMBOL, "CO"); + add_keyword (&A68 (top_keyword), BOLD_COMMENT_SYMBOL, "COMMENT"); + add_keyword (&A68 (top_keyword), STYLE_II_COMMENT_SYMBOL, "#"); + } + + add_keyword (&A68 (top_keyword), POINT_SYMBOL, "."); + add_keyword (&A68 (top_keyword), COLON_SYMBOL, ":"); + add_keyword (&A68 (top_keyword), THEN_BAR_SYMBOL, "|"); + add_keyword (&A68 (top_keyword), SUB_SYMBOL, "["); + add_keyword (&A68 (top_keyword), BY_SYMBOL, "BY"); + add_keyword (&A68 (top_keyword), OP_SYMBOL, "OP"); + add_keyword (&A68 (top_keyword), COMMA_SYMBOL, ","); + add_keyword (&A68 (top_keyword), AT_SYMBOL, "AT"); + add_keyword (&A68 (top_keyword), PRIO_SYMBOL, "PRIO"); + add_keyword (&A68 (top_keyword), END_SYMBOL, "END"); + add_keyword (&A68 (top_keyword), GO_SYMBOL, "GO"); + add_keyword (&A68 (top_keyword), TO_SYMBOL, "TO"); + add_keyword (&A68 (top_keyword), ELSE_BAR_SYMBOL, "|:"); + add_keyword (&A68 (top_keyword), THEN_SYMBOL, "THEN"); + add_keyword (&A68 (top_keyword), TRUE_SYMBOL, "TRUE"); + add_keyword (&A68 (top_keyword), PROC_SYMBOL, "PROC"); + add_keyword (&A68 (top_keyword), FOR_SYMBOL, "FOR"); + add_keyword (&A68 (top_keyword), GOTO_SYMBOL, "GOTO"); + add_keyword (&A68 (top_keyword), WHILE_SYMBOL, "WHILE"); + add_keyword (&A68 (top_keyword), IS_SYMBOL, ":=:"); + add_keyword (&A68 (top_keyword), ASSIGN_TO_SYMBOL, "=:"); + add_keyword (&A68 (top_keyword), COMPL_SYMBOL, "COMPL"); + add_keyword (&A68 (top_keyword), FROM_SYMBOL, "FROM"); + add_keyword (&A68 (top_keyword), BOLD_PRAGMAT_SYMBOL, "PRAGMAT"); + add_keyword (&A68 (top_keyword), DO_SYMBOL, "DO"); + add_keyword (&A68 (top_keyword), CASE_SYMBOL, "CASE"); + add_keyword (&A68 (top_keyword), LOC_SYMBOL, "LOC"); + add_keyword (&A68 (top_keyword), CHAR_SYMBOL, "CHAR"); + add_keyword (&A68 (top_keyword), ISNT_SYMBOL, ":/=:"); + add_keyword (&A68 (top_keyword), REF_SYMBOL, "REF"); + add_keyword (&A68 (top_keyword), NIL_SYMBOL, "NIL"); + add_keyword (&A68 (top_keyword), ASSIGN_SYMBOL, ":="); + add_keyword (&A68 (top_keyword), FI_SYMBOL, "FI"); + add_keyword (&A68 (top_keyword), FILE_SYMBOL, "FILE"); + add_keyword (&A68 (top_keyword), PAR_SYMBOL, "PAR"); + add_keyword (&A68 (top_keyword), ASSERT_SYMBOL, "ASSERT"); + add_keyword (&A68 (top_keyword), OUSE_SYMBOL, "OUSE"); + add_keyword (&A68 (top_keyword), IN_SYMBOL, "IN"); + add_keyword (&A68 (top_keyword), LONG_SYMBOL, "LONG"); + add_keyword (&A68 (top_keyword), SEMI_SYMBOL, ";"); + add_keyword (&A68 (top_keyword), EMPTY_SYMBOL, "EMPTY"); + add_keyword (&A68 (top_keyword), MODE_SYMBOL, "MODE"); + add_keyword (&A68 (top_keyword), IF_SYMBOL, "IF"); + add_keyword (&A68 (top_keyword), OD_SYMBOL, "OD"); + add_keyword (&A68 (top_keyword), OF_SYMBOL, "OF"); + add_keyword (&A68 (top_keyword), STRUCT_SYMBOL, "STRUCT"); + add_keyword (&A68 (top_keyword), STYLE_I_PRAGMAT_SYMBOL, "PR"); + add_keyword (&A68 (top_keyword), BUS_SYMBOL, "]"); + add_keyword (&A68 (top_keyword), SKIP_SYMBOL, "SKIP"); + add_keyword (&A68 (top_keyword), SHORT_SYMBOL, "SHORT"); + add_keyword (&A68 (top_keyword), IS_SYMBOL, "IS"); + add_keyword (&A68 (top_keyword), ESAC_SYMBOL, "ESAC"); + add_keyword (&A68 (top_keyword), CHANNEL_SYMBOL, "CHANNEL"); + add_keyword (&A68 (top_keyword), REAL_SYMBOL, "REAL"); + add_keyword (&A68 (top_keyword), STRING_SYMBOL, "STRING"); + add_keyword (&A68 (top_keyword), BOOL_SYMBOL, "BOOL"); + add_keyword (&A68 (top_keyword), ISNT_SYMBOL, "ISNT"); + add_keyword (&A68 (top_keyword), FALSE_SYMBOL, "FALSE"); + add_keyword (&A68 (top_keyword), UNION_SYMBOL, "UNION"); + add_keyword (&A68 (top_keyword), OUT_SYMBOL, "OUT"); + add_keyword (&A68 (top_keyword), BRIEF_COMMENT_END_SYMBOL, "{"); + add_keyword (&A68 (top_keyword), OPEN_SYMBOL, "("); + add_keyword (&A68 (top_keyword), BEGIN_SYMBOL, "BEGIN"); + add_keyword (&A68 (top_keyword), FLEX_SYMBOL, "FLEX"); + add_keyword (&A68 (top_keyword), VOID_SYMBOL, "VOID"); + add_keyword (&A68 (top_keyword), BITS_SYMBOL, "BITS"); + add_keyword (&A68 (top_keyword), ELSE_SYMBOL, "ELSE"); + add_keyword (&A68 (top_keyword), EXIT_SYMBOL, "EXIT"); + add_keyword (&A68 (top_keyword), HEAP_SYMBOL, "HEAP"); + add_keyword (&A68 (top_keyword), INT_SYMBOL, "INT"); + add_keyword (&A68 (top_keyword), BYTES_SYMBOL, "BYTES"); + add_keyword (&A68 (top_keyword), SEMA_SYMBOL, "SEMA"); + add_keyword (&A68 (top_keyword), CLOSE_SYMBOL, ")"); + add_keyword (&A68 (top_keyword), AT_SYMBOL, "@"); + add_keyword (&A68 (top_keyword), ELIF_SYMBOL, "ELIF"); +} -- 2.30.2
