📄 symtab.h
字号:
BYTE type; unsigned /* copies of flags from symtab */ used:1, set:1, used_before_set:1, assigned:1;} ComListElement;typedef struct CMHead { /* ComListHeader: head node of common var list */ short numargs; unsigned line_num; ComListElement *com_list_array; struct gSymtEntry *module; char *filename,*topfile; struct CMHead *next; unsigned any_used:1, /* any of its variables accessed */ any_set:1, /* any of its variables set */ saved:1; /* declared in SAVE statement */} ComListHeader;typedef struct TLHead { /* TokenListHeader: head node of token list */ Token *tokenlist; struct TLHead *next; char *filename; unsigned line_num; unsigned external_decl:1, actual_arg:1;} TokenListHeader; /* Structure for intrinsic-function info */typedef struct IInfo{ char *name; short num_args, arg_type, result_type; unsigned short intrins_flags; /* nonstandard, mixed arg types */} IntrinsInfo; /* Define special num_args values for intrinsics that have variable numbers of arguments. */#define I_1or2 (-1) /* 1 or 2 arguments */#define I_2up (-2) /* 2 or more arguments */#define I_0or1 (-3) /* 0 or 1 argument */ /* for intrins_flags field */ /* Integer-valued intrinsics that are evaluated if args const */#define I_ABS 0x1#define I_SIGN 0x2#define I_DIM 0x3#define I_MOD 0x4#define I_MAX 0x5#define I_MIN 0x6#define I_ICHAR 0x7#define I_LEN 0x8#define I_INDEX 0x9#define I_EVALUATED 0xf /* any bit of digit set */ /* Various properties of intrinsics*/#define I_F77 0x00 /* Standard intrinsic (no flag: placeholder) */#define I_NONF77 0x10 /* Nonstandard */#define I_MIXED_ARGS 0x20 /* Has mixed arg types */#define I_NONPURE 0x40 /* Arg need not be set when called */#define I_C_TO_R 0x80 /* Complex -> real in generic form */#define I_NOTARG 0x100 /* Not allowed as actual argument */ /* Structure for call-tree child list */typedef struct childlist { struct gSymtEntry *child; /* Pointer to child's symtab entry */ struct childlist *next;/* Pointer to next child on list */} ChildList; /* Identifier symbol table declaration */typedef struct lSymtEntry{ char *name; /* Identifier name in stringspace */ InfoUnion info; struct lSymtEntry *equiv_link; /* Link for equivalence lists */ long size; /* Size of object in bytes */ BYTE type; /* Type & storage class: see macros below */ /* Flags */ unsigned used_flag: 1, /* value is accessed (read from variable) */ set_flag: 1, /* variable is set or passed as subr arg */ assigned_flag: 1, /* value is really set (by assignment stmt) */ used_before_set: 1,/* set_flag is not set when used_flag is set */ is_current_module: 1, /* this symtab entry is the main module */ library_module: 1, /* module was processed in -library mode */ array_var: 1, /* variable is dimensioned */ common_var: 1, /* variable is in common */ entry_point: 1, /* name of an entry point */ parameter: 1, /* name of a parameter */ argument: 1, /* dummy argument */ external: 1, /* function or subr called by this routine */ intrinsic: 1, /* intrinsic function */ saved: 1, /* named in SAVE statement */ invoked_as_func: 1, /* usage as f(x) was seen */ defined_in_include: 1, /* to suppress some warnings if unused */ declared_external: 1, /* explicitly declared external */ declared_intrinsic: 1; /* explicitly declared intrinsic */ int common_hash; int common_orig_hash; int record_hash; unsigned line_num; /* rigo */} Lsymtab;typedef struct gSymtEntry{ /* Global symbol table element */ char *name; /* Identifier name in stringspace */ InfoUnion info; union { struct childlist *child_list; /* List of callees (for module) */ struct gSymtEntry *module; /* Module (for interior entry) */ } link; long size; BYTE type; /* Type & storage class: see macros below */ /* Flags. See remarks above */ unsigned used_flag: 1, set_flag: 1, assigned_flag: 1, used_before_set: 1, library_module: 1, internal_entry: 1, /* entry point other than at the top */ invoked_as_func: 1, visited: 1, /* this entry point is in call tree */ visited_somewhere: 1, /* some entry point of module is in call tree */ defined_in_include: 1, declared_external: 1;} Gsymtab; /* Identifier hashtable declaration */typedef struct hashEntry { char *name; /* Identifier name in stringspace */ Lsymtab *loc_symtab, /* Local symtab entry for vars etc. */ *com_loc_symtab;/* Local symtab entry for common blocks */ Gsymtab *glob_symtab, /* Global symtab entry for vars etc. */ *com_glob_symtab;/* Global symtab entry for common blocks */ int define;} HashTable; /* Macro to zero out symbol table entry */#define clear_symtab_entry(S) {register int i;\ for(i=0;i<sizeof(*S);i++)((char*)S)[i]=0;} /* These macros pack and unpack datatype and storage class in type field of symbol table entry. Datatype is least 4 bits. */#define datatype_of(TYPE) ((unsigned)((TYPE) & 0xF))#define storage_class_of(TYPE) ((unsigned)((TYPE) >> 4))#define type_byte(SCLASS,DTYPE) ((unsigned)(((SCLASS)<<4) + (DTYPE))) /* This macro is for pattern matching in flag checking */#define flag_combo(A,B,C) (((A)<<2) | ((B)<<1) | (C)) /* These macros are for dimensions & sizes of arrays */#define array_dims(dim_info) ((dim_info)&0xF)#define array_size(dim_info) ((dim_info)>>4)#define array_dim_info(dim,size) (((long)(size)<<4)+(dim)) /* Defns used by expression type propagation mechanisms in fortran.y and exprtype.c The flags go in token.subclass */#define make_true(flag,x) ((x) |= (flag)) /* x.flag <-- true */#define make_false(flag,x) ((x) &= ~(flag)) /* x.flag <-- false */#define is_true(flag,x) ((x) & (flag)) /* x.flag == true? */#define copy_flag(flag,x,y) ((x) |= ((y)&(flag))) /* x.flag <-- y.flag */#define ID_EXPR 0x1 /* a variable */#define LVALUE_EXPR 0x2 /* assignable */#define CONST_EXPR 0x4 /* compile-time constant per std 6.7*/#define LIT_CONST 0x8 /* a number or string literal */#define ARRAY_ID_EXPR 0x10 /* an array or array element */#define INT_QUOTIENT_EXPR 0x20 /* contains INT/INT */#define STMT_FUNCTION_EXPR 0x40#define PARAMETER_EXPR 0x80 /* == CONST_EXPR || intrinsic || **real */#define EVALUATED_EXPR 0x100 /* token.value has value of expr */#define SET_FLAG 0x200 /* these are for id's and lvalues */#define ASSIGNED_FLAG 0x400#define USED_BEFORE_SET 0x800#define COMPLEX_FLAG 0x1000 /* remembers complex_const_allowed */#define CHAR_ID_EXPR 0x2000 /* char var or array elt not substr */#define IN_ASSIGN 0x4000 /* for tracking assgn stmt lhs */#define COMMA_FLAG 0x8000/* keeps track of extra or missing commas in exprlists */#define NONSTD_USAGE_FLAG 0x10000 /* concentrator for -f77 warnings */#define SYNTAX_ERROR_FLAG 0x20000 /* concentrator for syntax errors */#ifdef DYNAMIC_TABLES /* tables will be mallocked at runtime */SYM_SHAREDLsymtab *loc_symtab#ifdef SYMTAB =(Lsymtab *)NULL#endif;SYM_SHAREDGsymtab *glob_symtab#ifdef SYMTAB =(Gsymtab *)NULL#endif;SYM_SHAREDHashTable *hashtab#ifdef SYMTAB =(HashTable *)NULL#endif;SYM_SHAREDchar *strspace#ifdef SYMTAB =(char *)NULL#endif;SYM_SHAREDToken *tokenspace#ifdef SYMTAB =(Token *)NULL#endif;SYM_SHAREDTokenListHeader *tokheadspace#ifdef SYMTAB =(TokenListHeader *)NULL#endif;#else /* static tables declared at compile time */ /* Each major table is housed in a separate file so that on IBM PC architecture with huge memory model each will be in its own 64K segment not all in one. */#ifndef PLSYMTABextern#endifLsymtab loc_symtab[LOCSYMTABSZ]; /* Local identifiers */#ifndef PGSYMTABextern#endifGsymtab glob_symtab[GLOBSYMTABSZ]; /* Global identifiers: subrs and com blks */#ifndef EXPRTYPEextern#endifHashTable hashtab[HASHSZ]; /* Hash table for identifier lookup */#ifndef SYMTABextern#endifchar strspace[STRSPACESZ]; /* String space for storing identifiers */#ifndef FORLEXextern#endifToken tokenspace[TOKENSPACESZ]; /* Tokens for arg lists etc */#ifndef PROJECTextern#endifTokenListHeader tokheadspace[TOKENSPACESZ];/* Tokenlist headers */#endif /* Shared routines */ /* in fortran.y/fortran.c */voidcheck_seq_header(), check_stmt_sequence(); /* in plsymtab.c */voiddebug_symtabs(), print_loc_symbols(); /* in symtab.c */voidcheck_loose_ends(),call_func(), call_subr(), declare_type(), def_arg_name(),def_array_dim(), def_com_block(), def_com_variable(),def_equiv_name(), def_ext_name(), def_function(), def_intrins_name(),def_namelist(), def_namelist_item(), def_parameter(),def_stmt_function(), do_ASSIGN(), do_assigned_GOTO(), do_ENTRY(),do_RETURN(), equivalence(),process_lists(), ref_array(), ref_namelist(), ref_variable(),save_com_block(), save_variable(), set_implicit_type(),stmt_function_stmt(),use_actual_arg(), use_implied_do_index(),use_io_keyword(), use_special_open_keywd(),use_lvalue(), use_parameter(),use_function_arg(), use_variable();Token*new_token();Lsymtab *install_local();Gsymtab *install_global();unsignedhash_lookup();intdef_curr_module(), get_type(), int_expr_value();char *token_name(); /* in hash.c (now symtab.c) */unsigned longhash(), kwd_hash(), rehash(); /* in exprtype.c */voidbinexpr_type(),unexpr_type(),assignment_stmt_type(),func_ref_expr(),primary_id_expr(),stmt_fun_arg_cmp();intintrins_arg_cmp();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -