/* Copyright 2018, 2021, 2022 Joel Svensson svenssonjoel@yahoo.se 2022 Benjamin Vedder This program 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 of the License, or (at your option) any later version. This program 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 this program. If not, see . */ /** \file symrepr.h * symrepr.h implements the symbol table and symbol creation and lookup functions. * * The symbol table is implemented as a linked list in the arrays and symbols * memory defined in lispbm_memory.h. So lbm_memory_init must be run before * the symbol table is initialized and used. * */ #ifndef SYMTAB_H_ #define SYMTAB_H_ #include #include #include "lispbm_types.h" // Default and fixed symbol ids #define SYM_NIL 0x0 #define SYM_QUOTE 0x1 #define SYM_TRUE 0x2 #define SYM_IF 0x3 #define SYM_LAMBDA 0x4 #define SYM_CLOSURE 0x5 #define SYM_LET 0x6 #define SYM_RERROR 0x7 /* READ ERROR */ #define SYM_TERROR 0x8 /* TYPE ERROR */ #define SYM_EERROR 0x9 /* EVAL ERROR */ #define SYM_MERROR 0xA #define SYM_DIVZERO 0xB #define SYM_FATAL_ERROR 0xC /* Runtime system is corrupt */ #define SYM_STACK_ERROR 0xD #define SYM_DEFINE 0xE #define SYM_PROGN 0xF #define SYM_READ 0x10 #define SYM_READ_PROGRAM 0x11 #define SYM_DONTCARE 0x12 #define SYM_MATCH 0x13 #define SYM_SEND 0x14 #define SYM_RECEIVE 0x15 #define SYM_ARRAY_TYPE 0x20 #define SYM_BOXED_I_TYPE 0x21 #define SYM_BOXED_U_TYPE 0x22 #define SYM_BOXED_F_TYPE 0x23 #define SYM_REF_TYPE 0x24 #define SYM_RECOVERED 0x26 #define SYM_BYTECODE_TYPE 0x27 #define SYM_NONSENSE 0x28 #define SYM_NOT_FOUND 0x29 #define SYM_NO_MATCH 0x2A #define SYM_MATCH_ANY 0x2B #define SYM_MATCH_I28 0x2C #define SYM_MATCH_U28 0x2D #define SYM_MATCH_FLOAT 0x2E #define SYM_MATCH_CONS 0x2F // Type identifying symbols #define SYM_TYPE_LIST 0x50 #define SYM_TYPE_I28 0x51 #define SYM_TYPE_U28 0x52 #define SYM_TYPE_FLOAT 0x53 #define SYM_TYPE_I32 0x54 #define SYM_TYPE_U32 0x55 #define SYM_TYPE_ARRAY 0x56 #define SYM_TYPE_SYMBOL 0x57 #define SYM_TYPE_CHAR 0x58 #define SYM_TYPE_REF 0x59 #define SYM_TYPE_STREAM 0x5A //Relevant for the tokenizer #define SYM_OPENPAR 0x70 #define SYM_CLOSEPAR 0x71 #define SYM_BACKQUOTE 0x72 #define SYM_COMMA 0x73 #define SYM_COMMAAT 0x74 #define SYM_TOKENIZER_DONE 0x75 #define SYM_DOT 0x76 // Fundamental Operations #define FUNDAMENTALS_START 0x100 #define SYM_ADD 0x100 #define SYM_SUB 0x101 #define SYM_MUL 0x102 #define SYM_DIV 0x103 #define SYM_MOD 0x104 #define SYM_EQ 0x105 #define SYM_NUMEQ 0x106 #define SYM_LT 0x107 #define SYM_GT 0x108 #define SYM_EVAL 0x109 #define SYM_EVAL_PROGRAM 0x10A #define SYM_AND 0x110 #define SYM_OR 0x111 #define SYM_NOT 0x112 #define SYM_YIELD 0x113 #define SYM_WAIT 0x114 #define SYM_SPAWN 0x115 #define SYM_CONS 0x120 #define SYM_CAR 0x121 #define SYM_CDR 0x122 #define SYM_LIST 0x123 #define SYM_APPEND 0x124 #define SYM_ARRAY_READ 0x130 #define SYM_ARRAY_WRITE 0x131 #define SYM_ARRAY_CREATE 0x132 #define SYM_SYMBOL_TO_STRING 0x140 #define SYM_STRING_TO_SYMBOL 0x141 #define SYM_SYMBOL_TO_UINT 0x142 #define SYM_UINT_TO_SYMBOL 0x143 #define SYM_SET_CAR 0x145 #define SYM_SET_CDR 0x146 #define SYM_IS_FUNDAMENTAL 0x150 #define SYM_TYPE_OF 0x200 #define FUNDAMENTALS_END 0x200 #define MAX_SPECIAL_SYMBOLS 4096 // 12bits (highest id allowed is 0xFFFF) /** Initialize the symbol table. * * \return 1 */ extern int lbm_symrepr_init(void); /** Add a symbol to the symbol table. The symbol name string is copied to arrays and symbols memory. * * \param name String representation of the symbol. * \param id Resulting id is returned through this argument. * \return 1 for success and 0 for failure. */ extern int lbm_add_symbol(char *name, lbm_uint *id); /** Add a symbol to the symbol table. The name is assumed to be a statically allocated string. * * \param name Statically allocated name string. * \param id Resulting id is returned through this argument. * \return 1 for success and 0 for failure. */ extern int lbm_add_symbol_const(char *name, lbm_uint *id); /** Look up an id from the symbol table given a name. * * \param name Name string to look up. * \param id Resulting id is returned through this argument. * \return 1 on success (name was found) and 0 for failure. */ extern int lbm_get_symbol_by_name(char *name, lbm_uint *id); /** Look up a symbol name from the symbol table given an id. * * \param id The id to look up in the symbol table. * \return pointer to the name string if success otherwise NULL. */ extern const char* lbm_get_name_by_symbol(lbm_uint id); /** * * \return The amount of space occupied by the symbol table in bytes. */ extern unsigned int lbm_get_symbol_table_size(void); static inline bool lbm_is_error(lbm_uint symrep){ return (symrep == SYM_RERROR || symrep == SYM_TERROR || symrep == SYM_RERROR || symrep == SYM_MERROR || symrep == SYM_EERROR || symrep == SYM_FATAL_ERROR); } #endif