ORCA-C/Symbol.pas

1 line
51 KiB
ObjectPascal
Raw Normal View History

{$optimize 7} {---------------------------------------------------------------} { } { Symbol Table } { } { Handle the symbol table. } { } { External Subroutines: } { } { CheckStaticFunctions - check for undefined functions } { CompTypes - Determine if the two types are compatible } { DoGlobals - declare the ~globals and ~arrays segments } { FindSymbol - locate a symbol in the symbol table } { GenParameters - Generate labels and space for the parameters } { GenSymbols - generate a symbol table for the debugger } { InitSymbol - initialize the symbol table handler } { NewSymbol - insert a new symbol in the symbol table } { PopTable - Pop a symbol table (remove definitions local to a } { block) } { PushTable - Create a new symbol table, pushing the old one } { ResolveForwardReference - resolve a forward reference } { } { External Variables: } { } { noDeclarations - have we declared anything at this level? } { table - current symbol table } { } { bytePtr - pointer to the base type for bytes } { uBytePtr - pointer to the base type for unsigned bytes } { wordPtr - pointer to the base type for words } { uWordPtr - pointer to the base type for unsigned words } { longPtr - pointer to the base type for long words } { uLongPtr - pointer to the base type for unsigned long words } { realPtr - pointer to the base type for reals } { doublePtr - pointer to the base type for double precision } { reals } { compPtr - pointer to the base type for comp reals } { extendedPtr - pointer to the base type for extended reals } { voidPtr - pointer to the base type for void } { voidPtrPtr - typeless pointer, for some type casting } { stringTypePtr - pointer to the base type for string } { constants } { defaultStruc - default for structures with errors } { } {---------------------------------------------------------------} unit Symbol; {$LibPrefix '0/obj/'} interface uses CCommon, CGI, MM, Scanner; {$segment 'cc'} {---------------------------------------------------------------} type symbolTablePtr = ^symbolTable; symbolTable = record {a symbol table} {NOTE: the array of buckets must come first in the record!} buckets: array[0..hashSize2] of identPtr; {hash buckets} next: symbolTablePtr; {next symbol table} staticNum: packed array[1..6] of char; {staticNum at start of table} end; var noDeclarations: boolean; {have we declared anything at this level?} table: symbolTablePtr; {current symbol table} globalTable: symbolTablePtr; {global symbol table} bytePtr,uBytePtr,wordPtr,uWordPtr, {base types} longPtr,uLongPtr,realPtr,doublePtr,compPtr,extendedPtr, stringTypePtr,voidPtr,voidPtrPtr,defaultStruct: typePtr; {---------------------------------------------------------------} procedure CheckStaticFunctions; { check for undefined functions } function CompTypes (t1, t2: typePtr): boolean; { Determine if the two types a