20-compiler-module.md 3.6 KB

Compiler module (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 / ArrayPtr

RecordPtr = 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].

Globals (proposed names)

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

Procedures (proposed names)

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