/* * symbol.h * Symbol structures and prototypes for 2Iota. * $Id: symbol.h 518 2010-04-28 17:48:38Z cpressey $ */ #ifndef __SYMBOL_H #define __SYMBOL_H /* * Along with the global symbol table, individual symbol * tables exist for each event (for local parameters.) */ struct symbol_table { struct symbol *head; }; struct symbol { char *token; /* lexeme making up the symbol */ int type; /* SYM_TYPE_*, below */ struct symbol *next; /* next symbol in symbol table */ /* * For SYM_TYPE_ALPHABET and SYM_TYPE_PARAMETER, * 'alpha' points to the associated struct alphabet. */ struct alphabet *alpha; /* * For SYM_TYPE_PARAMETER symbols in an * event-local symbol table, 'data' points to a symstr * representing each parameter's bound value. */ struct symstr *data; }; #define SYM_TYPE_LITERAL 0 /* symbols which 'just appear' (part of event name) */ #define SYM_TYPE_ALPHABET 1 /* symbol is the name of an alphabet */ #define SYM_TYPE_SYMBOL 2 /* symbol is a symbol in an alphabet */ #define SYM_TYPE_PARAMETER 3 /* symbol is the name of a parameter */ #define SYM_LOOKUP_UNIQUE 0 /* symbol must not already exist */ #define SYM_LOOKUP_DEFINE 1 /* symbol may or may not already exist */ #define SYM_LOOKUP_EXTANT 2 /* symbol must already exist */ struct symbol_table *symbol_table_new(void); void symbol_table_free(struct symbol_table *); void symbol_table_unbind(struct symbol_table *); struct symbol *symbol_define(struct symbol_table *, char *, int); struct symbol *symbol_lookup(struct symbol_table *, char *); void symbol_free(struct symbol *); struct symbol *symbol_prev(struct symbol *, struct alphabet *); struct symbol *symbol_next(struct symbol *, struct alphabet *); void symbol_table_dump(int, struct symbol_table *); void symbol_print(struct symbol *); void symbol_dump(int, struct symbol *); #endif /* !__SYMBOL_H */