COMPILER.DEF/MOD, compiler.txt 1350 lines)Core idea: Compiler owns the symbol descriptor and the
predefined environment. Everything else (Scanner/SymTab/Express/...)
allocates and links these nodes.
Record / RecordPtr / ArrayPtrRecordPtr = POINTER TO Record;
Record = RECORD
word0: RecordPtr; (* scope chain link / backlink *)
word1: RecordPtr; (* name string *)
word2: RecordPtr; (* type / return type *)
word3: BITSET; (* kind: 64 const/type, 192 proc, 256 indexed var, 1089 module *)
word4: CARDINAL; (* node class 0..11, module class 6 *)
word5: WORD; (* const value / stdproc no. / elem type *)
high: WORD; (* max / param list / scope list *)
END;
ArrayPtr = POINTER TO ARRAY [0..5] OF WORD; (* param lists *)
PROC15(cnt,ret,first) builds p^[0]=cnt, p^[1]=ret, p^[2]=first
into global35 (last list); caller patches global35^[3..5].
| old | proposed | role |
|---|---|---|
| global2 | rangeCheckOpt |
2 IN Scanner.global2 |
| global3/4 | curScopeAnchor/outerScope |
scope list heads |
| global5 | keywordHashTab |
PROC13 table (730,731,1245,...) |
| IntType/CardType/AddressType/RealType | same | PROC9/PROC14 |
| LongintType/LongrealType/CharType/BooleanType/BitsetType/ProcType | same | — |
| WordType/ByteType/global17 | same / addrAlias |
BYTE^.word2:=WORD |
| global20/21 | systemMod/storageMod |
module descriptors (word4=6,word3=1089) |
| global22 | allocSig |
PROC15(2,2,CARD)+ADDRESS |
| global23/24 | systemScope/storageScope |
word0=global4,word1=list |
| global25/26 | genZ80Requested/inCompile |
FALSE/TRUE init in PROC1 |
| global27-30 | (reserved Pass1/Stmt/Expr temps) | — |
| global31/32/33 | curScope/saveScope/baseScope |
insertion head |
| global34 | bitsetRange |
PROC8(1,1),word2=CARD,high=15 |
| global35 | lastParamList |
see PROC15 |
| global12 | charElemDesc |
PROC8(0,11),word5=CHAR |
| old | proposed | behaviour |
|---|---|---|
| PROC3 | InsertIdent |
Scanner.proc15+proc16, chain on global31 |
| PROC4 | DeclConst |
TRUE/FALSE/NIL, IORESULT/HLRESULT, ... |
| PROC5 | DeclStdProc |
CAP/HALT/TRUNC/BREAK/TRANSFER/... |
| PROC6 | DeclProc |
READ/WRITE/NEW/DISPOSE/INC/DEC/INCL/EXCL/CODE, word3:=192 |
| PROC7 | DeclFunc |
CARD/INT/LONG/FLOAT/ABS/.../ADR/TSIZE + return type |
| PROC8 | NewTypeDesc |
Scanner.proc14 + word3:=size |
| PROC9 | DeclType |
INTEGER/CHAR/BOOLEAN/CARD/REAL/LONGREAL/BITSET/PROC/..., double-linked |
| PROC10/11 | InitOperators |
fills ERRORS.global3 (:=, .., <=, >=, <>, (., .), (:, :) ) |
| PROC12 | InitCharClass |
A-Z->10, 0-9->11, ... into Scanner.global24 |
| PROC13 | InitKeywords |
30 hash codes into global5 |
| PROC14 | DeclarePredefTypes |
all base types + PROCESS, saves global32/33 |
| PROC15 | MakeParamList |
see above |
| PROC16 | DeclareStdNames |
TRUE/FALSE/NIL + std procs/funcs + global4 scope |
| PROC17 | DeclareSYSTEM |
IORESULT/HLRESULT, CODE/ADR/TSIZE/.../BDOS/BIOS/MOVE/FILL/INP/OUT, builds global20/23 |
| PROC18 | DeclareSTORAGE |
ALLOCATE/DEALLOCATE/MARK/RELEASE/FREEMEM, builds global21/24 |
| PROC1 | InitCompiler |
PROC10/12/13/14/16/17/18, %L option, FREEMEM print, SymTab allocs |
| GETINP | OpenSourceOutput |
Files.Open(inName), RedirectOutput, @@@ output, BDOS 29, UseError handler |
| proc19-28 | imported | actually Scanner.proc7/14/15/16/17/25/28, SymTab, Texts — not real Compiler procs; the COMPILER.DEF proc1..28 list is an obfuscated stub |