Mercurial > hg > octave-terminal
changeset 8:bd072d0a95f9
[project @ 1993-08-08 03:55:11 by jwe]
Initial revision
author | jwe |
---|---|
date | Sun, 08 Aug 1993 03:55:11 +0000 |
parents | d68036bcad4c |
children | c9d293a496cf |
files | src/symtab.h |
diffstat | 1 files changed, 234 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/src/symtab.h @@ -0,0 +1,234 @@ +// Symbol table classes. -*- C++ -*- +/* + +Copyright (C) 1992, 1993 John W. Eaton + +This file is part of Octave. + +Octave 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 2, or (at your option) any +later version. + +Octave 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 Octave; see the file COPYING. If not, write to the Free +Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#if !defined (_symtab_h) +#define _symtab_h 1 + +#ifdef __GNUG__ +#pragma interface +#endif + +#include <stdlib.h> +#include <string.h> +#include <iostream.h> +#include <assert.h> + +#ifndef SV_FUNCTION_TYPEDEFS +#define SV_FUNCTION_TYPEDEFS 1 + +typedef int (*sv_Function)(void); + +#endif + +#define HASH_TABLE_SIZE 1024 /* Must be multiple of 2 */ +#define HASH_MASK (HASH_TABLE_SIZE - 1) + +class tree; +class tree_builtin; +class tree_constant; +class tree_function; + +class symbol_def; +class symbol_record; +class symbol_table; + +/* + * Variables or functions. + */ +class symbol_def +{ + friend class symbol_record; + +public: + + enum symbol_type + { + unknown_type, + variable, + builtin_function, + user_function, + }; + + enum symbol_lifespan + { + temporary, + eternal, + }; + + enum symbol_class + { + read_write, + read_only, + }; + + symbol_def (void); + symbol_def (tree_constant *t); + symbol_def (tree_builtin *t); + symbol_def (tree_function *t); + + ~symbol_def (void); + + void define (tree_constant *t); + void define (tree_builtin *t); + void define (tree_function *t); + + tree *def (void); + char *help (void); + void document (char *h); + + int save (ostream& os, int mark_as_global); + +private: + + char *help_string; + symbol_lifespan lifespan; + symbol_class sym_class; + symbol_type type; + tree *definition; + int count; + int preserve; + + symbol_def (const symbol_def& sd); + symbol_def& operator = (const symbol_def& sd); +}; + +/* + * Individual records in a symbol table. + */ +class +symbol_record +{ + friend class symbol_table; + +public: + symbol_record (void); + symbol_record (char *n); + symbol_record (char *n, symbol_record *nxt); + + ~symbol_record (void); + + char *name (void); + char *help (void); + tree *def (void); + + int is_function (void); + int is_variable (void); + + int is_defined (void); + + void set_sv_function (sv_Function f); + + int var_read_only (void); + int read_only (void); + + int define (tree_constant *t); + int define (tree_builtin *t); + int define (tree_function *t); + int define_as_fcn (tree_constant *t); + + void document (char *h); + + void protect (void); + void unprotect (void); + void make_eternal (void); + + int save (ostream& os, int mark_as_global = 0); + + void clear_visible (void); + void clear_all (void); + void undefine (void); + + void mark_as_formal_parameter (void); + int is_formal_parameter (void); + + void alias (symbol_record *s, int force = 0); + + symbol_record *next (void); + +private: + + char *nm; + int formal_param; + symbol_def *var; + symbol_def *fcn; + sv_Function sv_fcn; + symbol_record *next_elem; + + symbol_record (const symbol_record& s); + symbol_record& operator = (const symbol_record& s); +}; + +/* + * A symbol table. + */ +class +symbol_table +{ +public: + + symbol_table (void); + + symbol_record *lookup (char *nm, int insert = 0, int warn = 0); + + void clear (void); + int clear (char *nm); + void undefine (void); + + void bind_globals (void); + + int save (ostream& os, int mark_as_global = 0); + int save (ostream& os, char *name, int mark_as_global = 0); + + int size (void); + + char **list (void); + char **var_list (void); + char **fcn_list (void); + + char **list (int& count); + char **var_list (int& count); + char **fcn_list (int& count); + + char **sorted_list (void); + char **sorted_var_list (void); + char **sorted_fcn_list (void); + + char **sorted_list (int& count); + char **sorted_var_list (int& count); + char **sorted_fcn_list (int& count); + +private: + + unsigned int hash (const char *s); + + symbol_record table[HASH_TABLE_SIZE]; +}; + +#endif + +/* +;;; Local Variables: *** +;;; mode: C++ *** +;;; page-delimiter: "^/\\*" *** +;;; End: *** +*/