60-frontend.md 3.5 KB

Frontend: COMPILE = Pass1 + Statemen + Express

No .MOD decompiled yet — only compile.txt (74) / pass1.txt (2975) / statement.txt (1793) / express.txt (3898). Names below are inferred (~ = internal, no header).

COMPILE dispatcher

COMPILE.DIR/ = COMPILE.MCD (link stub) + PASS1/STATEMEN/EXPRESS.MCD. compile.txt is a char-compare + byte-copy loop with call .proc24 (~FindKeyword/~StrCmp), i.e. the link stub's keyword-hash helper, not a parser. Loaded by Scanner.Compile; GENZ80 loaded afterwards if Compiler.global25.

Token codes used everywhere: Scanner.word5 = current symbol, word9 = ident class, word11 = text, word12 = type.

Pass1 — declarations/scopes/types

proc proposed
proc4/5 ~PushTempMark/~PopTempMark (bracket EXPRESS.proc1(err 82))
proc6/7 ~AllocSymEntry/~LinkSymEntry
proc1 ~InsertSetConst
proc2/3 ~CondInsert/~InsertEntry
proc8 ~OpenScopeEmit (CODEGEN.proc18/21/3)
proc12 ~TypeSizeRec (recursive, self-call)
proc13 ~GetIdent (returns Scanner.word12)
proc16 ~ParseImportItem (Expect(42)=FROM?)
proc17 ~ParseConstDecl
proc18 ~ParseVarDecl
proc19 ~ParseType (largest: enum/subrange/pointer/PROC/record/array)
proc14 ~ParseRecordType (incl. variant)
proc15/20/21 ~ParseFormals/~ParseValParam/~ParseVarParam
proc22 ~ParseFieldList
proc23 ~EvalConstExpr
proc25 ~CloseScopeFixup
PROCDE ParseProcedureDecl
MODULD/MODBLO/MAINDE ParseModuleHead/ParseBlock/ParseMain(DEFINITION/IMPLEMENTATION/PROGRAM)
proc28 ~ParseExportList
DCL/DCLS/IMEXDC ParseOneDecl/ParseDecls/ParseImports (ERRORS.proc11, CODEGEN.proc22 recovery)
proc9/33/35/34/36/PASS1 ~WriteSym/~WriteMcdHeader/~EmitConst/~EmitType/~CheckForwards/Main

Statemen — statements

  • Internal: proc1 ~NextSymWrap, proc4 ~ParseStatSeqLoop, proc15 ~EmitJumpFixup, proc2 ~CalcMemOffset, proc3 ~SyncToStatStart.
  • STMT = ParseStatement: switch(word5): 121..130 -> proc10..proc5 (IF/WHILE/REPEAT/LOOP/WITH/CASE/...); ident-led: word9=4 call (EXPRESS.proc15+Expect(43)=(), =5 assign (EXPRESS.proc17/18+Expect(27)=:=), =0 error 128.
  • proc5 = ParseFOR (largest frame), proc16 = ParseCASE, proc6..14 = ParseIF/WHILE/REPEAT/..., proc17/18/19 block tails, BODY = ParseBeginBlock, STATSE = GuardedStatSeq (saves Scanner.word2/25, CODEGEN.word2, SYMTAB.word5; ERRORS.proc11 recovery).

Express — expressions

  • EXPRES = ParseExpression: proc48 SimpleExpr then relops 51..57 (=/#/</<=/>/>=/IN), CODEGEN.proc17(23)+proc6, proc35-fold, proc27-join; const path CODEGEN.proc4, general CODEGEN.proc10(4).
  • Helpers: proc48 ~ParseSimpleExpr, proc37/38/40/41/42 ~Term/Factor/Set/Call/Cast, proc21/20/15 ~DesignatorBase/Selector/Tail, ASSIGN ~ParseAssign (stmt + func-result), proc35 ~FoldConstOp, proc9 ~MatchOpClass, proc7/8/13/14/16 ~ConstToCard/Int/GetVal/GetType/EvalConst, proc43..46 ~ExpandStdProc, proc47/51/50/49 ~FoldRel/CheckRel/EmitCmp/EmitRange, proc18/19 ~Load/StoreOperand, proc4/5 ~Push/PopExprDesc.

Shared: Scanner.proc1/4/8/9/13/17/19/20 (Get/Accept/Expect/Test/OpenScope/entries), EXPRESS.proc1 central error (47/52/61/82/73/74), CODEGEN.proc1/3/4/6/10/12/13/14/16/17/18/19/21/22. Decompile order: EXPRES/proc48/proc35/proc9 -> STMT/STATSE/proc4 -> CASE/FOR -> Pass1 proc13/19/14 -> DCL/DCLS/IMEXDC -> PROCDE/MODBLO/MAINDE -> WriteSym.