/* l2xisymt.h Symbol table common for LTX2X interpreter */ /* the principal typedefs are in file licomsym.h */ #ifndef symtab_h #define symtab_h #include "l2xicmon.h" #ifndef licomsym_h #include "licomsym.h" /* contains the typedefs */ #endif typedef char *STRING; /* a pointer to a char */ typedef STRING *PTRADR; /* pointer to a pointer to a char */ /* use names rather than integers for TRUE (1) /FALSE (0) values */ #define FALSE_REP -999 #define UNKNOWN_REP -99 #define TRUE_REP -9 /* the simple pre-defined types */ extern TYPE_STRUCT dummy_type; extern TYPE_STRUCT_PTR integer_typep, real_typep; extern TYPE_STRUCT_PTR string_typep, binary_typep; extern TYPE_STRUCT_PTR boolean_typep, logical_typep; extern TYPE_STRUCT_PTR generic_typep, any_typep; /* FUNCTIONS */ SYMTAB_NODE_PTR search_symtab(); SYMTAB_NODE_PTR search_symtab_display(); SYMTAB_NODE_PTR enter_symtab(); SYMTAB_NODE_PTR exit_scope(); TYPE_STRUCT_PTR make_string_typep(); /* MACROS */ #define is_array(tp) (tp->form == ARRAY_FORM) #define is_dynagg(tp) (tp->form == BAG_FORM || \ tp->form == LIST_FORM || \ tp->form == SET_FORM) /* table searching macros */ /**************************************************************************/ /* search_local_symtab() search the local symtab for the current id name. */ /* set a pointer to the entry, else NULL */ #define search_local_symtab(idp) \ idp = search_symtab(word_string, symtab_display[level]) /**************************************************************************/ /**************************************************************************/ /* search_this_symtab() search the given symtab for the current id name. */ /* set a pointer to the entry, else NULL */ #define search_this_symtab(idp, this_symtab) \ idp = search_symtab(word_string, this_symtab) /**************************************************************************/ /**************************************************************************/ /* search_all_symtab() search the symtab display for the current id name. */ /* set a pointer to the entry, else NULL */ #define search_all_symtab(idp) \ idp = search_symtab_display(word_string) /**************************************************************************/ /**************************************************************************/ /* search_and_find_all_symtab() search the symtab display for the current */ /* id name. If not found, ID UNDEFINED error, and */ /* enter into the local symtab. */ /* set a pointer to the entry. */ #define search_and_find_all_symtab(idp) \ if ((idp = search_symtab_display(word_string)) == NULL) { \ error(UNDEFINED_IDENTIFIER); \ idp = enter_symtab(word_string, &symtab_display[level]); \ idp->defn.key = UNDEFINED; \ idp->typep = &dummy_type; \ } /**************************************************************************/ /**************************************************************************/ /* enter_local_symtab() enter the current id name into the local symtab */ /* and set pointer to the entry */ #define enter_local_symtab(idp) \ idp = enter_symtab(word_string, &symtab_display[level]) /**************************************************************************/ /**************************************************************************/ /* enter_name_local_symtab() enter the given name into the local symtab */ /* and set pointer to the entry */ #define enter_name_local_symtab(idp, name) \ idp = enter_symtab(name, &symtab_display[level]) /**************************************************************************/ /**************************************************************************/ /* search_and_enter_local_symtab() search the symtab display for the */ /* current id name. If not found enter it, else */ /* ID REDEFINED error. */ /* set a pointer to the entry. */ #define search_and_enter_local_symtab(idp) \ if ((idp = search_symtab(word_string, symtab_display[level])) == NULL) { \ idp = enter_symtab(word_string, &symtab_display[level]); \ } \ else error(REDEFINED_IDENTIFIER) /**************************************************************************/ /**************************************************************************/ /* search_and_enter_this_symtab() search the given symtab for the */ /* current id name. If not found enter it, else */ /* ID REDEFINED error. */ /* set a pointer to the entry. */ #define search_and_enter_this_symtab(idp, this_symtab) \ if ((idp = search_symtab(word_string, this_symtab)) == NULL) { \ idp = enter_symtab(word_string, &this_symtab); \ } \ else error(REDEFINED_IDENTIFIER) /**************************************************************************/ #endif