Sfoglia il codice sorgente

feat(compiler): v1.00 verification campaign + toolchain findings

COMPILER.MOD proven byte-identical (18/19 procs; only linkage names
differ by design). Full scripted loop (m2drive.py consumed-cursor
rewrite, chain.sh) drives original v1.00 to recompile our tree.
Fixes from hardware feedback: DEF import trimming (name-table
budget), exact DEF/MOD param-name match, BITSET set-literals,
no-CAST/VAL adaptations, StrCmp ADDRESS+overlay, VarAddr open-array
shim, LEA=external/SYM-table allocator insight, export-slot table
order, PASS1-per-compile init + SCANNER-opener call split,
EDITOR.DEF editOkFlag, SYMTAB words 10-27 to implementation.
GENZ80 trigger closed; NATIVE found+drafted; original genz80.mcd
recovered and disassembled.
Open: SCANNER.MOD OOM cliff under investigation (heap, razor-marginal).
Eric Streit 4 giorni fa
parent
commit
b890179fe9

+ 2 - 0
.gitignore

@@ -6,3 +6,5 @@ Turbo-Modula-2-Reloaded-main/
 *.MCD
 *.SYM
 *~
+/tmp/
+/opencode/

+ 10 - 31
src/compiler/COMPILER.DEF

@@ -1,7 +1,8 @@
 (* Renamed for readability. Semantics unchanged.
-   NOTE: overlayProc01..28 below are the obfuscated link-stub imports
-   (originally overlayProc01..overlayProc28); the real Compiler API is the globals +
-   InitCompiler/InsertIdent/... in COMPILER.MOD. See RENAME-MAP.md. *)
+   NOTE: the original DEF also listed 28 obfuscated link-stub procedure
+   imports (proc1..proc28); they have no bodies anywhere and unresolved
+   FORWARDs fail the real compiler, so they are NOT declared here (verified
+   on hardware: nothing references them). *)
 DEFINITION MODULE Compiler;
 FROM SYSTEM IMPORT BYTE,WORD,ADDRESS;
 
@@ -45,32 +46,10 @@ VAR
     nativeCodeRequested: BOOLEAN;
     compilationActive: BOOLEAN;
 
-PROCEDURE overlayProc01;
-PROCEDURE overlayProc02;
-PROCEDURE overlayProc03;
-PROCEDURE overlayProc04;
-PROCEDURE overlayProc05;
-PROCEDURE overlayProc06;
-PROCEDURE overlayProc07;
-PROCEDURE overlayProc08;
-PROCEDURE overlayProc09;
-PROCEDURE overlayProc10;
-PROCEDURE overlayProc11;
-PROCEDURE overlayProc12;
-PROCEDURE overlayProc13;
-PROCEDURE overlayProc14;
-PROCEDURE overlayProc15;
-PROCEDURE overlayProc16;
-PROCEDURE overlayProc17;
-PROCEDURE overlayProc18;
-PROCEDURE overlayProc19;
-PROCEDURE overlayProc20;
-PROCEDURE overlayProc21;
-PROCEDURE overlayProc22;
-PROCEDURE overlayProc23;
-PROCEDURE overlayProc24;
-PROCEDURE overlayProc25;
-PROCEDURE overlayProc26;
-PROCEDURE overlayProc27;
-PROCEDURE overlayProc28;
+(* Exported drivers: SCANNER.Compile calls OpenSourceAndOutput (opens the
+   source file); PASS1's main calls InitCompiler once per compile (rebuilds
+   predefined scopes). Proven on hardware against Reloaded MCD export slots. *)
+PROCEDURE InitCompiler;
+PROCEDURE OpenSourceAndOutput;
+
 END Compiler.

+ 61 - 58
src/compiler/COMPILER.MOD

@@ -1,7 +1,10 @@
 (* Renamed for readability. Semantics unchanged. Original identifiers: see docs/compiler/ + src/compiler/RENAME-MAP.md. *)
 IMPLEMENTATION MODULE COMPILER;
 IMPORT SCANNER, Files, SYMTAB, ERRORS, Texts, Terminal, ComLine;
-FROM SYSTEM IMPORT ADDRESS, ADR, WORD, BDOS, IORESULT;
+FROM SYSTEM IMPORT ADR, BDOS, IORESULT; (* NOTE: ADDRESS/WORD/BYTE NOT imported here
+   although used below — they come via the DEFINITION module's own SYSTEM
+   import, which this compiler leaks into the implementation scope; listing
+   them again is a hard error ("ADDRESS is declared twice", proven). *)
 FROM STORAGE IMPORT FREEMEM;
 
 (* $[+ remove procedure names *)
@@ -17,16 +20,16 @@ VAR
     bitsetRangeDesc: RecordPtr;
     lastParamList: ArrayPtr;
 
-PROCEDURE InitCompiler; FORWARD;
-PROCEDURE OpenSourceAndOutput; FORWARD;
+(* InitCompiler/OpenSourceAndOutput are DEF-declared (no FORWARD here:
+   v1.00 rejects a FORWARD duplicating a DEF declaration). *)
 
 PROCEDURE InsertIdent(keyword: ARRAY OF CHAR; kind: CARDINAL):ADDRESS;
 VAR ptr : RecordPtr;
 BEGIN
   ptr := SCANNER.NewNode(kind);
-  SCANNER.CopyStringToHeap(ptr^.word1, keyword);
+  SCANNER.CopyStr(ptr^.word1, keyword);
   ptr^.word0 := curScopeHead;
-  ptr^.word3 := 64;
+  ptr^.word3 := BITSET{6}; (* was 64 *)
   curScopeHead := ptr;
   RETURN ptr
 END InsertIdent;
@@ -52,7 +55,7 @@ END DeclStdProc;
 PROCEDURE DeclProc(keyword: ARRAY OF CHAR; procNo: CARDINAL);
 BEGIN 
   DeclStdProc(keyword, procNo, 0);
-  curScopeHead^.word3 := 192;
+  curScopeHead^.word3 := BITSET{6,7}; (* was 192 *)
 END DeclProc;
 
 
@@ -63,16 +66,16 @@ BEGIN
 END DeclFunc;
 
 
-PROCEDURE NewTypeDesc(typeSize,typeId: CARDINAL): RecordPtr;
+PROCEDURE NewTypeDesc(typeSize: BITSET; typeId: CARDINAL): RecordPtr;
 VAR ptr : RecordPtr;
 BEGIN
-  ptr := SCANNER.NewSizedNode(typeId);
+  ptr := SCANNER.NewSized(typeId);
   ptr^.word3 := typeSize;
   RETURN ptr
 END NewTypeDesc;
 
 
-PROCEDURE DeclType(keyword: ARRAY OF CHAR; tsize, id: CARDINAL): ADDRESS;
+PROCEDURE DeclType(keyword: ARRAY OF CHAR; tsize: BITSET; id: CARDINAL): ADDRESS;
 VAR ptr, ptr2 : RecordPtr;
 BEGIN 
   ptr := InsertIdent(keyword, 3);
@@ -94,7 +97,7 @@ PROCEDURE InitOperatorTable;
     INC(opIndex,3);
   END AddOperator;
 BEGIN 
-  SCANNER.HeapAlloc(ERRORS.opCharTable, 27);
+  SCANNER.Allocate(ERRORS.opCharTable, 27);
   opIndex := 0;
   AddOperator(':','=',27);
   AddOperator('.','.', 4);
@@ -113,22 +116,22 @@ VAR chCode: CARDINAL;
     glyphs: ARRAY [0..64] OF CHAR;
     code : CARDINAL;
 BEGIN 
-  SCANNER.HeapAlloc(SCANNER.charClassTable, 128);
+  SCANNER.Allocate(SCANNER.charClas, 128);
   chCode := ORD('A');
   REPEAT
-    SCANNER.charClassTable^[chCode]    := CHR(10);
-    SCANNER.charClassTable^[chCode+32] := CHR(10);
+    SCANNER.charClas^[chCode]    := ORD(CHR(10));
+    SCANNER.charClas^[chCode+32] := ORD(CHR(10));
     INC(chCode);
   UNTIL chCode > ORD('Z');
-  chCode := ORD('0'); REPEAT SCANNER.charClassTable^[chCode] := CHR(11); INC(chCode) UNTIL chCode > ORD('9');
-  SCANNER.charClassTable^[ORD('!')] := CHR(8);
-  SCANNER.charClassTable^[ORD('~')] := CHR(66);
-  SCANNER.charClassTable^[ORD(DEL)] := CHR(4);
-  SCANNER.charClassTable^[ORD('"')] := CHR(12);
+  chCode := ORD('0'); REPEAT SCANNER.charClas^[chCode] := ORD(CHR(11)); INC(chCode) UNTIL chCode > ORD('9');
+  SCANNER.charClas^[ORD('!')] := ORD(CHR(8));
+  SCANNER.charClas^[ORD('~')] := ORD(CHR(66));
+  SCANNER.charClas^[ORD(DEL)] := ORD(CHR(4));
+  SCANNER.charClas^[ORD('"')] := ORD(CHR(12));
   glyphs := " ,:. )]}|;  '                              ([{^     =#<>  +-*  /&";
   code := 0;
   REPEAT
-    IF glyphs[code] <> ' ' THEN SCANNER.charClassTable^[ORD(glyphs[code])]:=CHR(code) END;
+    IF glyphs[code] <> ' ' THEN SCANNER.charClas^[ORD(glyphs[code])]:=ORD(CHR(code)) END;
     INC(code)
   UNTIL code > 64;
 END InitCharClasses;
@@ -136,7 +139,7 @@ END InitCharClasses;
 PROCEDURE InitKeywordTable; 
 VAR p: POINTER TO ARRAY [0..29] OF CARDINAL;
 BEGIN 
-  SCANNER.HeapAlloc(keywordTable, 30*2);
+  SCANNER.Allocate(keywordTable, 30*2);
   p := keywordTable;
   p^[ 0] :=  730;
   p^[ 1] :=  731;
@@ -175,25 +178,25 @@ PROCEDURE DeclarePredefinedTypes;
 VAR p : RecordPtr;
 BEGIN 
   curScopeHead := baseScopeHead;
-  IntType  := DeclType("INTEGER" ,2,2);
-  CharType := DeclType("CHAR"    ,1,0); CharType^.high := 255;
-  BooleanType := DeclType("BOOLEAN" ,1,0); BooleanType^.high := 1;
-  CardType  := DeclType("CARDINAL",2,2);
-  RealType  := DeclType("REAL"    ,4,8);
-  LongrealType := DeclType("LONGREAL",8,8);
-  BitsetType := DeclType("BITSET"  ,2,4);
-
-  bitsetRangeDesc := NewTypeDesc(1,1); bitsetRangeDesc^.word2 := CardType; bitsetRangeDesc^.high := 15;
+  IntType  := DeclType("INTEGER", BITSET{1}, 2);
+  CharType := DeclType("CHAR", BITSET{0}, 0); CharType^.high := 255;
+  BooleanType := DeclType("BOOLEAN", BITSET{0}, 0); BooleanType^.high := 1;
+  CardType  := DeclType("CARDINAL", BITSET{1}, 2);
+  RealType  := DeclType("REAL", BITSET{2}, 8);
+  LongrealType := DeclType("LONGREAL", BITSET{3}, 8);
+  BitsetType := DeclType("BITSET", BITSET{1}, 4);
+
+  bitsetRangeDesc := NewTypeDesc(BITSET{0}, 1); bitsetRangeDesc^.word2 := CardType; bitsetRangeDesc^.high := 15;
   BitsetType^.word2 := bitsetRangeDesc;
 
-  ProcType := DeclType("PROC"    ,4,9);
-  LongintType := DeclType("LONGINT" ,4,7);
+  ProcType := DeclType("PROC", BITSET{2}, 9);
+  LongintType := DeclType("LONGINT", BITSET{2}, 7);
 
   baseScopeHead := curScopeHead;
   curScopeHead := savedScopeHead;
-  WordType := DeclType("WORD"    ,2,3);
-  AddressType  := DeclType("ADDRESS" ,2,2);
-  ByteType := DeclType("BYTE"    ,1,1); ByteType^.word2 := WordType;
+  WordType := DeclType("WORD", BITSET{1}, 3);
+  AddressType  := DeclType("ADDRESS", BITSET{1}, 2);
+  ByteType := DeclType("BYTE", BITSET{0}, 1); ByteType^.word2 := WordType;
   ByteType^.high := 255;
 
   p := InsertIdent("PROCESS",3);
@@ -201,14 +204,14 @@ BEGIN
   addressAlias := AddressType;
   savedScopeHead := curScopeHead;
 
-  charArrayDesc := NewTypeDesc(0,11); charArrayDesc^.word5 := CharType;
+  charArrayDesc := NewTypeDesc(BITSET{}, 11); charArrayDesc^.word5 := CharType;
 END DeclarePredefinedTypes;
 
 
 PROCEDURE MakeParamList(paramCount: CARDINAL; resultKind: CARDINAL; firstType: RecordPtr): ADDRESS;
 VAR p : ArrayPtr;
 BEGIN
-  SCANNER.HeapAlloc(p, (paramCount+2)*2);
+  SCANNER.Allocate(p, (paramCount+2)*2);
   p^[0] := paramCount;
   p^[1] := resultKind;
   p^[2] := firstType;
@@ -252,7 +255,7 @@ BEGIN
   DeclStdProc("HALT"    , 2, NIL);
   DeclStdProc("TRUNC"   , 8, MakeParamList(1, 0, RealType));
   curScopeHead^.word2 := CardType;
-  SCANNER.HeapAlloc(stdScopeAnchor, 14);
+  SCANNER.Allocate(stdScopeAnchor, 14);
   stdScopeAnchor^.word0  := NIL;
   stdScopeAnchor^.word1  := curScopeHead;
 END DeclareStandardNames;
@@ -261,8 +264,8 @@ PROCEDURE DeclareSystemModule;
 VAR p: RecordPtr;
 BEGIN
   curScopeHead := savedScopeHead;
-  DeclConst("IORESULT"     , CardType, 0300H, 4); curScopeHead^.word3 := 256;
-  DeclConst("HLRESULT"     , CardType, 0302H, 4); curScopeHead^.word3 := 256;
+  DeclConst("IORESULT"     , CardType, 0300H, 4); curScopeHead^.word3 := BITSET{8}; (* was 256 *)
+  DeclConst("HLRESULT"     , CardType, 0302H, 4); curScopeHead^.word3 := BITSET{8}; (* was 256 *)
   DeclConst("BADOVERLAY"   , NIL    , 1, 2);
   DeclConst("OUTOFMEMORY"  , NIL    , 5, 2);
   DeclConst("REALOVERFLOW" , NIL    ,11, 2);
@@ -293,14 +296,14 @@ BEGIN
   DeclStdProc("INP"     ,21, MakeParamList(1, 0, WordType)); curScopeHead^.word2 := CardType;
   DeclStdProc("OUT"     ,22, p);
 
-  SCANNER.HeapAlloc(systemScopeDesc, 14);
+  SCANNER.Allocate(systemScopeDesc, 14);
   systemScopeDesc^.word0 := stdScopeAnchor;
   systemScopeDesc^.word1 := curScopeHead;
 
   curScopeHead := NIL;
   DeclStdProc("SYSTEM"  , 0, NIL);
   curScopeHead^.word4 := 6;
-  curScopeHead^.word3 := 1089;
+  curScopeHead^.word3 := BITSET{0,6,10}; (* was 1089 *)
   curScopeHead^.high := systemScopeDesc^.word1;
   systemModule := curScopeHead;
 END DeclareSystemModule;
@@ -320,14 +323,14 @@ BEGIN
   DeclStdProc("RELEASE"   , 13, p);
   DeclStdProc("FREEMEM"   , 14, NIL);
   curScopeHead^.word2 := CardType;
-  SCANNER.HeapAlloc(storageScopeDesc, 14);
+  SCANNER.Allocate(storageScopeDesc, 14);
   storageScopeDesc^.word0 := stdScopeAnchor;
   storageScopeDesc^.word1 := curScopeHead;
 
   curScopeHead := NIL;
   DeclStdProc("STORAGE"   ,  0, NIL);
   curScopeHead^.word4 := 6;
-  curScopeHead^.word3 := 1089;
+  curScopeHead^.word3 := BITSET{0,6,10}; (* was 1089 *)
   curScopeHead^.high := storageScopeDesc^.word1;
   storageModule := curScopeHead;
 END DeclareStorageModule;
@@ -338,10 +341,10 @@ CONST DRVROVEC = 29;
 VAR cmdToken : ARRAY [0..2] OF CHAR;
     driveCh : CHAR;
 BEGIN 
-  SCANNER.ProcType := NIL;
+  SCANNER.srcFile := NIL;
   SCANNER.codeFile  := NIL;
   Texts.ReadString(ComLine.commandLine, cmdToken);
-  IF NOT Files.Open(SCANNER.ProcType, ComLine.inName) THEN
+  IF NOT Files.Open(SCANNER.srcFile, ComLine.inName) THEN
     Terminal.WriteString(ComLine.inName);
     Terminal.WriteString(" not found.");
     Terminal.WriteLn;
@@ -350,16 +353,16 @@ BEGIN
     BDOS(DRVROVEC, 0);
     IF ORD(ComLine.inName[0])-ORD('A') IN BITSET(IORESULT) THEN Files.ResetSys() END;
     ComLine.outName := ComLine.inName;
-    SCANNER.ChangeFileExtension(ComLine.outName, "@@@", TRUE);
+    SCANNER.ChangeEx(ComLine.outName, "@@@", TRUE);
     Texts.ReadString(ComLine.commandLine, cmdToken);
     IF (cmdToken[1] = ':') AND (cmdToken[2] = 0C) THEN
       driveCh := CAP(cmdToken[0]);
       IF ORD(driveCh)-ORD('A') <= 15 THEN ComLine.outName[0] := driveCh END;
     END;
     Files.Create(SCANNER.codeFile, ComLine.outName);
-    Files.NoTrailer(SCANNER.ProcType);
-    Files.ReadByte(SCANNER.ProcType, driveCh);
-    Files.SetPos(SCANNER.ProcType, LONG(0));
+    Files.NoTrailer(SCANNER.srcFile);
+    Files.ReadByte(SCANNER.srcFile, driveCh);
+    Files.SetPos(SCANNER.srcFile, LONG(0));
   END;
 EXCEPTION Files.UseError:
   Files.ResetSys();
@@ -384,19 +387,19 @@ BEGIN
   DeclareStandardNames;
   DeclareSystemModule;
   DeclareStorageModule;
-  SCANNER.scanOptions := compilerOptions;
-  rangeCheckEnabled := 2 IN SCANNER.scanOptions;
+  SCANNER.scanOpt := compilerOptions;
+  rangeCheckEnabled := 2 IN SCANNER.scanOpt;
   Texts.ReadString(ComLine.commandLine, cmdToken);
   IF cmdToken[0] = '%' THEN
     optCode := ORD(CAP(cmdToken[1])) - ORD('L');
-    IF optCode <= 15 THEN INCL(SCANNER.scanOptions, optCode) END;
+    IF optCode <= 15 THEN INCL(SCANNER.scanOpt, optCode) END;
   END;
   ERRORS.doSymtabRollback := FALSE;
-  SCANNER.HeapAlloc(SYMTAB.IntType, 170);
-  SCANNER.HeapAlloc(SYMTAB.CardType, 170);
-  SCANNER.HeapAlloc(SYMTAB.AddressType,  34);
-  SCANNER.InitScanner;
-  SCANNER.OpenScope(stdScopeAnchor, 0);
-  IF 5 IN SCANNER.scanOptions THEN Texts.WriteCard(3, FREEMEM(), 5) END;
+  SCANNER.Allocate(SYMTAB.moduleTable, 170);
+  SCANNER.Allocate(SYMTAB.modStage, 170);
+  SCANNER.Allocate(SYMTAB.scopeChain, 34);
+  SCANNER.InitScan;
+  SCANNER.OpenScop(stdScopeAnchor, 0);
+  IF 5 IN SCANNER.scanOpt THEN Texts.WriteCard(3, FREEMEM(), 5) END;
 END InitCompiler;
 END COMPILER.

+ 4 - 7
src/compiler/ERRORS.DEF

@@ -1,15 +1,12 @@
 (* Renamed for readability. Semantics unchanged. Original identifiers: see docs/compiler/ + src/compiler/RENAME-MAP.md. *)
 DEFINITION MODULE ERRORS;
-FROM SYSTEM IMPORT ADDRESS, WORD;
-FROM Compiler IMPORT CompilerImport;
+FROM SYSTEM IMPORT ADDRESS;
 FROM Scanner  IMPORT Ext, Buf;
 FROM Files    IMPORT FILE;
-FROM ComLine  IMPORT inName;
-FROM Texts    IMPORT TEXT;
-FROM Terminal IMPORT WriteChar;
-FROM Loader   IMPORT Call;
-FROM Editor   IMPORT editPosition;
 FROM SymTab   IMPORT T1;
+(* NOTE: ComLine/Texts/Terminal/Loader/Editor/Compiler imports dropped —
+   unused by this interface (the IMPLEMENTATION re-imports them); every
+   imported name counts against the compiler's fixed name table. *)
 
 TYPE BufPtr = POINTER TO Buf;
 VAR

+ 34 - 34
src/compiler/ERRORS.MOD

@@ -62,7 +62,7 @@ BEGIN
   MOVE(ADR(name), ADR(tryName[2]), nameLen); 
   tryName[0] := CHR(currentDrive + ORD('A'));
   tryName[1] := ':';
-  Scanner.ChangeFileExtension(tryName, ext, FALSE);
+  Scanner.ChangeEx(tryName, ext, FALSE);
   WHILE NOT Files.Open(file, tryName) DO
     REPEAT
       currentDrive := (currentDrive + 1) MOD 16;
@@ -102,20 +102,20 @@ VAR
     heap[0316H]: ADDRESS;
 BEGIN
   IF choice = 'E' THEN (* Edit *)
-    size := Files.FileSize(Scanner.sourceFile);
+    size := Files.FileSize(Scanner.srcFile);
     IF size > LONG(38500) THEN size := LONG(38500) END;
     editBufSize := CARD(size) DIV 4 * 5 + 1500;
     IF editBufSize < 5500 THEN editBufSize := 5500 END;
     stackRoom := ADR(backupName) - CARDINAL(Scanner.codeFile);
     IF editBufSize > stackRoom THEN editBufSize := stackRoom END;
-    Files.Close(Scanner.sourceFile);
+    Files.Close(Scanner.srcFile);
     savedModList := mainModule;
     mainModule := savedModList^.link^.link^.link;
-    Scanner.GetStackMark(savedStack);
-    keepSize := savedStack - (Scanner.codeBuffer + 4096);
+    Scanner.GetStack(savedStack);
+    keepSize := savedStack - (Scanner.codeBuf + 4096);
     moveSize := savedStack - (CodeGen.windowLimit - CodeGen.nextEmitPos);
     MOVE(savedStack-keepSize, moveSize-keepSize, keepSize);
-    Scanner.CheckStackMark(moveSize);
+    Scanner.CheckStk(moveSize);
     freeRoom := ADR(backupName) - moveSize;
     IF editBufSize > freeRoom THEN
       spillSize := editBufSize - freeRoom;
@@ -124,13 +124,13 @@ BEGIN
       Files.Create(backupFile, backupName);
       Files.WriteBytes(backupFile, moveSize-spillSize, spillSize);
       Files.SetPos(backupFile, LONG(0));
-      Scanner.CheckStackMark(moveSize - spillSize);
+      Scanner.CheckStk(moveSize - spillSize);
     END; (* 018a *)
-    Editor.editPosition := Scanner.tokenPos;
+    Editor.editPosition := Scanner.tokPos;
     Editor.Edit;
     savedEditPos := Editor.editPosition;
     IF editBufSize > freeRoom THEN
-      Scanner.CheckStackMark(moveSize);
+      Scanner.CheckStk(moveSize);
       IF Files.ReadBytes(backupFile, moveSize-spillSize, spillSize)<>spillSize THEN
         Editor.editOkFlag := FALSE
       END;
@@ -177,7 +177,7 @@ PROCEDURE RollbackToMark;
 VAR sym: SymTab.T1;
     mark: ADDRESS;
 BEGIN
-  Scanner.GetStackMark(mark);
+  Scanner.GetStack(mark);
   sym := SymTab.currentScope^.link1;
   WHILE sym <> NIL DO
     IF (sym^.word4 = 3) AND (sym^.link2^.word4 = 6)
@@ -189,7 +189,7 @@ BEGIN
     sym := sym^.link0;
   END;
   TruncateScopeStack(mark);
-  Scanner.OpenSourceFile;
+  Scanner.OpenSrc;
 END RollbackToMark;
 
 CONST BUT = "but ";
@@ -253,7 +253,7 @@ VAR ch: CHAR;
 VAR idx: CARDINAL;
 VAR idBuf: Scanner.Identifier;
 BEGIN
-  idx := Scanner.keywordHashFunc(idBuf, mode);
+  idx := Scanner.keyHash(idBuf, mode);
   IF idx # 0 THEN WriteString(idBuf)
   ELSE
     Terminal.WriteChar('"');
@@ -267,7 +267,7 @@ BEGIN
         Terminal.WriteChar(listPipeChar);
       ELSE
         ch := '!';
-        WHILE (ch < DEL) AND (Scanner.charClassTable^[ORD(ch)] # mode) DO INC(ch) END;
+        WHILE (ch < DEL) AND (Scanner.charClas^[ORD(ch)] # mode) DO INC(ch) END;
         IF ch < DEL THEN Terminal.WriteChar(ch) END;
       END; (* 0433 *)
     END; (* 0433 *)
@@ -277,12 +277,12 @@ END WriteSymbolToken;
 
 PROCEDURE WriteFoundToken;
 BEGIN
-  IF Scanner.curSymbol = 0C THEN
-    IF Scanner.isLiteral THEN WriteString('literal "') ELSE WriteString('identifier "') END;
-    WriteString(Scanner.tokenBuffer);
+  IF Scanner.curSym = 0C THEN
+    IF Scanner.isLit THEN WriteString('literal "') ELSE WriteString('identifier "') END;
+    WriteString(Scanner.tokBuf);
     Terminal.WriteChar('"');
   ELSE
-    WriteSymbolToken(Scanner.curSymbol)
+    WriteSymbolToken(Scanner.curSym)
   END; (* 046E *)
   WriteString(" found")
 END WriteFoundToken;
@@ -293,35 +293,35 @@ VAR lineStart: CARDINAL;
 VAR savedPos: LONGINT;
 VAR ch: CHAR;
 BEGIN
-  IF NOT( 0 IN Scanner.scanOptions) THEN
+  IF NOT( 0 IN Scanner.scanOpt) THEN
     Terminal.WriteLn;
-    savedPos := Files.NextPos(Scanner.sourceFile);
+    savedPos := Files.NextPos(Scanner.srcFile);
     lineStart := errorMarkPtr;
     REPEAT
       DEC(lineStart);
-      Files.SetPos(Scanner.sourceFile, LONG(lineStart));
-      Files.ReadByte(Scanner.sourceFile, ch);
+      Files.SetPos(Scanner.srcFile, LONG(lineStart));
+      Files.ReadByte(Scanner.srcFile, ch);
     UNTIL (lineStart = 0) OR (ch = LF);
-    INC(lineStart, ORD(Scanner.curChar = LF));
-    Scanner.tokenColumn := Scanner.tokenPos - lineStart - 6;
-    Files.SetPos(Scanner.sourceFile, LONG(lineStart));
+    INC(lineStart, ORD(Scanner.curCh = LF));
+    Scanner.tokCol := Scanner.tokPos - lineStart - 6;
+    Files.SetPos(Scanner.srcFile, LONG(lineStart));
     WHILE lineStart # errorMarkPtr DO
-      Files.ReadByte(Scanner.sourceFile, ch);
+      Files.ReadByte(Scanner.srcFile, ch);
       IF ch # EOF THEN Terminal.WriteChar(ch) END;
       INC(lineStart);
     END;
-    Files.SetPos(Scanner.sourceFile, savedPos);
-    INCL(Scanner.scanOptions, 0);
+    Files.SetPos(Scanner.srcFile, savedPos);
+    INCL(Scanner.scanOpt, 0);
   END; (* 04f6 *)
   IF mode # 'X' THEN
-    WHILE (Scanner.curChar # CR) AND (Scanner.curChar # CHR(255)) DO
-      Scanner.NextChar
+    WHILE (Scanner.curCh # CR) AND (Scanner.curCh # CHR(255)) DO
+      Scanner.NextCh
     END;
   END; (*050D*)
   Terminal.WriteLn;
-  IF Scanner.tokenColumn + 5 < Terminal.numCols THEN
+  IF Scanner.tokCol + 5 < Terminal.numCols THEN
     col := 0;
-    WHILE col < Scanner.tokenColumn + 5 DO Terminal.WriteChar(' '); INC(col) END;
+    WHILE col < Scanner.tokCol + 5 DO Terminal.WriteChar(' '); INC(col) END;
     WriteString("^   ");
   END; (* 0535 *)
   IF mode = 'X' THEN WriteString("Warning") 
@@ -353,16 +353,16 @@ VAR infoDesc: POINTER TO RECORD w0: WORD; w1: BufPtr END;
 VAR msgBuf: POINTER TO ARRAY [0..1] OF CHAR;
 VAR savedOpts: BITSET;
 BEGIN
-  savedOpts := Scanner.scanOptions;
+  savedOpts := Scanner.scanOpt;
   IF CARDINAL(info) <= 1 THEN
     PrintOverlayMessage(info+50, msgBuf^)
   ELSIF CARDINAL(info) = 2 THEN
-    PrintOverlayMessage(52, Scanner.tokenBuffer)
+    PrintOverlayMessage(52, Scanner.tokBuf)
   ELSE
     infoDesc := info;
     PrintOverlayMessage(52, infoDesc^.w1^);
   END; (* 0628 *)
-  Scanner.scanOptions := savedOpts;
+  Scanner.scanOpt := savedOpts;
   Terminal.WriteLn;
   REPEAT
     WriteString(EDITQUIT);

+ 92 - 92
src/compiler/EXPRESS.MOD

@@ -23,7 +23,7 @@
    CentralError(ok, code) [was 1-param]. Full per-proc signature audit PENDING.
    Numbered-module mappings applied (verified against .DEF orders):
    - Compiler.IntType..26 = IntType..compilationActive (DEF order = word order).
-   - Scanner.scanOptions/5/6/7/8/9/10/11/12 = scanOptions/curSymbol/isLiteral/
+   - Scanner.scanOpt/5/6/7/8/9/10/11/12 = scanOptions/curSymbol/isLiteral/
      cardValue/curNode/identKind/followSet/tokenBuffer/literalType.
      Scanner.word13: unknown, kept + FIXME.
    - CodeGen.word5 = emitEnabled. Doubles.qcp/6/7/8/9/11 =
@@ -233,7 +233,7 @@ BEGIN
     RETURN;
   END;
   {/* 0120 */} (* codegen branch, range-check flag bit 8 *)
-  IF 8 IN Scanner.scanOptions THEN
+  IF 8 IN Scanner.scanOpt THEN
     emitConv := FALSE;
     IF IsOrdinal(curDesc.typ) - isOrd = 2 THEN
       CodeGen.EmitStandardOp(2);
@@ -447,7 +447,7 @@ BEGIN
     END;
   END;
   {/* 0401 */} (* dispatch on selector class *)
-  IF Scanner.AcceptSymbol(5) THEN
+  IF Scanner.AcceptSy(5) THEN
     IF (sel = t) OR ((sel = Compiler.BitsetType) AND (t^.kind = 5)) THEN
     ELSIF (sel^.kind = 5) AND (t = Compiler.BitsetType) THEN
     ELSIF (sel = Compiler.WordType) OR (sel = Compiler.AddressType) THEN
@@ -457,7 +457,7 @@ BEGIN
       Errors.ReportError(95);
     END;
   ELSIF t = Compiler.CharType THEN
-    IF NOT Scanner.TestSymbolRange40(sel^.value, 128) THEN
+    IF NOT Scanner.TestR40(sel^.value, 128) THEN
       DEC(sel^.value);
     END;
     IF sel^.value - sel^.word5 + sel^.word5 <> sel^.value THEN
@@ -477,8 +477,8 @@ VAR buf: Desc; more: BOOLEAN;
 BEGIN
   buf := curDesc; constMode := 0; EvalConstExpr; (*{0512-0517}*)
   LOOP
-    IF (Scanner.curSymbol # 3) & ((Scanner.curSymbol-44) > 5) THEN EXIT END; (*{0519-0525}*)
-    IF Scanner.AcceptSymbol(44) THEN (*{0528-052b} '(' actuals/indexqual *)
+    IF (Scanner.curSym # 3) & ((Scanner.curSym-44) > 5) THEN EXIT END; (*{0519-0525}*)
+    IF Scanner.AcceptSy(44) THEN (*{0528-052b} '(' actuals/indexqual *)
       NormalizeOperand; more := FALSE; (*{052e-0530}*)
       LOOP
         IF ~ MatchOpClass(2048, 44) THEN (*{0538}*)
@@ -490,7 +490,7 @@ BEGIN
         buf := curDesc; ParseExpression; (*{054c-0550}*)
         IF curDesc.raw[2] = 0 THEN (*{0554-0556} typeless actual *)
           ConstToInt(Compiler.CardType, 44); PopExprDesc; (*{0559-055e}*)
-          IF 8 IN Scanner.scanOptions THEN (*{0561}*)
+          IF 8 IN Scanner.scanOpt THEN (*{0561}*)
             EmitAddress; CodeGen.QueueConst(0); CodeGen.EmitStandardOp(0); (*{0567-056d}*)
           END;
           curDesc.raw[3] := curDesc.raw[3]-2; (*{0570-0575}*)
@@ -500,17 +500,17 @@ BEGIN
         END;
         IF more THEN CodeGen.EmitTypedOp(6, 0) END; (*{0589-058e}*)
         curDesc := buf; (*{0590-0592}*)
-        IF ~ Scanner.TestSymbolInSet(66) THEN EXIT END; (*{0594-0598}*)
-        IF ~ Scanner.AcceptSymbol(6) THEN (*{059c-059e}*)
-          IF Scanner.AcceptSymbol(44) THEN EXIT END; (*{05a1-05a8}*)
+        IF ~ Scanner.TestSet(66) THEN EXIT END; (*{0594-0598}*)
+        IF ~ Scanner.AcceptSy(6) THEN (*{059c-059e}*)
+          IF Scanner.AcceptSy(44) THEN EXIT END; (*{05a1-05a8}*)
         ELSE Scanner.GetSym; (*{05ab}*)
         END;
         more := TRUE; (*{05ad-05ae}*)
       END;
       curDesc.raw[4] := 5; constMode := 1; (*{05b1-055b} handler exit *)
-    ELSIF Scanner.AcceptSymbol(46) THEN (*{05b8-05bb} '[' subscript *)
+    ELSIF Scanner.AcceptSy(46) THEN (*{05b8-05bb} '[' subscript *)
       PushOperand; (*{05be}*)
-      IF (Compiler.rangeCheckEnabled # 0) & (8 IN Scanner.scanOptions) THEN (*{05c0-05c8}*)
+      IF (Compiler.rangeCheckEnabled # 0) & (8 IN Scanner.scanOpt) THEN (*{05c0-05c8}*)
         CodeGen.EmitStandardOp(6); (*{05ca-05c4}*)
       END;
       IF curDesc.raw[0] = Compiler.AddressType THEN curDesc.raw[0] := Compiler.WordType ELSE (*{05cd-05d9}*)
@@ -524,14 +524,14 @@ BEGIN
       END;
       SymTabSave := SymTab.identClass; (*{05fd-0602} FIXME: no such SymTab export *)
       IF ~ MatchOpClass(1024, 3) THEN (*{0604-0608}*) END;
-      curDesc.raw[0] := curDesc.raw[5]; Scanner.GetSym; Scanner.NeedIdentifier; (*{0609-0612}*)
+      curDesc.raw[0] := curDesc.raw[5]; Scanner.GetSym; Scanner.NeedID; (*{0609-0612}*)
       IF Scanner.word13 (*FIXME*) # SymTabSave THEN (*{0614-0616} FIXME: word13 TBD *)
-        Errors.ReportErrorWithText(2, Scanner.tokenBuffer); (*{0618-061d}*)
+        Errors.ReportErrorWithText(2, Scanner.tokBuf); (*{0618-061d}*)
       END;
       curDesc.raw[3] := Scanner.curNode+curDesc.raw[5]; (*{061f-0626} FIXME: word8=curNode pun *)
-      curDesc.raw[0] := Scanner.literalType; SymTab.identClass := SymTabSave; (*{0627-062d}*)
+      curDesc.raw[0] := Scanner.litType; SymTab.identClass := SymTabSave; (*{0627-062d}*)
       Scanner.GetSym; (*{062f}*)
-      WHILE Scanner.curSymbol = 3 DO (*{0631-0635}*)
+      WHILE Scanner.curSym = 3 DO (*{0631-0635}*)
         IF curDesc.raw[3] > 510 THEN (*{063b-063d}*)
           CodeGen.QueueConst(curDesc.raw[3]); CodeGen.EmitTypedOp(6, 0); (*{063f-0645}*)
         END;
@@ -548,21 +548,21 @@ END ParseDesignatorTail;
 PROCEDURE EvalConstExpr;
 VAR lit: CARDINAL;
 BEGIN
-  Scanner.PushWithScope; Scanner.ExpectIdentKind(4); (*{0472-0475}*)
+  Scanner.PushWith; Scanner.ExpectKd(4); (*{0472-0475}*)
   curDesc.raw[3] := Scanner.curNode; lit := Scanner.curNode; (*{0477-047f} FIXME: word8 pun *)
-  IF (Scanner.followSet & 262) = 0 THEN (*{0480-0488} ident/number path *)
+  IF (Scanner.follSet & 262) = 0 THEN (*{0480-0488} ident/number path *)
     IF lit = 0 THEN curDesc.raw[4] := 1; (*{048a-0491}*)
     ELSIF lit = spillFlag THEN curDesc.raw[4] := 0; (*{0493-049b} nil *)
     ELSE
       curDesc.raw[2] := spillFlag-lit; curDesc.raw[4] := 4; (*{049d-04a4} deref const *)
-      IF (4 IN Scanner.followSet) & (Scanner.literalType <= 9) THEN (*{04a5-04b0}*)
+      IF (4 IN Scanner.follSet) & (Scanner.litType <= 9) THEN (*{04a5-04b0}*)
         CodeGen.SetPendingOp(1, curDesc.raw[4], curDesc.raw[2], curDesc.raw[3]); (*{04b2-04b9}*)
         curDesc.raw[4] := 2; curDesc.raw[3] := 0; (*{04bb-04c0}*)
       END;
     END;
-  ELSIF 8 IN Scanner.followSet THEN (*{04c3-04c7} cardinal const *)
+  ELSIF 8 IN Scanner.follSet THEN (*{04c3-04c7} cardinal const *)
     CodeGen.QueueConst(curDesc.raw[3]); curDesc.raw[4] := 2; curDesc.raw[3] := 0; constMode := 1; (*{04c9-04d4}*)
-  ELSIF 1 IN Scanner.followSet THEN (*{04d7-04db} integer const *)
+  ELSIF 1 IN Scanner.follSet THEN (*{04d7-04db} integer const *)
     curDesc.raw[2] := lit; curDesc.raw[4] := 3; (*{04dd-04e2}*)
   ELSE (*{04e5} string/char const *)
     PushStringConst; (* local proc2 {04e9} *)
@@ -572,7 +572,7 @@ BEGIN
       curDesc.raw[3] := 0; (*{04ff-0501}*)
     END;
   END;
-  CheckAndStore(Scanner.literalType, 1); (*{0502-050a} local proc22 *)
+  CheckAndStore(Scanner.litType, 1); (*{0502-050a} local proc22 *)
   Scanner.GetSym; (*{050c}*)
 END EvalConstExpr;
 
@@ -582,11 +582,11 @@ VAR a, b: CARDINAL;
 BEGIN
   IF Pass1.InsertEntry(p5, a, b) THEN (*{0659-0661} PASS1.proc3 *)
     ParseFactor(p5, p4, a, b, p1); (*{0664-066a} call_with_frame self; FIXME: group wrote FRAME^.tag *)
-    Scanner.ExpectSymbol(1); (*{066c-066d}*)
+    Scanner.ExpectSy(1); (*{066c-066d}*)
   END;
   IF p2 # 0 THEN ParseDesignatorTail; NormalizeOperand; END; (*{066f-0675}*)
-  Scanner.PushWithScope; (*{0677}*)
-  IF (Scanner.identKind = 5) & (p3 = 9) THEN (*{0679-0683} stdfunc misuse *)
+  Scanner.PushWith; (*{0677}*)
+  IF (Scanner.identKd = 5) & (p3 = 9) THEN (*{0679-0683} stdfunc misuse *)
     CentralError(TRUE (*FIXME: cond TBD*), 67); ParseActualList; Scanner.GetSym; RETURN; (*{068a-0697}*)
   END;
   BoolCondHelper; (*{0699} local proc12 *)
@@ -600,7 +600,7 @@ BEGIN
   IF Pass1.CondInsert(flag, a, b, c) THEN (*{06a4-06ab} PASS1.proc2 *)
     ParseFactor(flag, a, b, c, t); (*{06ad-06b3} nested proc38 *)
   END;
-  Scanner.ExpectSymbol(5); (*{06b6-06b8} '*' expected *)
+  Scanner.ExpectSy(5); (*{06b6-06b8} '*' expected *)
 END ParseTerm;
 
 (*{0704} PROCEDURE ParseSetCons(s, flag) — 2 params; set constructor *)
@@ -611,20 +611,20 @@ BEGIN
   lo := curDesc; hi := curDesc; (*{0706-070b} reserve *)
   GetRangeBase(); (*{070c-0711} local proc25; FIXME: group passed FRAME^.tag-4 *)
   lo.raw[1] := 0; lo.raw[0] := Compiler.CardType; (*{0712-0717}*)
-  mod := Scanner.EnterModuleSymbol("TEXTS", 4); (*{071d-0728}*)
+  mod := Scanner.EnterMod("TEXTS", 4); (*{071d-0728}*)
   res := ParseFuncCall(mod); (*{072c-072f} nested proc41 *)
-  IF s = 0 THEN Scanner.TestSymbolRange40(8) END; (*{0730-0735}*)
-  IF Scanner.AcceptSymbol(43) & (s # 0) & Scanner.AcceptSymbol(5) THEN (*{0737-0743}*)
+  IF s = 0 THEN Scanner.TestR40(8) END; (*{0730-0735}*)
+  IF Scanner.AcceptSy(43) & (s # 0) & Scanner.AcceptSy(5) THEN (*{0737-0743}*)
   ELSE RETURN END; (*{0744} empty set *)
-  Scanner.PushWithScope; first := TRUE; (*{0747-074a}*)
-  IF (Scanner.identKind = 4) & (Scanner.literalType = res) THEN (*{074b-0755}*)
+  Scanner.PushWith; first := TRUE; (*{0747-074a}*)
+  IF (Scanner.identKd = 4) & (Scanner.litType = res) THEN (*{074b-0755}*)
     EvalConstExpr; lo := curDesc; (*{0757-075a}*)
     IF 20 IN lo.raw[4] THEN (*{075d-0761}*)
       PushOperand; PushExprDesc(Compiler.CardType); PopOperand; (*{0764-076b}*)
     END;
     IF s # 0 THEN (*{076c-076e}*)
-      IF Scanner.TestSymbolInSet(34) THEN ELSE Scanner.TestSymbolInSet(2) END; (*{076f-0776}*)
-      Scanner.AcceptSymbol(1); (*{0778-077b}*)
+      IF Scanner.TestSet(34) THEN ELSE Scanner.TestSet(2) END; (*{076f-0776}*)
+      Scanner.AcceptSy(1); (*{0778-077b}*)
     END;
     first := FALSE;
   END;
@@ -641,7 +641,7 @@ BEGIN
       | 97: m := 5; ParseTypeCast(11); (*{07b2-07b5}*)
       | 98: IF curDesc.raw[0] = Compiler.LongrealType THEN (*{07b8-07bc} LONGREAL *)
           ParseTypeCast(22); ParseTypeCast(65523);
-          mod := Scanner.EnterModuleSymbol("DOUBLES", 6); (*{07c8-07d5}*)
+          mod := Scanner.EnterMod("DOUBLES", 6); (*{07c8-07d5}*)
           aux := mod; m := 14; k1 := 1; (*{07d6-07dc}*)
         ELSE ParseTypeCast(13); ParseTypeCast(65531); m := 6; (*{07df-07e6}*)
         END;
@@ -657,7 +657,7 @@ BEGIN
     END;
     CodeGen.SetPendingOp(9, 3, k1, k2+flag+1); (*{0845-084d}*)
     CodeGen.EmitExtCall3(19, op, 0); (*{084f-0854}*)
-    IF Scanner.TestSymbolInSet(34) THEN Scanner.AcceptSymbol(1) ELSE EXIT END; (*{0856-085d}*)
+    IF Scanner.TestSet(34) THEN Scanner.AcceptSy(1) ELSE EXIT END; (*{0856-085d}*)
   END;
   Scanner.GetSym; (*{0860} happy exit *)
   IF s # 0 THEN (*{0862-0863} close: emit count *)
@@ -685,7 +685,7 @@ VAR d: CARDINAL;
 BEGIN
   IF FRAME^.tag # 0 THEN (*{06dc-06de} FIXME: raw frame; parenthesized operand present *)
     d := FRAME^.tag-4; INC(d); (*{06e0-06e6}*)
-    IF Scanner.AcceptSymbol(2) THEN (*{06e7-06ea}*)
+    IF Scanner.AcceptSy(2) THEN (*{06e7-06ea}*)
       BoolCondHelper; (*{06ec} local proc12 *)
       IF kind >= 0 THEN ConstToCard(Compiler.CardType, 2); (*{06ee-06f5}*)
       ELSE ConstToInt(Compiler.IntType, 2); (*{06f8-06fb}*)
@@ -722,7 +722,7 @@ PROCEDURE ExpandStdProc44(first: CARDINAL);
 VAR save: CARDINAL;
 BEGIN
   save := curDesc.raw[3]; (*{08e6-08e8}*)
-  IF Scanner.AcceptSymbol(1) THEN (*{08e9-08ec}*)
+  IF Scanner.AcceptSy(1) THEN (*{08e9-08ec}*)
     PushOperand; (*{08ee}*)
     IF ~ MatchOpClass(1024, 1) THEN (*{08f1-08f5}*) END;
     IF first # 0 THEN CentralError(TRUE (*FIXME: cond TBD*), 63) END; (*{08f6-08fd} GetConstVal guard *)
@@ -730,7 +730,7 @@ BEGIN
     LOOP (*{0903-0912} ','-separated consts *)
       IF first # 0 THEN CentralError(TRUE (*FIXME: cond TBD*), 63) END; (*{090a-0911}*)
       GetConstVal;
-      IF ~ Scanner.AcceptSymbol(1) THEN EXIT END; (*{0917-091e}*)
+      IF ~ Scanner.AcceptSy(1) THEN EXIT END; (*{0917-091e}*)
     END;
   END;
   CodeGen.QueueConst(save); (*{0920-0922} restore base *)
@@ -743,7 +743,7 @@ BEGIN
   pat := "DEALLOCATE"; (*{092b-093a} copy string *)
   anchor := SymTab.word9; (*{0941-0943} FIXME: SymTab has no word9 export *)
   LOOP (*{0944} FindIdent retry loop, error 54/56 *)
-    id := anchor; found := Scanner.FindIdent(id, pat, 9 IN Scanner.scanOptions); (*{0944-094e}*)
+    id := anchor; found := Scanner.FindIden(id, pat, 9 IN Scanner.scanOpt); (*{0944-094e}*)
     id := STACK[0]; (*{0950-0952} FIXME: raw stack *)
     IF id = 0 THEN CentralError(TRUE (*FIXME: cond TBD*), 54-std) END; (*{0953-0959} unknown *)
     IF found # 0 THEN
@@ -780,21 +780,21 @@ VAR t2: CARDINAL; t3: CARDINAL; t4: CARDINAL; buf: Desc;
     save5: CARDINAL; ok, flag: BOOLEAN; m, k: CARDINAL;
 BEGIN
   buf := curDesc; (*{09e4-09e6} reserve *)
-  t2 := Scanner.curNode; t4 := Scanner.literalType; t3 := STACK[5]; (*{09e7-09ed} FIXME: raw stack *)
+  t2 := Scanner.curNode; t4 := Scanner.litType; t3 := STACK[5]; (*{09e7-09ed} FIXME: raw stack *)
   Scanner.GetSym; (*{09ee}*)
   IF 7 IN t2 THEN (*{09f1-09f4} set/type-constructor context *)
     IF t4 = 0 THEN (*{09fb-09fc} untyped head *)
       IF t3 <= 3 THEN (*{09fd-09fe} small selector *)
         IF (t3 >= 2) & ODD(t3) THEN ParseSetCons(t3 & 1); (*{0a00-0a06} nested proc40 *)
         ELSE (*{0a0a} parenthesized type context *)
-          Scanner.ExpectSymbol(43);
+          Scanner.ExpectSy(43);
           CASE t3 OF (*{0a0e,0a7d} switch 94..100 *)
             94, 95: ExpandStdProc45;
           | 96, 97:
               ParseDesignatorTail;
               IF ~ MatchOpClass(7, t2) THEN (*{0a18-0a1c}*) END;
               ExpandStdProc46;
-              IF Scanner.AcceptSymbol(1) THEN (*{0a1d-0a20}*)
+              IF Scanner.AcceptSy(1) THEN (*{0a1d-0a20}*)
                 ParseExpression; ConstToCard(Compiler.CardType, t2);
               ELSE CodeGen.QueueConst(1); (*{0a29-0a2a}*)
               END;
@@ -804,16 +804,16 @@ BEGIN
           | 98, 99:
               ParseDesignatorTail;
               IF ~ MatchOpClass(16, t2) THEN (*{0a59-0a5d}*) END;
-              ExpandStdProc46; Scanner.ExpectSymbol(1); (*{0a5d-0a60}*)
+              ExpandStdProc46; Scanner.ExpectSy(1); (*{0a5d-0a60}*)
               ParseExpression; ConstToCard(buf.raw[0], curDesc.raw[2]); ConstToCard(buf.raw[0], curDesc.raw[2]); (*{0a62-0a6a}*)
               CodeGen.EmitStandardOp(5); (*{0a6b-0a6d}*)
               EmitTypedOp(4, t3-2); PopOperand; (*{0a6f-0a77} proc6/3 *)
           | 100: Errors.ReportError(34); (*{0a78-0a7a} illegal *)
           END;
-          Scanner.ExpectSymbol(5); (*{0a92-0a93}*)
+          Scanner.ExpectSy(5); (*{0a92-0a93}*)
         END;
       ELSE (*{0a98} t3 > 3: conversion/builtin head *)
-        Scanner.ExpectSymbol(43);
+        Scanner.ExpectSy(43);
         CASE t3 OF (*{0a9c,0b79} switch 90..105 *)
           90..95:
               ParseExpression; EmitOp; (*{0aa1} proc12/6 *)
@@ -845,22 +845,22 @@ BEGIN
             END;
             NormalizeOperand; (*{0b0c-0b0e}*)
         | 101, 102:
-            Scanner.PushWithScope; (*{0b0f}*)
-            IF (Scanner.identKind = 3) & (t3 = 12) THEN (*{0b11-0b1a}*)
-              Scanner.ExpectIdentKind(3); Scanner.GetSym; (*{0b1c-0b1f}*)
-              ExpandStdProc44(Scanner.literalType); (*{0b20} nested proc44 *)
+            Scanner.PushWith; (*{0b0f}*)
+            IF (Scanner.identKd = 3) & (t3 = 12) THEN (*{0b11-0b1a}*)
+              Scanner.ExpectKd(3); Scanner.GetSym; (*{0b1c-0b1f}*)
+              ExpandStdProc44(Scanner.litType); (*{0b20} nested proc44 *)
             ELSE (*{0b27} address-builtin path *)
               save5 := CodeGen.emitEnabled; CodeGen.emitEnabled := 0; (*{0b27-0b2b}*)
               ParseDesignatorTail; CodeGen.emitEnabled := 1; (*{0b2d-0b2f}*)
               LoadIndirect; (*{0b31} local proc11 *)
             END;
         | 103..105:
-            Scanner.PushWithScope; Scanner.ExpectIdentKind(3); (*{0b34-0b37}*)
-            t4 := Scanner.literalType; (*{0b39-0b3b}*)
+            Scanner.PushWith; Scanner.ExpectKd(3); (*{0b34-0b37}*)
+            t4 := Scanner.litType; (*{0b39-0b3b}*)
             curDesc.raw[0] := t2; (*{0b3c-0b3e}*)
             IF t3 = 13 THEN (*{0b3f-0b43} VAL-class *)
               IF ~ MatchOpClass(7, t2) THEN (*{0b44-0b47}*) END;
-              Scanner.GetSym; Scanner.ExpectSymbol(1); (*{0b47-0b4b}*)
+              Scanner.GetSym; Scanner.ExpectSy(1); (*{0b47-0b4b}*)
               ParseExpression; ConstToCard(Compiler.CardType, t2); PopExprDesc; (*{0b4c-0b55}*)
             ELSIF MatchOpClass(391, t2) & (t4 <= 1) THEN (*{0b57-0b5e}*)
               IF t3 = 15 THEN CodeGen.QueueConst(t4) (*{0b60-0b67} MIN of long? *)
@@ -869,11 +869,11 @@ BEGIN
             ELSIF t3 = 15 THEN ExpandStdProc43; Scanner.GetSym; (*{0b71-0b76}*)
             END;
         END;
-        Scanner.ExpectSymbol(5); (*{0ba0-0ba1} close *)
+        Scanner.ExpectSy(5); (*{0ba0-0ba1} close *)
       END;
     ELSE (*{0ba5} typed head: index/select *)
-      IF (t2[2] # 0) OR (t2[6] # 0) THEN Scanner.TestSymbolRange40(8) END; (*{0ba5-0bb2}*)
-      IF Scanner.AcceptSymbol(43) THEN ParseTerm(t2[6], t2); END; (*{0bb4-0bbb}*)
+      IF (t2[2] # 0) OR (t2[6] # 0) THEN Scanner.TestR40(8) END; (*{0ba5-0bb2}*)
+      IF Scanner.AcceptSy(43) THEN ParseTerm(t2[6], t2); END; (*{0bb4-0bbb}*)
       IF t3 = 8 THEN CodeGen.EmitTypedOp(13, 3); (*{0bbd-0bc6} bit select *)
       ELSE CodeGen.EmitMiscOp(5, t3); (*{0bc8-0bca} field/method *)
       END;
@@ -891,7 +891,7 @@ END ParseSetOrCastTail;
 PROCEDURE LoadOperand;
 VAR savedNode: ADDRESS;
 BEGIN
-  IF 6 IN Scanner.followSet THEN (*{0bd4}*)
+  IF 6 IN Scanner.follSet THEN (*{0bd4}*)
     ParseSetOrCastTail; (* proc39 *) (*{0bda}*)
     RETURN;
   END;
@@ -899,9 +899,9 @@ BEGIN
   savedNode := Scanner.curNode; (*{0be3} FIXME: ADDRESS := RecordPtr pun *)
   Scanner.GetSym; (*{0be6}*)
   IF (curDesc.raw[2] # 0) OR (curDesc.raw[6] # 0) THEN (*{0be8-0bf0}*)
-    Scanner.TestSymbolRange40(8); (*{0bf2} FIXME: CARDINAL set pun *)
+    Scanner.TestR40(8); (*{0bf2} FIXME: CARDINAL set pun *)
   END;
-  IF Scanner.AcceptSymbol(43) THEN (*{0bf5} '(' *)
+  IF Scanner.AcceptSy(43) THEN (*{0bf5} '(' *)
     ParseTerm(savedNode, curDesc.raw[6], savedNode); (* proc37; FIXME: 3 args vs (flag,t) *)
   END;
   EmitOperand31(savedNode); (* proc31 FIXME *)
@@ -912,7 +912,7 @@ END LoadOperand;
 PROCEDURE StoreOperand;
 VAR mark: ADDRESS; savedSp: CARDINAL; savedDesc: Desc; size: CARDINAL;
 BEGIN
-  Scanner.GetStackMark(mark); (*{0c0e}*)
+  Scanner.GetStack(mark); (*{0c0e}*)
   savedSp := spillTop; (*{0c11} *)
   savedDesc := curDesc; (*{0c13-0c15}*)
   IF 36 IN curDesc.raw[4] THEN (*{0c16-0c1b} FIXME set TBD *)
@@ -953,13 +953,13 @@ VAR buf: Desc;
     lo, hi: CARDINAL;
 BEGIN
   acc := {}; acc2 := {};
-  IF ~ Scanner.AcceptSymbol(7) THEN (*{0c7d-0c81}*)
+  IF ~ Scanner.AcceptSy(7) THEN (*{0c7d-0c81}*)
     RETURN;
   END;
   BoolCondHelper; (* proc12 *) (*{0c83}*)
   ConstToCard(t1, 0); (* proc7 *) (*{0c84-0c86}*)
   PopExprDesc(t1); (* proc5 FIXME: ADDRESS arg *) (*{0c88-0c8a}*)
-  IF ~ Scanner.AcceptSymbol(4) THEN (*{0c8b-0c8e} single element *)
+  IF ~ Scanner.AcceptSy(4) THEN (*{0c8b-0c8e} single element *)
     anyConst := curDesc.raw[1] # 0; (*{0cc9-0ccc}*)
     IF anyConst THEN CodeGen.EmitStandardOp(5); (*{0cd0}*)
     ELSE
@@ -991,8 +991,8 @@ BEGIN
       acc2 := {1}; (*{0ce9-0cea}*)
     END;
   END;
-  Scanner.TestSymbolInSet(130); (*{0ceb-0ced} FIXME: CARDINAL set pun *)
-  IF ~ Scanner.AcceptSymbol(1) THEN (*{0cef-0cf3} *)
+  Scanner.TestSet(130); (*{0ceb-0ced} FIXME: CARDINAL set pun *)
+  IF ~ Scanner.AcceptSy(1) THEN (*{0cef-0cf3} *)
     Scanner.GetSym; (*{0cf5}*)
   END;
   IF acc2 # {} THEN (*{0cf7-0cf8}*)
@@ -1012,7 +1012,7 @@ END CheckRelationTypes;
 PROCEDURE EmitCompare;
 VAR t: ADDRESS;
 BEGIN
-  IF Scanner.curSymbol = 66 THEN (* NOT *) (*{0d1c-0d21}*)
+  IF Scanner.curSym = 66 THEN (* NOT *) (*{0d1c-0d21}*)
     Scanner.GetSym; (*{0d23}*)
     EmitCompare; (* with_frame proc50 *) (*{0d25}*)
     ConstToCard(Compiler.BooleanType, 66); (* proc7 *) (*{0d28-0d2c}*)
@@ -1025,38 +1025,38 @@ BEGIN
     END;
     RETURN;
   END;
-  IF Scanner.curSymbol IN BITSET{43..47} THEN (*{0d43-0d49} FIXME set TBD *)
-    IF Scanner.AcceptSymbol(43) THEN (* '(' expr ')' *) (*{0d4b-0d4f}*)
+  IF Scanner.curSym IN BITSET{43..47} THEN (*{0d43-0d49} FIXME set TBD *)
+    IF Scanner.AcceptSy(43) THEN (* '(' expr ')' *) (*{0d4b-0d4f}*)
       BoolCondHelper; (* proc12 *) (*{0d51}*)
-      Scanner.ExpectSymbol(5); (*{0d52-0d53} ')' *)
+      Scanner.ExpectSy(5); (*{0d52-0d53} ')' *)
     ELSE
       Scanner.GetSym; (*{0d57}*)
       CheckRelationTypes(Compiler.BitsetType); (* proc51 *) (*{0d59-0d5b}*)
     END;
     RETURN;
   END;
-  Scanner.PushWithScope; (*{0d5f}*)
-  t := Scanner.literalType; (*{0d61-0d63} FIXME: ADDRESS := RecordPtr pun *)
+  Scanner.PushWith; (*{0d5f}*)
+  t := Scanner.litType; (*{0d61-0d63} FIXME: ADDRESS := RecordPtr pun *)
   curDesc.raw[0] := t; (*{0d64-0d66} FIXME *)
-  IF ~ Scanner.isLiteral THEN (*{0d67-0d69}*)
+  IF ~ Scanner.isLit THEN (*{0d67-0d69}*)
     curDesc.raw[1] := 0; (*{0d6b-0d6d}*)
     IF t = Compiler.charArrayDesc THEN (*{0d6e-0d72} FIXME: group hedged CHAR/str *)
-      Scanner.CopyStringToHeap(curDesc, Scanner.tokenBuffer); (*{0d74-0d7b} FIXME: (dest,src) vs DEF order *)
+      Scanner.CopyStr(curDesc, Scanner.tokBuf); (*{0d74-0d7b} FIXME: (dest,src) vs DEF order *)
       curDesc.raw[3] := 0; (*{0d7e-0d80}*)
     ELSIF Words(t)^[4] IN BITSET{384} THEN (*{0d83-0d89} FIXME set TBD *)
       IF Words(t)^[3] = 8 THEN (*{0d8b-0d8f} LONGREAL *)
         FoldRelation(); (* proc47; result dropped FIXME *)
       ELSE
-        curDesc.raw[2] := Scanner.cardValue; (*{0d99-0d9d}*)
+        curDesc.raw[2] := Scanner.cardVal; (*{0d99-0d9d}*)
       END;
     ELSE
-      curDesc.raw[2] := Scanner.cardValue; (*{0da1-0da4}*)
+      curDesc.raw[2] := Scanner.cardVal; (*{0da1-0da4}*)
     END;
     EmitDescriptor2(curDesc); (* proc2 *) (*{0da5}*)
     Scanner.GetSym; (*{0da7}*)
     RETURN;
   END;
-  CASE Scanner.identKind OF (*{0dab-0daf} *)
+  CASE Scanner.identKd OF (*{0dab-0daf} *)
   | 1: (* const *) (*{0daf}*)
       curDesc.raw[1] := 0; (*{0db0-0db2}*)
       curDesc.raw[2] := curDesc.raw[2]; (*{0db3-0db7} FIXME: const value copy TBD *)
@@ -1064,8 +1064,8 @@ BEGIN
       Scanner.GetSym; (*{0dbb}*)
   | 3: (* parenthesised / builtin *) (*{0dbe}*)
       Scanner.GetSym; (*{0dbe}*)
-      Scanner.TestSymbolRange40(40); (*{0dc0-0dc2} FIXME arity *)
-      IF Scanner.AcceptSymbol(45) THEN (*{0dc4-0dc8}*)
+      Scanner.TestR40(40); (*{0dc0-0dc2} FIXME arity *)
+      IF Scanner.AcceptSy(45) THEN (*{0dc4-0dc8}*)
         MatchOpClass(16, 45); (* proc9 *) (*{0dca-0dce}*)
         CheckRelationTypes(t); (* nested proc51 *) (*{0dcf-0dd0}*)
       ELSE
@@ -1078,11 +1078,11 @@ BEGIN
         END;
         curDesc.raw[0] := t; (*{0df1-0df4} FIXME *)
         curDesc.raw[1] := 2; (*{0df5-0df7}*)
-        Scanner.ExpectSymbol(5); (*{0df8} ')' *)
+        Scanner.ExpectSy(5); (*{0df8} ')' *)
       END;
   | 4: (* designator *) (*{0dfb}*)
       ParseDesignatorTail; (* proc15 *) (*{0dfb}*)
-      IF Scanner.curSymbol = 43 THEN (* '(' call *) (*{0dfc-0e01}*)
+      IF Scanner.curSym = 43 THEN (* '(' call *) (*{0dfc-0e01}*)
         Scanner.GetSym; (*{0e03}*)
         MatchOpClass(512, 43); (* proc9 *) (*{0e05-0e0a}*)
         IF Words(t)^[2] # 0 THEN Errors.ReportError(60) END; (*{0e0b-0e10} FIXME *)
@@ -1094,7 +1094,7 @@ BEGIN
       IF t # NIL THEN Errors.ReportError(60) END; (*{0e18-0e1c} FIXME *)
       LoadOperand; (* proc18 *) (*{0e1d}*)
   | 0: (* illegal *) (*{0e20}*)
-      Errors.ReportErrorWithText(128, Scanner.tokenBuffer); (*{0e20-0e25} *)
+      Errors.ReportErrorWithText(128, Scanner.tokBuf); (*{0e20-0e25} *)
   | 2:
       Errors.ReportError(22); (*{0e3b-0e3d} *)
   END;
@@ -1110,11 +1110,11 @@ VAR buf: Desc;
     isZero: BOOLEAN;
 BEGIN
   EmitCompare; (* nested proc50 *) (*{0e4a}*)
-  IF ~(Scanner.curSymbol IN BITSET{51..57}) THEN (*{0e4c-0e54} FIXME set *)
+  IF ~(Scanner.curSym IN BITSET{51..57}) THEN (*{0e4c-0e54} FIXME set *)
     RETURN;
   END;
   EmitOp(); (* proc6 *) (*{0e57}*)
-  op := Scanner.curSymbol; (*{0e58-0e5b}*)
+  op := Scanner.curSym; (*{0e58-0e5b}*)
   IF op = 64 THEN (* AND *) (*{0e5b-0e5f}*)
     ConstToCard(Compiler.BooleanType, 64); (* proc7 *) (*{0e61-0e63}*)
     Scanner.GetSym; (*{0e65}*)
@@ -1189,7 +1189,7 @@ BEGIN
     EmitDescriptor2(curDesc); (* proc2 *) (*{0ffa-0ffb}*)
   ELSE
     curDesc.raw[1] := 2; (*{0ffe-1000}*)
-    IF (3 IN Scanner.scanOptions) AND (op = 60) AND (rkind = 0) THEN (*{1001-100e}*)
+    IF (3 IN Scanner.scanOpt) AND (op = 60) AND (rkind = 0) THEN (*{1001-100e}*)
       CodeGen.EmitExtendedOp(op - 52, rkind); (* checked *) (*{1011-1015}*)
     ELSE
       CodeGen.EmitTypedOp(op - 52, rkind); (* plain *) (*{1019-101d}*)
@@ -1203,8 +1203,8 @@ VAR buf: Desc;
     t: ADDRESS;
     savePend, saveMode: CARDINAL;
 BEGIN
-  IF Scanner.curSymbol IN BITSET{58..60} THEN (* unary +/- *) (*{102a-1030} FIXME *)
-    IF Scanner.AcceptSymbol(59) THEN (* '-' *) (*{1032-1036}*)
+  IF Scanner.curSym IN BITSET{58..60} THEN (* unary +/- *) (*{102a-1030} FIXME *)
+    IF Scanner.AcceptSy(59) THEN (* '-' *) (*{1032-1036}*)
       EmitRangeCheck; (* nested proc49 *) (*{1038}*)
       EmitOp(); (* proc6 *) (*{103a}*)
       MatchOpClass(388, 59); (* proc9 *) (*{103b-1040}*)
@@ -1231,8 +1231,8 @@ BEGIN
   ELSE
     EmitRangeCheck; (*{10a6}*)
   END;
-  WHILE Scanner.curSymbol IN BITSET{51..57} DO (* +,-,OR *) (*{10a8-10b0} FIXME *)
-    op := Scanner.curSymbol; (*{10b3-10b5}*)
+  WHILE Scanner.curSym IN BITSET{51..57} DO (* +,-,OR *) (*{10a8-10b0} FIXME *)
+    op := Scanner.curSym; (*{10b3-10b5}*)
     EmitOp(); (* proc6 *) (*{10b6}*)
     IF op = 65 THEN (* OR *) (*{10b7-10bb} FIXME: 65 outside 51..57 loop? TBD *)
       ConstToCard(Compiler.BooleanType, 65); (* proc7 *) (*{10bd-10c1}*)
@@ -1298,7 +1298,7 @@ BEGIN
         EmitDescriptor2(curDesc); (* proc2 *) (*{11f6}*)
       ELSE
         curDesc.raw[1] := 2; (*{11fa-11fc}*)
-        IF (3 IN Scanner.scanOptions) AND (Words(t)^[4] <= 1) THEN
+        IF (3 IN Scanner.scanOpt) AND (Words(t)^[4] <= 1) THEN
           CodeGen.EmitExtendedOp(op - 52, Words(t)^[4]); (* checked *) (*{1208-120c} FIXME *)
         ELSE
           CodeGen.EmitTypedOp(op - 52, Words(t)^[4]); (* plain *) (*{1210-1214} FIXME *)
@@ -1316,15 +1316,15 @@ VAR buf: Desc;
     cres: CARDINAL;
 BEGIN
   ParseSimpleExpression; (* nested proc48 *) (*{1226}*)
-  op := Scanner.curSymbol; (*{1228-122b}*)
+  op := Scanner.curSym; (*{1228-122b}*)
   IF (op < 51) OR (op > 57) THEN (*{122b-1238} not a relop *)
     IF op # 0 THEN Errors.ReportError(75) END; (*{13e4} shared exit *)
     RETURN;
   END;
   EmitOp(); (* proc6 *) (*{1239}*)
   buf := curDesc; (*{123a-123d}*)
-  Scanner.AcceptSymbol(51); (* '=' consume *) (*{123d-1241}*)
-  IF Scanner.curSymbol = 0 THEN (*{1241} FIXME: literal-rhs fast path? *)
+  Scanner.AcceptSy(51); (* '=' consume *) (*{123d-1241}*)
+  IF Scanner.curSym = 0 THEN (*{1241} FIXME: literal-rhs fast path? *)
     ParseSimpleExpression; (*{1243}*)
     MatchOpClass(16, 51); (* proc9 '=' *) (*{1245-124a}*)
     FoldConstOp(buf); (* proc35 both sides *) (*{124c-1257} FIXME kind TBD *)
@@ -1423,7 +1423,7 @@ BEGIN
     Errors.ReportError(80); (*{1409-1416} *)
   END;
   Words(dest)^[0] := curDesc.raw[2]; (*{1417-141e} FIXME pun *)
-  IF Scanner.AcceptSymbol(4) THEN (* ',' second bound *) (*{141f-1422}*)
+  IF Scanner.AcceptSy(4) THEN (* ',' second bound *) (*{141f-1422}*)
     GetConstVal; (*{1424}*)
     EmitOp(); (*{1426}*)
     ConstToCard(src, 0); (*{1427-0429} *)
@@ -1454,7 +1454,7 @@ BEGIN
   END;
   curDesc.raw[4] := 2; curDesc.raw[3] := 0; (*{1488-1490}*)
   saved := curDesc; (*{148e-1491}*)
-  IF (Scanner.identKind = 5) AND (Words(curDesc.raw[0])^[4] = 9) THEN (* func result? *) (*{1492-149d} FIXME *)
+  IF (Scanner.identKd = 5) AND (Words(curDesc.raw[0])^[4] = 9) THEN (* func result? *) (*{1492-149d} FIXME *)
     ParseDesignatorBase(saved.raw[0], saved.raw[2], saved.raw[5], saved.raw[6]); (* proc21; FIXME: 4-formal roles TBD *)
     CheckForwardRef(); (* proc29 FIXME NYC *)
     PopExprDesc(saved); (* proc3 FIXME: Desc value vs DescPtr *)

+ 144 - 144
src/compiler/PASS1.MOD

@@ -179,7 +179,7 @@ BEGIN
       cursor := Words(cursor)^[0]; (*{00bd-00bf} next link *)
       IF cursor = NIL THEN EXIT END; (*{00c0-00c2}*)
     END;
-    Scanner.CheckStackMark(ADDRESS(limit)); (*{00c4-00c5} FIXME: limit punned as mark *)
+    Scanner.CheckStk(ADDRESS(limit)); (*{00c4-00c5} FIXME: limit punned as mark *)
     allocSize := ((count + 15) DIV 16) * 2; (*{00c7-00cc} *)
     Scanner.Allocate(heapStr, allocSize + count * 2 + 2); (*{00cf-00d8} *)
     Words(heapStr)^[0] := count; (*{00da-00dc}*)
@@ -273,9 +273,9 @@ END TypeSizeRec;
 PROCEDURE GetIdent(): ADDRESS; (*{0201} FIXME: name says ident, returns a TYPE *)
 VAR typ: ADDRESS;
 BEGIN
-  Scanner.PushWithScope; (*{0203} *)
-  Scanner.ExpectIdentKind(3); (*{0205-0206} *)
-  typ := Scanner.literalType; (*{0208-020a} pre-GetSym *)
+  Scanner.PushWith; (*{0203} *)
+  Scanner.ExpectKd(3); (*{0205-0206} *)
+  typ := Scanner.litType; (*{0208-020a} pre-GetSym *)
   Scanner.GetSym; (*{020b}*)
   RETURN typ; (*{020d-020e}*)
 END GetIdent;
@@ -286,12 +286,12 @@ VAR
   item: ADDRESS;
   node: ADDRESS;
 BEGIN
-  Scanner.ExpectSymbol(42); (*{0213-0216} FROM *)
-  node := Scanner.NewSizedNode(5); (*{0217-021a}*)
+  Scanner.ExpectSy(42); (*{0213-0216} FROM *)
+  node := Scanner.NewSized(5); (*{0217-021a}*)
   Words(node)^[3] := 2; (*{021b-021e}*)
-  IF (first # 0) AND (Scanner.identKind = 0)
-     AND (Scanner.scopeCursor = NIL) THEN (*{021e-0229} *)
-    item := Scanner.DeclareIdentifier(0); (*{022b-022f} plain item *)
+  IF (first # 0) AND (Scanner.identKd = 0)
+     AND (Scanner.scopeCur = NIL) THEN (*{021e-0229} *)
+    item := Scanner.DeclIden(0); (*{022b-022f} plain item *)
     Words(item)^[2] := node; (*{0230-0232} *)
   ELSE
     Words(node)^[2] := ParseType(); (*{0235-0239} FIXME: 0-arg vs 3-param def *)
@@ -308,14 +308,14 @@ VAR
   idxDesc: ADDRESS;
   elemDesc: ADDRESS;
 BEGIN
-  arrDesc := Scanner.NewSizedNode(11); (*{0240-0243}*)
+  arrDesc := Scanner.NewSized(11); (*{0240-0243}*)
   idxDesc := ParseType(); (*{0244-0248} FIXME arity *)
   Words(Express.curDesc.raw[0])^[0] := idxDesc; (*{024c-0250} *)
   Express.MatchOpClass(BITSET{3}, 47); (*{0251-0253} index ordinal *)
-  IF Scanner.AcceptSymbol(1) THEN (*{0255-0256} *)
+  IF Scanner.AcceptSy(1) THEN (*{0255-0256} *)
     elemDesc := ParseConstDecl(); (*{025a-025d} recurse *)
   ELSE
-    Scanner.ExpectSymbol(41); (*{0260-0262} OF *)
+    Scanner.ExpectSy(41); (*{0260-0262} OF *)
     elemDesc := ParseType(); (*{0264-0268} FIXME arity *)
   END;
   Words(arrDesc)^[5] := elemDesc; (*{0269-026b} *)
@@ -329,7 +329,7 @@ END ParseConstDecl;
 PROCEDURE ParseVarDecl(first: WORD); (*{027b} FIXME punned ADDRESS/value *)
 VAR desc: ADDRESS;
 BEGIN
-  desc := Scanner.NewSizedNode(1); (*{027d-0280} subrange desc *)
+  desc := Scanner.NewSized(1); (*{027d-0280} subrange desc *)
   Express.GetConstVal; (*{0281} lower bound *)
   IF first = 0 THEN (*{0283-0285} anonymous *)
     Words(desc)^[2] := Words(Express.curDesc.raw[0])^[0]; (*{0287-028c} *)
@@ -340,7 +340,7 @@ BEGIN
   END;
   Express.MatchOpClass(BITSET{5}, 0); (*{029e-02a0} FIXME errCode 0 *)
   Words(desc)^[5] := Words(Express.curDesc.raw[0])^[2]; (*{02a2-02a6} lo value *)
-  Scanner.ExpectSymbol(4); (*{02a7-02a8} `..` *)
+  Scanner.ExpectSy(4); (*{02a7-02a8} `..` *)
   Express.GetConstVal; (*{02aa} upper bound *)
   Express.ConstToCard(Words(desc)^[2], 0); (*{02ac-02af} FIXME order *)
   Words(desc)^[6] := Words(Express.curDesc.raw[0])^[2]; (*{02b1-02b5} hi value *)
@@ -349,7 +349,7 @@ BEGIN
   ELSE
     Express.CentralError(Words(desc)^[6] >= Words(desc)^[5], 46); (*{02c8-02cf} *)
   END;
-  Scanner.ExpectSymbol(6); (*{02d1-02d2} `]` *)
+  Scanner.ExpectSy(6); (*{02d1-02d2} `]` *)
   Words(desc)^[3] := ORD((Words(desc)^[5] > 32767) OR (Words(desc)^[6] > 255)) + 1; (*{02d4-02e2} *)
   RETURN desc; (*{02e2-02e3}*)
 END ParseVarDecl;
@@ -366,27 +366,27 @@ VAR t, u: ADDRESS;
     enumBase: ADDRESS;
     tmp: CARDINAL;
 BEGIN
-  WHILE Scanner.curSymbol IN BITSET{9984H} DO (*{02eb} FIXME: set TBD *)
-    IF Scanner.AcceptSymbol(40) THEN (*{02f5} *)
-      IF Scanner.AcceptSymbol(2) THEN (*{02fb} *)
+  WHILE Scanner.curSym IN BITSET{9984H} DO (*{02eb} FIXME: set TBD *)
+    IF Scanner.AcceptSy(40) THEN (*{02f5} *)
+      IF Scanner.AcceptSy(2) THEN (*{02fb} *)
         elemT := CARDINAL(GetIdent()); (*{0300} FIXME pun *)
       ELSE
-        Scanner.DeclareIdentifier(4); (*{0308} *)
+        Scanner.DeclIden(4); (*{0308} *)
         typ := owner; (*{030d-0327} FIXME: stack shuffles idealized *)
         elemT := CARDINAL(GetIdent());
       END;
       Express.MatchOpClass(BITSET{7}, 40); (*{032c} *)
-      Scanner.ExpectSymbol(41); (*{0331} *)
+      Scanner.ExpectSy(41); (*{0331} *)
       enumBase := typ; (*{0335} *)
       cnt := 0; (*{0338} *)
-      WHILE NOT (Scanner.curSymbol IN BITSET{9472H}) DO (*{033a-03b1} enum loop *)
+      WHILE NOT (Scanner.curSym IN BITSET{9472H}) DO (*{033a-03b1} enum loop *)
         tmp := cnt; t := elemT; (*{0343-0344}*)
         Express.GetTypeDesc(loA, hiA, NIL); (*{0346} FIXME: (dest,mode,src) roles *)
         lo := CARDINAL(loA); hi := CARDINAL(hiA); (*{034c-034f} FIXME pun *)
         IF lo <= hi THEN (*{0350} *)
           t := cnt;
           REPEAT
-            t := Scanner.NewSizedNode(12); (*{0357} *)
+            t := Scanner.NewSized(12); (*{0357} *)
             Words(t)^[6] := u; Words(t)^[2] := elemT; (*{035b-0366} FIXME pun *)
             Words(t)^[3] := enumBase; Words(t)^[7] := lo; (*{0361-0366}*)
             IF u # NIL THEN (*{0367} *)
@@ -396,30 +396,30 @@ BEGIN
             INC(lo); (*{0378-037a} *)
           UNTIL lo > hi;
         END;
-        IF NOT (Scanner.TestSymbolInSet(6) AND Scanner.AcceptSymbol(1)) THEN EXIT END; (*{037c-0384} FIXME: TestSymbolInSet is VOID assert *)
+        IF NOT (Scanner.TestSet(6) AND Scanner.AcceptSy(1)) THEN EXIT END; (*{037c-0384} FIXME: TestSymbolInSet is VOID assert *)
         Scanner.GetSym; (*{0386} *)
         t := cnt;
         typ := ParseType(owner, t, limit); (*{0388-0390} recursive FIXME arity *)
         u := typ;
         IF Words(t)^[3] > limit THEN limit := Words(t)^[3]; END; (*{03a6-03b0} *)
       END;
-      WHILE NOT (Scanner.TestSymbolInSet(8) AND Scanner.AcceptSymbol(1)) DO END; (*{03b6-03ba} FIXME shape *)
-      IF Scanner.AcceptSymbol(10) THEN (*{03bc-03bf} *)
+      WHILE NOT (Scanner.TestSet(8) AND Scanner.AcceptSy(1)) DO END; (*{03b6-03ba} FIXME shape *)
+      IF Scanner.AcceptSy(10) THEN (*{03bc-03bf} *)
         tmp := CARDINAL(ParseType(owner, tmp, limit)); (*{03c1-03c7} FIXME pun *)
         IF CARDINAL(enumBase) > limit THEN limit := CARDINAL(enumBase); END; (*{03c9-03d1} FIXME *)
       END;
-      Scanner.ExpectSymbol(13); (*{03d2} *)
+      Scanner.ExpectSy(13); (*{03d2} *)
       typ := ADDRESS(cnt); (*{03d5-03d7} FIXME pun *)
     ELSE
-      Scanner.DeclareIdentifier(4); (*{03da} *)
+      Scanner.DeclIden(4); (*{03da} *)
       tmp := Scanner.curNode; (*{03de} FIXME: ADDRESS := RecordPtr pun *)
-      WHILE NOT (Scanner.TestSymbolInSet(6) AND Scanner.AcceptSymbol(1)) DO END; (*{03e2-03e9} FIXME shape *)
+      WHILE NOT (Scanner.TestSet(6) AND Scanner.AcceptSy(1)) DO END; (*{03e2-03e9} FIXME shape *)
       Scanner.GetSym; (*{03eb} *)
       elemT := CARDINAL(ParseFormalParams()); (*{03ed} FIXME pun *)
       typ := owner; (*{03f2-0406} FIXME: TypeSizeRec + word9 wiring *)
       tmp := TypeSizeRec(owner, elemT, elemT, elemT, elemT); (*{03f7-0400} FIXME: 5-arg shape TBD *)
     END;
-    IF NOT Scanner.AcceptSymbol(9) THEN EXIT END; (*{0407-040b} *)
+    IF NOT Scanner.AcceptSy(9) THEN EXIT END; (*{0407-040b} *)
   END;
   RETURN typ; (*{040e} *)
 END ParseType;
@@ -429,42 +429,42 @@ PROCEDURE ParseFormalParams(): ADDRESS;
 VAR head, n, kind: CARDINAL;
     tail, cur: ADDRESS;
 BEGIN
-  IF Scanner.AcceptSymbol(43) THEN (*{0413} *)
-    head := CARDINAL(Scanner.NewSizedNode(0)); n := 0; (*{0419-041e} FIXME pun *)
-    Scanner.DeclareIdentifier(1); kind := CARDINAL(Scanner.curNode); (*{041f-0423} FIXME *)
+  IF Scanner.AcceptSy(43) THEN (*{0413} *)
+    head := CARDINAL(Scanner.NewSized(0)); n := 0; (*{0419-041e} FIXME pun *)
+    Scanner.DeclIden(1); kind := CARDINAL(Scanner.curNode); (*{041f-0423} FIXME *)
     INC(n);
-    WHILE Scanner.TestSymbolInSet(34) AND Scanner.AcceptSymbol(1) DO (*{0432-0439} FIXME shape *)
-      Scanner.DeclareIdentifier(1);
+    WHILE Scanner.TestSet(34) AND Scanner.AcceptSy(1) DO (*{0432-0439} FIXME shape *)
+      Scanner.DeclIden(1);
     END;
     Scanner.GetSym; (*{043c} *)
-  ELSIF Scanner.AcceptSymbol(44) THEN (*{044c-044e} *)
+  ELSIF Scanner.AcceptSy(44) THEN (*{044c-044e} *)
     head := CARDINAL(ParseVarDecl(0)); (* nested proc18 FIXME *)
-  ELSIF Scanner.AcceptSymbol(50) THEN (*{0458-045b} *)
-    Scanner.ExpectSymbol(41); (*{045e} *)
-    head := CARDINAL(Scanner.NewSizedNode(4)); (*{0462} FIXME *)
+  ELSIF Scanner.AcceptSy(50) THEN (*{0458-045b} *)
+    Scanner.ExpectSy(41); (*{045e} *)
+    head := CARDINAL(Scanner.NewSized(4)); (*{0462} FIXME *)
     Words(ADDRESS(head))^[3] := 2; (*{0466-0468} FIXME *)
     tail := ParseFormalParams(); (*{0469} FIXME: recursion? *)
     Words(ADDRESS(head))^[2] := tail; (*{046d-046f} FIXME *)
     Express.MatchOpClass(BITSET{3}, 50); (*{0470-0477} *)
     IF Words(tail)^[6] > 15 THEN Express.CentralError(TRUE, 41); END; (*{0479} FIXME cond *)
-  ELSIF Scanner.AcceptSymbol(48) THEN (*{0483-0486} *)
+  ELSIF Scanner.AcceptSy(48) THEN (*{0483-0486} *)
     head := CARDINAL(ParseImportItem(0)); (*{0489} FIXME *)
-  ELSIF Scanner.AcceptSymbol(21) THEN (*{0490-0493} *)
-    head := CARDINAL(Scanner.NewSizedNode(9)); (*{0496} FIXME *)
+  ELSIF Scanner.AcceptSy(21) THEN (*{0490-0493} *)
+    head := CARDINAL(Scanner.NewSized(9)); (*{0496} FIXME *)
     Words(ADDRESS(head))^[3] := 4; (*{049a-049c} FIXME *)
     ParseRecordType(ADDRESS(head), sizeTmp, 1); (*{049d-04a5} FIXME: VAR/size shape TBD *)
-  ELSIF Scanner.AcceptSymbol(47) THEN (*{04a9-04ac} *)
+  ELSIF Scanner.AcceptSy(47) THEN (*{04a9-04ac} *)
     head := CARDINAL(ParseConstDecl()); (* nested proc17 *)
-  ELSIF Scanner.AcceptSymbol(49) THEN (*{04b4-04b7} *)
-    head := CARDINAL(Scanner.NewSizedNode(10)); (*{04ba} FIXME *)
-    Scanner.OpenScope(SymTab.currentScope, NIL); (*{04bd-04bf} FIXME args *)
+  ELSIF Scanner.AcceptSy(49) THEN (*{04b4-04b7} *)
+    head := CARDINAL(Scanner.NewSized(10)); (*{04ba} FIXME *)
+    Scanner.OpenScop(SymTab.currentScope, NIL); (*{04bd-04bf} FIXME args *)
     ParseType(ADDRESS(head), typeTmp, typeLim); (*{04c1-04cd} FIXME args *)
-    Scanner.ExpectSymbol(13); (*{04cf} *)
+    Scanner.ExpectSy(13); (*{04cf} *)
     SymTab.currentScope := Scanner.curNode; (*{04d2-04d5} FIXME: T1 := RecordPtr pun *)
     IF Words(ADDRESS(head))^[3] < 2 THEN Words(ADDRESS(head))^[3] := 2; END; (*{04d7-04df} *)
   ELSE
     head := CARDINAL(GetIdent()); (*{04e2} FIXME pun *)
-    IF Scanner.AcceptSymbol(44) THEN head := CARDINAL(ParseVarDecl(0)); END; (*{04e6-04ef} *)
+    IF Scanner.AcceptSy(44) THEN head := CARDINAL(ParseVarDecl(0)); END; (*{04e6-04ef} *)
   END;
   RETURN ADDRESS(head); (*{04f0} FIXME pun *)
 END ParseFormalParams;
@@ -473,7 +473,7 @@ END ParseFormalParams;
 PROCEDURE ParseValParam(): ADDRESS;
 VAR t: ADDRESS;
 BEGIN
-  IF Scanner.AcceptSymbol(48) THEN (*{04f6} *)
+  IF Scanner.AcceptSy(48) THEN (*{04f6} *)
     t := ParseImportItem(0); (*{04fc-04fe} FIXME arg *)
   ELSE
     t := ParseFormalParams(); (*{0503-0504} *)
@@ -485,9 +485,9 @@ END ParseValParam;
 PROCEDURE ParseVarParam;
 VAR t: ADDRESS;
 BEGIN
-  WHILE Scanner.curSymbol = 0 DO (*{050d-0543} *)
-    t := Scanner.MakeIdentifierNode(1); (*{0512-0514} FIXME: ADDRESS := ADDRESS ok *)
-    Scanner.ExpectSymbol(52); (*{0516-0518} *)
+  WHILE Scanner.curSym = 0 DO (*{050d-0543} *)
+    t := Scanner.MakeIden(1); (*{0512-0514} FIXME: ADDRESS := ADDRESS ok *)
+    Scanner.ExpectSy(52); (*{0516-0518} *)
     Express.GetConstVal; (*{051b} *)
     Words(t)^[2] := Express.curDesc.raw[0]; (*{051d-0521} FIXME pun *)
     Words(t)^[6] := Express.curDesc.raw[2]; (*{0522-0528} dword spill idealized *)
@@ -495,8 +495,8 @@ BEGIN
        AND (Words(t)^[6] = 0) THEN (*{0529-0537} FIXME: compilationActive BOOLEAN vs 0 *)
       OpenScopeEmit(t); (*{053a} *)
     END;
-    Scanner.InsertSymbol(t); (*{053c-0541} FIXME: T1 pun *)
-    Scanner.ExpectSymbol(9); (*{0542} *)
+    Scanner.InsertSy(t); (*{053c-0541} FIXME: T1 pun *)
+    Scanner.ExpectSy(9); (*{0542} *)
   END;
 END ParseVarParam;
 
@@ -506,29 +506,29 @@ VAR saveScope: ADDRESS; tag, fld: CARDINAL;
     node: ADDRESS;
 BEGIN
   saveScope := ADDRESS(SymTab.currentScope); (*{054a-0550} FIXME pun *)
-  IF Scanner.curSymbol = 0 THEN (*{054e-0551} *)
-    Scanner.NeedIdentifier; tag := CARDINAL(Scanner.curNode); (*{0553-0556} FIXME *)
-    IF Scanner.TestSymbolInSet(6) THEN (*{0558?} FIXME: group wove word13/identKind guards; shape TBD *)
+  IF Scanner.curSym = 0 THEN (*{054e-0551} *)
+    Scanner.NeedID; tag := CARDINAL(Scanner.curNode); (*{0553-0556} FIXME *)
+    IF Scanner.TestSet(6) THEN (*{0558?} FIXME: group wove word13/identKind guards; shape TBD *)
       Scanner.GetSym;
-      Scanner.ExpectSymbol(52);
+      Scanner.ExpectSy(52);
       fld := CARDINAL(ParseValParam()); (*{056d-0570} FIXME *)
       Words(ADDRESS(tag))^[2] := fld; (*{0571-0579} FIXME *)
     ELSE
-      tag := CARDINAL(Scanner.MakeIdentifierNode(3)); (*{05b9-05bd} FIXME *)
-      IF Compiler.compilationActive AND (Scanner.curSymbol = 9) THEN (*{05be-05c6} *)
-        fld := CARDINAL(Scanner.NewSizedNode(6)); Words(ADDRESS(fld))^[3] := 2; (*{05c8-05ce} FIXME *)
+      tag := CARDINAL(Scanner.MakeIden(3)); (*{05b9-05bd} FIXME *)
+      IF Compiler.compilationActive AND (Scanner.curSym = 9) THEN (*{05be-05c6} *)
+        fld := CARDINAL(Scanner.NewSized(6)); Words(ADDRESS(fld))^[3] := 2; (*{05c8-05ce} FIXME *)
       ELSE
-        Scanner.ExpectSymbol(52); (*{05d1-05d3} *)
+        Scanner.ExpectSy(52); (*{05d1-05d3} *)
         fld := CARDINAL(ParseValParam()); (*{05d5-05d8} *)
       END;
       Words(ADDRESS(tag))^[2] := fld; (*{05d9-05db} FIXME *)
-      Scanner.InsertSymbol(ADDRESS(tag)); (*{05dc-05dd} FIXME T1 pun *)
+      Scanner.InsertSy(ADDRESS(tag)); (*{05dc-05dd} FIXME T1 pun *)
     END;
-    Scanner.ExpectSymbol(9); (*{05e0} *)
+    Scanner.ExpectSy(9); (*{05e0} *)
   ELSE
     tag := CARDINAL(SymTab.currentScope); node := saveScope; (*{05ed-05f1} FIXME *)
     WHILE ADDRESS(tag) # node DO (*{05f1-0605} FIXME *)
-      IF ADDRESS(tag) = NIL THEN Errors.ReportErrorWithText(5, Scanner.tokenBuffer); END; (*{05f9-0600} *)
+      IF ADDRESS(tag) = NIL THEN Errors.ReportErrorWithText(5, Scanner.tokBuf); END; (*{05f9-0600} *)
       tag := CARDINAL(Words(ADDRESS(tag))^[0]); (*{0602-0604} FIXME *)
     END;
   END;
@@ -539,23 +539,23 @@ PROCEDURE EvalConstExpr;
 VAR t, u, v: CARDINAL;
     n: CARDINAL;
 BEGIN
-  WHILE Scanner.curSymbol = 0 DO (*{060c-0682} *)
+  WHILE Scanner.curSym = 0 DO (*{060c-0682} *)
     t := CARDINAL(SymTab.currentScope); (*{0611-0613} FIXME *)
-    Scanner.DeclareIdentifier(4); u := CARDINAL(Scanner.curNode); (*{0615-0619} FIXME *)
+    Scanner.DeclIden(4); u := CARDINAL(Scanner.curNode); (*{0615-0619} FIXME *)
     Words(ADDRESS(u))^[4] := Express.spillFlag; (*{061b-061d} FIXME *)
-    IF Scanner.AcceptSymbol(44) THEN (*{061e-0622} *)
+    IF Scanner.AcceptSy(44) THEN (*{061e-0622} *)
       Express.GetConstVal; (*{0624} *)
       Express.ConstToCard(Compiler.CardType, 44); (*{0626-062a} FIXME: (type,code) vs DEF order *)
       Words(ADDRESS(u))^[2] := Express.curDesc.raw[2]; (*{062b-062f} FIXME *)
       Words(ADDRESS(u))^[3] := 256; (*{0631-0637} *)
-      Scanner.ExpectSymbol(6); (*{0638} *)
+      Scanner.ExpectSy(6); (*{0638} *)
     END;
-    IF NOT (Scanner.TestSymbolInSet(6) AND Scanner.AcceptSymbol(1)) THEN EXIT END; (*{0639-0640} FIXME shape *)
+    IF NOT (Scanner.TestSet(6) AND Scanner.AcceptSy(1)) THEN EXIT END; (*{0639-0640} FIXME shape *)
     Scanner.GetSym; (*{0642} *)
     v := CARDINAL(ParseFormalParams()); (*{0644-0647} FIXME *)
     IF Words(ADDRESS(v))^[4] > 9 THEN n := 2; ELSE n := (Words(ADDRESS(v))^[3] + 1) DIV 2; END; (*{0648-0659} FIXME *)
     TypeSizeRec(ADDRESS(t), ADDRESS(u), ADR(SymTab.stringPoolPtr), ADDRESS(v), n); (*{065a-0662} FIXME: 5-arg punned shape *)
-    Scanner.ExpectSymbol(9); (*{0664} *)
+    Scanner.ExpectSy(9); (*{0664} *)
     IF Express.spillFlag = 0 THEN (*{0667-066d} *)
       IF SymTab.stringPoolPtr <= 510 THEN Express.CentralError(TRUE, 83); END; (*{066c-0674} FIXME cond *)
     ELSE
@@ -568,9 +568,9 @@ END EvalConstExpr;
 PROCEDURE CheckConformant(): ADDRESS;
 VAR t: ADDRESS;
 BEGIN
-  IF Scanner.AcceptSymbol(47) THEN (*{0689-068d} *)
-    Scanner.ExpectSymbol(41); (*{068f-0691} *)
-    t := Scanner.NewSizedNode(11); (*{0693-0695} *)
+  IF Scanner.AcceptSy(47) THEN (*{0689-068d} *)
+    Scanner.ExpectSy(41); (*{068f-0691} *)
+    t := Scanner.NewSized(11); (*{0693-0695} *)
     CheckConformantTail(t); (*{0697-0699} FIXME: self/nested-variant TBD *)
   ELSE
     t := GetIdent(); (*{069e-06a0} *)
@@ -586,19 +586,19 @@ VAR total: CARDINAL;
     lo, hi: CARDINAL;
 BEGIN
   total := 6; size := 0; (*{06a9-06b0} *)
-  IF Scanner.curSymbol # 9 THEN (*{06b1-06b5} *)
-    Scanner.ExpectSymbol(43); (*{06b7-06b9} *)
-    IF NOT Scanner.AcceptSymbol(5) THEN GOTO noFixed END; (*{06bb-06bf} *)
-    Scanner.OpenScope(SymTab.currentScope, NIL); (*{06c1-06c4} FIXME args *)
-    IF Scanner.AcceptSymbol(20) THEN code := 24; ELSE code := 8; END; (*{06c7-06d3} *)
+  IF Scanner.curSym # 9 THEN (*{06b1-06b5} *)
+    Scanner.ExpectSy(43); (*{06b7-06b9} *)
+    IF NOT Scanner.AcceptSy(5) THEN GOTO noFixed END; (*{06bb-06bf} *)
+    Scanner.OpenScop(SymTab.currentScope, NIL); (*{06c1-06c4} FIXME args *)
+    IF Scanner.AcceptSy(20) THEN code := 24; ELSE code := 8; END; (*{06c7-06d3} *)
     IF tag # 0 THEN (*{06d4} *)
       fld := Scanner.NewNode(4); (*{06d7-06d9} *)
       Words(fld)^[1] := SymTab.currentScope; Words(fld)^[0] := SymTab.currentScope; (*{06db-06e3} FIXME T1 pun *)
       Words(fld)^[3] := code; disc := 1; hi := 34; (*{06e4-06eb} *)
     ELSE
-      Scanner.DeclareIdentifier(4); fld := Scanner.curNode; (*{06ee-06f2} FIXME T1 pun *)
+      Scanner.DeclIden(4); fld := Scanner.curNode; (*{06ee-06f2} FIXME T1 pun *)
       Words(fld)^[3] := code; Words(fld)^[6] := Express.spillFlag + 1; (*{06f3-06fb} FIXME *)
-      IF NOT (Scanner.TestSymbolInSet(6) AND Scanner.AcceptSymbol(1)) THEN EXIT END; (* FIXME shape *)
+      IF NOT (Scanner.TestSet(6) AND Scanner.AcceptSy(1)) THEN EXIT END; (* FIXME shape *)
       Scanner.GetSym; disc := 9; hi := 544; (*{0704-070b} *)
     END;
   fixedLoop:
@@ -606,7 +606,7 @@ BEGIN
     cur := fld;
     WHILE cur # rec DO cur := Words(cur)^[0]; END; (*{0711-071b} *)
     rec := fld; (*{071d-071f} *)
-    IF NOT Scanner.TestSymbolInSet(hi) THEN GOTO doneVariants END; (*{0720-0726} FIXME set TBD *)
+    IF NOT Scanner.TestSet(hi) THEN GOTO doneVariants END; (*{0720-0726} FIXME set TBD *)
     Scanner.GetSym; (*{0729} *)
     IF fld # NIL THEN (*{072b-072d} *)
       fld := Words(fld)^[2]; head := fld; (*{072f-0733} *)
@@ -621,7 +621,7 @@ BEGIN
     END;
     SymTab.currentScope := SymTab.currentScope; (*{0765-0768} self-store? slot shuffle FIXME *)
   noFixed:
-    IF Scanner.AcceptSymbol(2) THEN (*{076a-076d} *)
+    IF Scanner.AcceptSy(2) THEN (*{076a-076d} *)
       disc := CARDINAL(GetIdent()); (*{076f-0772} FIXME *)
       Express.MatchOpClass(BITSET{511}, 2); (*{0773-077b} *)
       size := disc; (*{077d-077f} *)
@@ -632,9 +632,9 @@ END ParseRecordType;
 (* proc25 @0783 — ~CloseScopeFixup. 0 formals. *)
 PROCEDURE CloseScopeFixup;
 BEGIN
-  IF 0 IN Scanner.curSymbol THEN (*{0785-078a} FIXME: CARDINAL set test *)
+  IF 0 IN Scanner.curSym THEN (*{0785-078a} FIXME: CARDINAL set test *)
     Texts.WriteString(3, ""); (*{078c-0791} FIXME: proc21 args TBD *)
-    Texts.WriteString(3, Scanner.tokenBuffer); (*{0793-0798} FIXME *)
+    Texts.WriteString(3, Scanner.tokBuf); (*{0793-0798} FIXME *)
     Texts.WriteLn(3); (*{079a-079c} FIXME *)
   END;
   INC(nestDepth); (*{079d-079f} FIXME: group used Pass1.tempDepth *)
@@ -656,20 +656,20 @@ PROCEDURE ParseProcedureDecl;
 VAR l2, l3, l4, l5: ADDRESS; s0, s1, s2, s3, s5, s6: WORD;
 BEGIN
   CloseScopeFixup; (*{07aa} proc25 *)
-  Scanner.NeedIdentifier; (*{07ad} *)
-  IF (Scanner.word13 = SymTab.currentScope) & (Compiler.scopeSpare3 = NIL) & (5 IN Scanner.followSet) THEN (*{07af-07bf} FIXME codes *)
+  Scanner.NeedID; (*{07ad} *)
+  IF (Scanner.word13 = SymTab.currentScope) & (Compiler.scopeSpare3 = NIL) & (5 IN Scanner.follSet) THEN (*{07af-07bf} FIXME codes *)
     l3 := Scanner.curNode; (*{07c1-07c3} FIXME pun *)
     Scanner.Allocate(ADR(l2), 14); (*{07c4-07c7} FIXME: group wrote Proc7 *)
     MOVE(l3, l2, 14); (*{07c9-07cc} FIXME dst/src order *)
     Scanner.GetSym; (*{07d6} *)
   ELSE
-    l2 := Scanner.DeclareIdentifier(5); (*{07da-07de} *)
+    l2 := Scanner.DeclIden(5); (*{07da-07de} *)
     Words(l2)^[5] := PushTempMark(); (*{07df-07e4} FIXME pun *)
     Words(l2 + 1)^[5] := Express.spillFlag; (*{07e5-07eb} FIXME cell *)
   END;
-  Scanner.GetStackMark(ADR(l6)); (*{07ec-07ee} FIXME slot *)
+  Scanner.GetStack(ADR(l6)); (*{07ec-07ee} FIXME slot *)
   ParseRecordType(l2 + 6, l2 + 2, 0); (*{07f0-07f8} FIXME: ADDRESS arith + (rec,size,tag) roles *)
-  Scanner.ExpectSymbol(9); (*{07fa-07fb} *)
+  Scanner.ExpectSy(9); (*{07fa-07fb} *)
   IF 5 IN Words(l2)^[3] THEN (*{07fd-0801} FIXME: group ternary w/ s3 TBD *)
     Express.CentralError(TRUE, 68); (*{080f-0814} FIXME: Proc21 8-cell call TBD *)
     WHILE l4 # NIL DO (*{0816-082f} formal walk FIXME *)
@@ -677,13 +677,13 @@ BEGIN
       l4 := Words(l4)^[0];
     END;
     Words(l2)^[3] := Words(l2)^[3] - BITSET{5}; (*{0831-0838} *)
-    Scanner.CheckStackMark(l2 + 14); (*{0839-083c} FIXME arith *)
+    Scanner.CheckStk(l2 + 14); (*{0839-083c} FIXME arith *)
     ParseProcBody(l2); (*{0843} `f9 proc9` *)
   ELSE
     IF Compiler.scopeSpare3 = NIL THEN (*{0846-0849} *)
-      IF Scanner.AcceptSymbol(67) THEN (*{084b-084e} FIXME: 67=END? *)
+      IF Scanner.AcceptSy(67) THEN (*{084b-084e} FIXME: 67=END? *)
         s3 := 32; (*{0851-0856} FIXME *)
-        Scanner.ExpectSymbol(9); (*{0856} *)
+        Scanner.ExpectSy(9); (*{0856} *)
       ELSE
         ParseProcBody(l2); (*{085a-085b} *)
         InsertSetConst(NIL, 0); (*{085c-085e} FIXME args *)
@@ -699,13 +699,13 @@ VAR l2, l3: ADDRESS;
 BEGIN
   CloseScopeFixup; (*{087d} *)
   l3 := ADDRESS(Statemen.withPending); (*{087e-087f} FIXME pun *)
-  l2 := Scanner.DeclareIdentifier(6); (*{0880-0884} *)
-  IF Scanner.AcceptSymbol(44) THEN (*{0885-0887} FIXME: 44 here? *)
+  l2 := Scanner.DeclIden(6); (*{0880-0884} *)
+  IF Scanner.AcceptSy(44) THEN (*{0885-0887} FIXME: 44 here? *)
     Statemen.withPending := 1; (*{088b-088c} *)
     Express.EvalConstExpr; (*{088d} FIXME: group saw proc13=GetConstVal *)
-    Scanner.ExpectSymbol(6); (*{088f-0891} *)
+    Scanner.ExpectSy(6); (*{088f-0891} *)
   END;
-  Scanner.ExpectSymbol(9); (*{0893-0894} *)
+  Scanner.ExpectSy(9); (*{0893-0894} *)
   EmitModuleProlog(l2); (*{0896-0897} FIXME-NYC *)
   Statemen.withPending := CARDINAL(l3); (*{0898-0899} FIXME *)
   DEC(nestDepth); (*{089b-089d} *)
@@ -715,7 +715,7 @@ END ParseModuleHead;
 PROCEDURE ParseExportList;
 VAR l2: ADDRESS; l3: WORD;
 BEGIN
-  l2 := Scanner.DeclareIdentifier(2); (*{08b4-08b8} *)
+  l2 := Scanner.DeclIden(2); (*{08b4-08b8} *)
   l3 := PushTempMark(); (*{08b9-08ba} FIXME: WORD := CARDINAL pun *)
   IF Compiler.scopeSpare3 = NIL THEN (*{08be-08c1} *)
     CodeGen.OpenFixup(1, l3, 0); (*{08c3-08c6} FIXME: (pos?,...) arity *)
@@ -724,8 +724,8 @@ BEGIN
     CodeGen.EmitConst(l2); (*{08d5} FIXME-NYC *)
     CodeGen.EmitConst2(l2, s1); (*{08d7-08d9} FIXME-NYC *)
   END;
-  Scanner.TestSymbolInSet(514); (*{08dc-08df} FIXME: CARDINAL set pun *)
-  WHILE NOT Scanner.AcceptSymbol(1) DO (*{08e1-08e5} FIXME loop shape *)
+  Scanner.TestSet(514); (*{08dc-08df} FIXME: CARDINAL set pun *)
+  WHILE NOT Scanner.AcceptSy(1) DO (*{08e1-08e5} FIXME loop shape *)
     Scanner.GetSym; (*{08e7} *)
   END;
 END ParseExportList;
@@ -736,7 +736,7 @@ VAR l2: CARDINAL; l3: ADDRESS; l4: WORD;
 BEGIN
   l4 := Express.spillFlag; (*{08f3-08f5} FIXME: group wrote word4 *)
   l3 := SymTab.currentScope; (*{08f6-08f8} FIXME T1 pun *)
-  l2 := Scanner.curSymbol; (*{08f9-08fc} *)
+  l2 := Scanner.curSym; (*{08f9-08fc} *)
   Scanner.GetSym; (*{08fd} *)
   CASE l2 OF (*{08fe-0913} callswitch 104..112 *)
      104: ParseExportList(); (*{0901} *)
@@ -755,16 +755,16 @@ PROCEDURE ParseDeclarations(follow: BITSET): BOOLEAN;
 VAR l2: CARDINAL; l3: CARDINAL; l4: CARDINAL; l5: CARDINAL;
     l6: ADDRESS; l7: ADDRESS;
 BEGIN
-  l2 := CARDINAL(Scanner.scanOptions); (*{0945-0947} FIXME pun *)
-  l3 := Scanner.tokenPos; (*{0948-094b} FIXME: group wrote word25 *)
-  Scanner.GetStackMark(ADR(l6)); (*{094c-094e} *)
+  l2 := CARDINAL(Scanner.scanOpt); (*{0945-0947} FIXME pun *)
+  l3 := Scanner.tokPos; (*{0948-094b} FIXME: group wrote word25 *)
+  Scanner.GetStack(ADR(l6)); (*{094c-094e} *)
   l5 := CodeGen.nextEmitPos; (*{0950-0952} FIXME: group wrote word2 *)
   l7 := SymTab.currentScope; (*{0953-0956} FIXME pun *)
   l4 := SymTab.moduleCount + SymTab.stringPoolPtr * 128; (*{0957-095e} FIXME: group packed word4+word5 *)
-  IF (Scanner.curSymbol = 13) OR (Scanner.curSymbol = 23) THEN (*{095f-096a} FIXME codes *)
+  IF (Scanner.curSym = 13) OR (Scanner.curSym = 23) THEN (*{095f-096a} FIXME codes *)
     Statemen.GuardedStatSeq(follow); (*{096c-096d} *)
   ELSE
-    Scanner.TestSymbolInSet(2018); (*{0971-0974} FIXME: CARDINAL set pun *)
+    Scanner.TestSet(2018); (*{0971-0974} FIXME: CARDINAL set pun *)
     ParseDeclSync(); (*{0976} *)
     WHILE NOT TryParseDecl(follow) DO END; (*{0977-097a} FIXME polarity *)
   END;
@@ -773,10 +773,10 @@ BEGIN
   SymTab.moduleCount := l4 MOD 256; (*{097f-0983} FIXME *)
   AllocSymEntry((l4 DIV 256) * 2); (*{0984-098a} FIXME role *)
   IF Errors.savedEditPos > l3 THEN (*{098d-0993} FIXME: group wrote word2 *)
-    Scanner.tokenPos := l3; (*{0995-0996} *)
-    Scanner.scanOptions := BITSET(l2); (*{0999-099a} FIXME *)
+    Scanner.tokPos := l3; (*{0995-0996} *)
+    Scanner.scanOpt := BITSET(l2); (*{0999-099a} FIXME *)
     CodeGen.nextEmitPos := l5; (*{099c-099d} FIXME: assignable? *)
-    Scanner.CheckStackMark(l6); (*{099f-09a0} *)
+    Scanner.CheckStk(l6); (*{099f-09a0} *)
     Errors.RollbackToMark; (*{09a2} *)
     CodeGen.OpenEmitter; (*{09a4} *)
     RETURN FALSE; (*{09a7-09a8} *)
@@ -786,14 +786,14 @@ END ParseDeclarations;
 (*{09b9} IMEXDC — ParseImportFrom. 0 params. *)
 PROCEDURE ParseImportFrom;
 BEGIN
-  IF (Scanner.curSymbol = 15) OR (Scanner.curSymbol = 16) THEN (*{09bb-09c6} FIXME codes *)
+  IF (Scanner.curSym = 15) OR (Scanner.curSym = 16) THEN (*{09bb-09c6} FIXME codes *)
     SymTab.DefineDefinitionModule(0); (*{09c8-09cc} FIXME: 2 pushes vs 1 formal *)
     ParseImportScope(); (*{09ce-09cf} FIXME-NYC *)
-  ELSIF (Scanner.curSymbol = 23) OR (Scanner.curSymbol = 13) THEN (*{09d3-09de} *)
+  ELSIF (Scanner.curSym = 23) OR (Scanner.curSym = 13) THEN (*{09d3-09de} *)
     Statemen.GuardedStatSeq(BITSET{}); (*{09e0-09e2} FIXME: extra push TBD *)
   ELSE
-    Scanner.TestSymbolInSet(2046); (*{09e6-09e9} FIXME pun *)
-    IF Scanner.curSymbol = 17 THEN (*{09eb-09ef} *)
+    Scanner.TestSet(2046); (*{09e6-09e9} FIXME pun *)
+    IF Scanner.curSym = 17 THEN (*{09eb-09ef} *)
       SymTab.DefineProgramModule(0); (*{09f2-09f9} FIXME: 6 pushes vs 1 formal *)
     ELSE
       ParseDeclSync(); (*{09fd} *)
@@ -810,8 +810,8 @@ BEGIN
   l2 := SymTab.currentScope; (*{0a0e-0a10} FIXME pun *)
   l3 := SymTab.ownNamePtr; (*{0a11-0a13} FIXME: group wrote word11 *)
   SymTab.ownNamePtr := NIL; (*{0a14-0a15} FIXME *)
-  Scanner.OpenScope(SymTab.currentScope, NIL); (*{0a17-0a1a} FIXME args *)
-  Scanner.GetStackMark(ADR(l5)); (*{0a1d-0a1f} FIXME slot *)
+  Scanner.OpenScop(SymTab.currentScope, NIL); (*{0a17-0a1a} FIXME args *)
+  Scanner.GetStack(ADR(l5)); (*{0a1d-0a1f} FIXME slot *)
   ParseImportScope(); (*{0a21} *)
   Scanner.GetSym; (*{0a23} *)
   l4 := SymTab.ownNamePtr; (*{0a25-0a27} FIXME *)
@@ -829,13 +829,13 @@ END ParseModuleBlock;
 PROCEDURE ParseProcBody(procNode: ADDRESS);
 VAR l2: CARDINAL; l3: ADDRESS; l4: CARDINAL;
 BEGIN
-  Scanner.GetStackMark(ADR(l3)); (*{0a58-0a5a} *)
+  Scanner.GetStack(ADR(l3)); (*{0a58-0a5a} *)
   l2 := SymTab.stringPoolPtr; (*{0a5c-0a5e} FIXME: group wrote word5 *)
   SymTab.stringPoolPtr := 510; (*{0a5f-0a62} FIXME pun *)
-  Scanner.OpenScope(SymTab.currentScope, procNode); (*{0a64-0a68} FIXME: 3rd push TBD *)
+  Scanner.OpenScop(SymTab.currentScope, procNode); (*{0a64-0a68} FIXME: 3rd push TBD *)
   Express.spillFlag := Express.spillFlag + 1; (*{0a6b-0a6d} FIXME: group wrote word4 *)
-  Scanner.PushWithScope; (*{0a70} *)
-  IF Scanner.curSymbol = 0 THEN (*{0a72?} FIXME: group wove word10/9/8 guard; shape TBD *)
+  Scanner.PushWith; (*{0a70} *)
+  IF Scanner.curSym = 0 THEN (*{0a72?} FIXME: group wove word10/9/8 guard; shape TBD *)
     Statemen.GuardedStatSeq(BITSET{}); (*{0a85-0a86} FIXME arg *)
   ELSE
     l4 := 0; (*{0a8f-0a90} *)
@@ -846,7 +846,7 @@ BEGIN
   Scanner.GetSym; (*{0ac2} *)
   Express.spillFlag := Express.spillFlag - 1; (*{0ac9-0acc} FIXME *)
   SymTab.stringPoolPtr := l2; (*{0ace-0acf} FIXME *)
-  Scanner.CheckStackMark(l3); (*{0ad1-0ad2} *)
+  Scanner.CheckStk(l3); (*{0ad1-0ad2} *)
   Words(emitBase)^[0] := Scanner.codeSize; (*{0ad4-0ade} FIXME: indexed-emit shape *)
 END ParseProcBody;
 
@@ -857,21 +857,21 @@ VAR l2: ADDRESS; l3: ADDRESS;
     l6: CARDINAL; l7: CARDINAL;
     l8, l10: CARDINAL; l9: ADDRESS;
 BEGIN
-  Scanner.GetStackMark(ADR(l9)); (*{0af1-0af3} *)
-  Scanner.AcceptSymbol(25); (*{0af5-0af7} *)
-  l6 := ORD(NOT Compiler.scopeSpare3) AND ORD(Scanner.AcceptSymbol(24)); (*{0af9-0b0d} FIXME shape *)
-  Scanner.ExpectSymbol(22); (*{0b0e-0b10} *)
+  Scanner.GetStack(ADR(l9)); (*{0af1-0af3} *)
+  Scanner.AcceptSy(25); (*{0af5-0af7} *)
+  l6 := ORD(NOT Compiler.scopeSpare3) AND ORD(Scanner.AcceptSy(24)); (*{0af9-0b0d} FIXME shape *)
+  Scanner.ExpectSy(22); (*{0b0e-0b10} *)
   l7 := 0; (*{0b12-0b13} *)
-  l3 := Scanner.MakeIdentifierNode(5); (*{0b4e-0b52} *)
-  IF Scanner.AcceptSymbol(44) THEN (*{0b53-0b55} FIXME: 44 here? *)
+  l3 := Scanner.MakeIden(5); (*{0b4e-0b52} *)
+  IF Scanner.AcceptSy(44) THEN (*{0b53-0b55} FIXME: 44 here? *)
     IF Statemen.withPending # 0 THEN (*{0b59-0b5b} *)
-      Scanner.ExpectIdentKind(1); Scanner.GetSym; (*{0b5d-0b60} *)
-      Scanner.ExpectSymbol(6); (*{0b62-0b63} *)
+      Scanner.ExpectKd(1); Scanner.GetSym; (*{0b5d-0b60} *)
+      Scanner.ExpectSy(6); (*{0b62-0b63} *)
     END;
   END;
-  Scanner.ExpectSymbol(9); (*{0b65-0b66} *)
-  Scanner.TestSymbolInSet(2031); (*{0b68-0b6b} FIXME pun *)
-  IF Compiler.scopeSpare3 OR (l6 # 0) OR (Scanner.curSymbol - 13 IN BITSET{0..12}) THEN (*{0b6d-0b7a} FIXME *)
+  Scanner.ExpectSy(9); (*{0b65-0b66} *)
+  Scanner.TestSet(2031); (*{0b68-0b6b} FIXME pun *)
+  IF Compiler.scopeSpare3 OR (l6 # 0) OR (Scanner.curSym - 13 IN BITSET{0..12}) THEN (*{0b6d-0b7a} FIXME *)
     CASE CARDINAL(0) OF (*{0ba1} FIXME: Loader.Proc5()+1 DIV 2 dispatch, codes 92/93/94 *)
        92: SymTab.CompileDispatch(l2, TRUE, l6 # 0); (*{0b83-0b8c} FIXME: 5 pushes vs 3 formals *)
     |  93: SymTab.CompileDispatch(l2, TRUE, l6 # 0); (*{0b8d-0b96} FIXME *)
@@ -900,7 +900,7 @@ BEGIN
       END;
       l4 := Words(l4)^[0]; (*{0c40-0c42} *)
     END;
-    IF (Scanner.curSymbol # 23) AND (Scanner.curSymbol # 13) THEN (*{0c45-0c50} *)
+    IF (Scanner.curSym # 23) AND (Scanner.curSym # 13) THEN (*{0c45-0c50} *)
       WHILE NOT TryParseDecl(0) DO END; (*{0c52-0c55} FIXME arg *)
     ELSE
       Statemen.GuardedStatSeq(BITSET{}); (*{0c59-0c5a} FIXME arg *)
@@ -910,8 +910,8 @@ BEGIN
   RETURN TRUE; (*{0c62-0c63} *)
   (* guarded-recovery handler: *)
   IF Errors.savedEditPos > l10 THEN (*{0c65-0c69} FIXME: group wrote word2; l10 uninit here TBD *)
-    Scanner.tokenPos := l10; Scanner.scanOptions := BITSET(l8); (*{0c6b-0c70} FIXME *)
-    Scanner.CheckStackMark(l9); (*{0c72} *)
+    Scanner.tokPos := l10; Scanner.scanOpt := BITSET(l8); (*{0c6b-0c70} FIXME *)
+    Scanner.CheckStk(l9); (*{0c72} *)
     Errors.RollbackToMark; (*{0c75} *)
     CodeGen.OpenEmitter; (*{0c77} *)
     RETURN FALSE; (*{0c7a-0c7b} *)
@@ -930,7 +930,7 @@ BEGIN
     CodeGen.CloseFixup(Words(emitBase)^[l2], 0); (*{0ca4-0ca8} FIXME pun *)
   END;
   IF CodeGen.windowBase = 0 THEN (*{0cd2-0cd5} FIXME: group wrote word3 *)
-    MOVE(Scanner.codeBuffer, l3, 16); (*{0cd7-0cdc} FIXME dst/src order *)
+    MOVE(Scanner.codeBuf, l3, 16); (*{0cd7-0cdc} FIXME dst/src order *)
   END;
   IF Compiler.rangeCheckEnabled = FALSE THEN (*{0cef-0cf1} FIXME: group wrote word2 *)
     Texts.WriteString(3, "Compiled bytes:"); (* FIXME *)
@@ -989,29 +989,29 @@ PROCEDURE InitPass1; FORWARD;
   skips input). Compiler.scopeSpare3/word2 flag roles TBD (no DEF slots). *)
 PROCEDURE WriteOutputFiles;
 BEGIN
-  WHILE Scanner.curChar # CHR(255) DO (*{0db4-0db9} *)
-    Scanner.NextChar; (*{0dbb} *)
-    Express.CentralError((Scanner.curChar = CHR(255))
-      OR (Scanner.curChar <= CHR(32)), 32); (*{0dbd-0dcb} *)
+  WHILE Scanner.curCh # CHR(255) DO (*{0db4-0db9} *)
+    Scanner.NextCh; (*{0dbb} *)
+    Express.CentralError((Scanner.curCh = CHR(255))
+      OR (Scanner.curCh <= CHR(32)), 32); (*{0dbd-0dcb} *)
   END;
-  IF 0 IN Scanner.scanOptions THEN (*{0dcf-0dd3} *)
+  IF 0 IN Scanner.scanOpt THEN (*{0dcf-0dd3} *)
     Texts.WriteLn(3); (*{0dd5-0dd6} FIXME channel roles TBD *)
     Texts.WriteString(3, "End of source reached."); (*{0dd8-0df3} *)
     Texts.WriteLn(3);
   END;
-  Files.Close(Scanner.sourceFile); (*{0df8-0dfb} FIXME proc identity *)
+  Files.Close(Scanner.srcFile); (*{0df8-0dfb} FIXME proc identity *)
   Texts.WriteLn(3);
   IF Compiler.scopeSpare3 THEN (*{0e00-0e02} FIXME: group read word3; TRUE = .SYM path *)
     SymTab.SaveSymbolFile; (*{0e04} *)
     Texts.WriteString(3, "Symbol"); (*{0e06-0e10} *)
-    Scanner.ChangeFileExtension(ComLine.outName, "SYM", TRUE); (*{0e12-0e1c} FIXME ComLine slot *)
+    Scanner.ChangeEx(ComLine.outName, "SYM", TRUE); (*{0e12-0e1c} FIXME ComLine slot *)
   ELSE
     WriteMcdHeader; (*{0e21} *)
     EmitTypeDesc; (*{0e23} *)
-    Scanner.ChangeFileExtension(ComLine.outName, "MCD", TRUE); (*{0e25-0e2f} *)
+    Scanner.ChangeEx(ComLine.outName, "MCD", TRUE); (*{0e25-0e2f} *)
     IF NOT Compiler.rangeCheckEnabled THEN (*{0e32-0e35} FIXME: group read word2; polarity TBD *)
       Files.SetPos(Scanner.codeFile, LONG(CodeGen.windowBase)); (*{0e37-0e3d} FIXME proc/arg order *)
-      Files.WriteBytes(Scanner.codeFile, Scanner.codeBuffer,
+      Files.WriteBytes(Scanner.codeFile, Scanner.codeBuf,
         CodeGen.nextEmitPos - CodeGen.windowBase); (*{0e40-0e4a} FIXME proc identity *)
       Texts.WriteString(3, "M-code"); (*{0e4d-0e57} *)
     END;
@@ -1020,7 +1020,7 @@ BEGIN
     Texts.WriteString(3, " file "); (*{0e62-0e6b} *)
     Texts.WriteString(3, ComLine.outName); (*{0e6e-0e73} FIXME slot *)
     Texts.WriteString(3, " produced."); (*{0e75-0e83} *)
-    Files.Close(Scanner.sourceFile); (*{0e85-0e8c} FIXME: finalizer identity TBD *)
+    Files.Close(Scanner.srcFile); (*{0e85-0e8c} FIXME: finalizer identity TBD *)
     Texts.WriteLn(3);
   END;
 END WriteOutputFiles;

+ 12 - 0
src/compiler/RENAME-MAP.md

@@ -250,3 +250,15 @@ NATIVE: Assert/Fatal/OpSize/Operand/Interp/IsRuntim/IsRelop/OpFill/Init/
 GetByt/NextBy/NextWo/Lookah/NewLin/WriteH/WriteT/WriteA/PatchWord/
 PatchWordIndexed/WritePatch/PushBase/SetLabel/GenBlas/ExHandle/GenLabel12/
 PushIt/PopIt/PushOp/StackEnd/GenCall/NativeMain + NProc/IProc FORWARDs.
+
+## SCANNER interface abbreviations (v1.00 name-table budget, proven on hardware)
+ChangeFileExtension->ChangeExt, ExpectStringLiteral->ExpectStr,
+MakeIdentifierNode->MakeIdent, DeclareIdentifier->DeclIdent,
+TestSymbolRange40/13->TestRange40/13, CopyStringToHeap->CopyString,
+EnterModuleSymbol->EnterModSym, ExpectIdentKind->ExpectKind,
+keywordHashFunc->keyHash, charClassTable->charClass, listingEnabled->listing,
+longrealValue->lrealVal, PushWithScope->PushWith, OpenSourceFile->OpenSource,
+NeedIdentifier->NeedIdent, TestSymbolInSet->TestSet, CheckStackMark->CheckStack.
+DEF params single letters (must match MOD exactly). DEF imports trimmed to
+interface-used (SYSTEM/Compiler/Files/SymTab). Same discipline required for
+all future DEFs.

+ 51 - 50
src/compiler/SCANNER.DEF

@@ -3,12 +3,13 @@ DEFINITION MODULE SCANNER;
 FROM SYSTEM   IMPORT ADDRESS, WORD;
 FROM Compiler IMPORT RecordPtr; (* to be sure Compiler is first dependency *)
 FROM Files    IMPORT FILE;
-FROM Texts    IMPORT TEXT;
-FROM ComLine  IMPORT PromptFor;
-FROM Loader   IMPORT Call;
-FROM Doubles  IMPORT StrToDouble;
-FROM Errors   IMPORT DoError;
 FROM SymTab   IMPORT T1, StringPtr;
+(* NOTE: parameter names are single letters AND MUST MATCH the MOD exactly
+   (Turbo v1.00 rejects DEF/MOD signature mismatches, proven on hardware).
+   Texts/ComLine/Loader/Doubles/Errors intentionally NOT imported here:
+   nothing in this interface uses them (verified), the IMPLEMENTATION module
+   imports them itself, and every imported name counts against the compiler's
+   fixed import/export name table (proven by overflow experiments). *)
 
 TYPE Ext = ARRAY [0..2] OF CHAR;
      T = POINTER TO ARRAY [0..6] OF WORD;
@@ -21,58 +22,58 @@ TYPE Ext = ARRAY [0..2] OF CHAR;
      ListDesc = RECORD first: T1; ident: StringPtr END;
      TypeOfChar = [0..255];
 VAR
-    scanOptions: BITSET;
-    curChar: CHAR;
+    scanOpt: BITSET;
+    curCh: CHAR;
     codeFile: FILE;
-    curSymbol: CARDINAL;
-    isLiteral: BOOLEAN;
-    cardValue: CARDINAL;
+    curSym: CARDINAL;
+    isLit: BOOLEAN;
+    cardVal: CARDINAL;
     curNode: RecordPtr;
-    identKind: CARDINAL;
-    followSet: BITSET;
-    tokenBuffer: Buf;
-    literalType: RecordPtr;
-    scopeCursor: T1;
-    realValue: REAL;
-    sourceFile: FILE;
-    longrealValue: LONGREAL;
-    codeBuffer: ADDRESS;
+    identKd: CARDINAL;
+    follSet: BITSET;
+    tokBuf: Buf;
+    litType: RecordPtr;
+    scopeCur: T1;
+    realVal: REAL;
+    srcFile: FILE;
+    lrealVal: LONGREAL;
+    codeBuf: ADDRESS;
     codeSize: CARDINAL;
-    listingEnabled: BOOLEAN;
-    charClassTable: POINTER TO ARRAY [0..255] OF TypeOfChar;
-    tokenPos: CARDINAL;
-    tokenColumn: CARDINAL;
-    keywordHashFunc: PROCEDURE(ADDRESS, BOOLEAN):CARDINAL;
+    listing: BOOLEAN;
+    charClas: POINTER TO ARRAY [0..255] OF TypeOfChar;
+    tokPos: CARDINAL;
+    tokCol: CARDINAL;
+    keyHash: PROCEDURE(ADDRESS, BOOLEAN):CARDINAL;
 
 PROCEDURE GetSym;
-PROCEDURE NextChar;
-PROCEDURE PushWithScope;
-PROCEDURE AcceptSymbol(sym: CARDINAL): BOOLEAN;
-PROCEDURE GetStackMark(VAR mark: ADDRESS);
-PROCEDURE CheckStackMark(mark: ADDRESS);
+PROCEDURE NextCh;
+PROCEDURE PushWith;
+PROCEDURE AcceptSy(s: CARDINAL): BOOLEAN;
+PROCEDURE GetStack(VAR m: ADDRESS);
+PROCEDURE CheckStk(m: ADDRESS);
 PROCEDURE Allocate(VAR a:ADDRESS; n:CARDINAL);
-PROCEDURE ExpectSymbol(sym: CARDINAL);
-PROCEDURE TestSymbolInSet(symSet: BITSET);
-PROCEDURE TestSymbolRange40(symSet: BITSET);
-PROCEDURE TestSymbolRange13(symSet: BITSET);
-PROCEDURE NeedIdentifier;
-PROCEDURE ExpectIdentKind(kind: CARDINAL);
-PROCEDURE NewSizedNode(nodeKind:CARDINAL):ADDRESS;
-PROCEDURE NewNode(nodeKind:CARDINAL):ADDRESS;
-PROCEDURE CopyStringToHeap(VAR dest:ADDRESS; VAR src: ARRAY OF CHAR);
-PROCEDURE OpenScope(scopeChain:ADDRESS; next: ADDRESS);
-PROCEDURE MakeIdentifierNode(nodeKind: CARDINAL):ADDRESS;
-PROCEDURE DeclareIdentifier(nodeKind: CARDINAL):ADDRESS;
-PROCEDURE InsertSymbol(node: T1);
-PROCEDURE ExpectStringLiteral(VAR pattern: ARRAY OF CHAR);
-PROCEDURE FindIdent(list: List; identifier: ADDRESS; caseInsensitive: BOOLEAN):RecordPtr;
-PROCEDURE StrCmp(ptr1,ptr2: StringPtr; caseInsensitive: BOOLEAN): BOOLEAN;
+PROCEDURE ExpectSy(s: CARDINAL);
+PROCEDURE TestSet(s: BITSET);
+PROCEDURE TestR40(s: BITSET);
+PROCEDURE TestR13(s: BITSET);
+PROCEDURE NeedID;
+PROCEDURE ExpectKd(k: CARDINAL);
+PROCEDURE NewSized(k:CARDINAL):ADDRESS;
+PROCEDURE NewNode(k:CARDINAL):ADDRESS;
+PROCEDURE CopyStr(VAR d:ADDRESS; VAR s: ARRAY OF CHAR);
+PROCEDURE OpenScop(a:ADDRESS; b: ADDRESS);
+PROCEDURE MakeIden(k:CARDINAL):ADDRESS;
+PROCEDURE DeclIden(k:CARDINAL):ADDRESS;
+PROCEDURE InsertSy(n: T1);
+PROCEDURE ExpectSt(VAR p: ARRAY OF CHAR);
+PROCEDURE FindIden(l: List; i: ADDRESS; c: BOOLEAN):RecordPtr;
+PROCEDURE StrCmp(a,b: ADDRESS; c: BOOLEAN): BOOLEAN; (* v1.00: StringPtr params rejected (pointer-type mismatch); ADDRESS+overlay is codegen-identical *)
 PROCEDURE StrLen(VAR s: ARRAY OF CHAR): CARDINAL;
-PROCEDURE ChangeFileExtension(VAR fname: ARRAY OF CHAR; ext: Ext; force: BOOLEAN);
-PROCEDURE ScannerError(code: CARDINAL);
-PROCEDURE EnterModuleSymbol(modName: ARRAY OF CHAR; kind: CARDINAL): CARDINAL;
-PROCEDURE InitScanner;
-PROCEDURE OpenSourceFile;
+PROCEDURE ChangeEx(VAR f: ARRAY OF CHAR; e: Ext; x: BOOLEAN);
+PROCEDURE ScanErr(c: CARDINAL);
+PROCEDURE EnterMod(m: ARRAY OF CHAR; k: CARDINAL): CARDINAL;
+PROCEDURE InitScan;
+PROCEDURE OpenSrc;
 PROCEDURE Compile;
 
 END SCANNER.

+ 335 - 328
src/compiler/SCANNER.MOD

@@ -1,12 +1,11 @@
 (* Renamed for readability. Semantics unchanged. Original identifiers: see docs/compiler/ + src/compiler/RENAME-MAP.md. *)
 IMPLEMENTATION MODULE Scanner;
 IMPORT Compiler, Files, Texts, ComLine, Loader, Doubles, Errors, SymTab, CodeGen;
-IMPORT VarAddr;
 FROM SYSTEM IMPORT ADR, MOVE, CODE, TSIZE, BYTE, OVERFLOW, REALOVERFLOW;
 FROM STORAGE IMPORT ALLOCATE,MARK,RELEASE;
 
-VAR withScopeSave: RecordPtr;
-    tokenLength: CARDINAL;
+VAR withSave: RecordPtr;
+    tokLen: CARDINAL;
 
 CONST FREEMARKER = 3AE3H;
 CONST EOT = 032C; DEL = 177C;
@@ -23,43 +22,43 @@ CONST EXPECTED = " expected, but ";
 
 (* $[+ remove procedure names *)
 
-PROCEDURE ScannerError(code: CARDINAL);
+PROCEDURE ScanErr(c: CARDINAL);
 BEGIN
-  Errors.ReportError(code);
-END ScannerError;
+  Errors.ReportError(c);
+END ScanErr;
 
-PROCEDURE ChangeFileExtension(VAR fname: ARRAY OF CHAR; ext: Ext; force: BOOLEAN);
+PROCEDURE ChangeEx(VAR f: ARRAY OF CHAR; e: Ext; x: BOOLEAN);
 VAR i: CARDINAL;
 BEGIN
   i := 0;
-  WHILE (i < HIGH(fname) - 3) AND (fname[i] <> 0C) AND (fname[i] <> '.') DO
+  WHILE (i < HIGH(f) - 3) AND (f[i] <> 0C) AND (f[i] <> '.') DO
     INC(i)
   END;
-  IF force OR (fname[i] <> '.') THEN
-    fname[i] := '.';
-    MOVE(ADR(ext), ADR(fname[i+1]), 3);
+  IF x OR (f[i] <> '.') THEN
+    f[i] := '.';
+    MOVE(ADR(e), ADR(f[i+1]), 3);
   END;
-END ChangeFileExtension;
+END ChangeEx;
 
-PROCEDURE EnterModuleSymbol(modName: ARRAY OF CHAR; kind: CARDINAL): CARDINAL;
+PROCEDURE EnterMod(m: ARRAY OF CHAR; k: CARDINAL): CARDINAL;
 VAR i: CARDINAL;
     ptr : POINTER TO SymTab.Symbol;
 BEGIN
   i := 0;
-  WHILE (i < SymTab.moduleCount) AND (SymTab.moduleTable^[i].name <> modName) DO
+  WHILE (i < SymTab.moduleCount) AND (SymTab.moduleTable^[i].name <> m) DO
     INC(i)
   END; 
   ptr := ADR(SymTab.moduleTable^[i]);
   IF i < SymTab.moduleCount THEN
-    IF ptr^.word <> kind THEN Errors.ReportErrorWithText(12, ptr^.name) END;
+    IF ptr^.word <> k THEN Errors.ReportErrorWithText(12, ptr^.name) END;
   ELSE
-    IF i > 15 THEN ScannerError(84) END;
-    ptr^.name := modName;
-    ptr^.word := kind;
+    IF i > 15 THEN ScanErr(84) END;
+    ptr^.name := m;
+    ptr^.word := k;
     INC(SymTab.moduleCount);
   END;
   RETURN i
-END EnterModuleSymbol;
+END EnterMod;
 
 PROCEDURE Allocate(VAR a:ADDRESS; n:CARDINAL); (* was in Z80 code *)
 BEGIN
@@ -72,25 +71,25 @@ BEGIN
 
 END Allocate;
 
-PROCEDURE GetStackMark(VAR mark: ADDRESS);
+PROCEDURE GetStack(VAR m: ADDRESS);
 BEGIN
-  mark := stackLimit - 60;
-END GetStackMark;
+  m := stackLimit - 60;
+END GetStack;
 
-PROCEDURE CheckStackMark(mark: ADDRESS);
+PROCEDURE CheckStk(m: ADDRESS);
 BEGIN 
-  stackLimit := mark + 60;
-  mark^ := FREEMARKER;
-END CheckStackMark;
+  stackLimit := m + 60;
+  m^ := FREEMARKER;
+END CheckStk;
 
 (* proc 22: find identifier in keyword list *)
-PROCEDURE FindIdent(list: List; identifier: ADDRESS; caseInsensitive: BOOLEAN): RecordPtr;
+PROCEDURE FindIden(l: List; i: ADDRESS; c: BOOLEAN): RecordPtr;
 (* original was in Z80 code *)
 VAR current: T1;
 BEGIN
-  current := list^.first;
+  current := l^.first;
   WHILE current <> NIL DO
-    IF StrCmp(identifier, current^.link1, caseInsensitive) THEN 
+    IF StrCmp(i, current^.link1, c) THEN 
       RETURN ADDRESS(current)
     END;
     current := current^.link0;
@@ -98,17 +97,23 @@ BEGIN
   RETURN NIL;
 
 (* padding to compensate for different length *)
-  caseInsensitive := NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT
-    NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT caseInsensitive
-END FindIdent;
-
-(* proc 23: original was in Z80 code, removed caseInsensitive comparison *)
-PROCEDURE StrCmp(ptr1, ptr2: StringPtr; caseInsensitive: BOOLEAN):BOOLEAN;
-BEGIN
-  WHILE ptr1^[0] = ptr2^[0] DO
-    IF ptr1^[0] = 0C THEN RETURN TRUE END;
-    ptr1 := ADDRESS(ptr1)+1;
-    ptr2 := ADDRESS(ptr2)+1;
+  c := NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT
+    NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT c
+END FindIden;
+
+(* original was in Z80 code; the decompiled StringPtr-param form is rejected
+   by v1.00 at the FindIden call site (pointer-type mismatch). ADDRESS
+   params with a local byte-overlay generate identical indexed-byte code.
+   Case handling: none (as decompiled — c unused). *)
+TYPE ByteVec = POINTER TO ARRAY [0..32767] OF CHAR;
+PROCEDURE StrCmp(a, b: ADDRESS; c: BOOLEAN):BOOLEAN;
+VAR x, y: ByteVec;
+BEGIN
+  x := a; y := b;
+  WHILE x^[0] = y^[0] DO
+    IF x^[0] = 0C THEN RETURN TRUE END;
+    x := ADR(x^[1]);
+    y := ADR(y^[1]);
   END;
   RETURN FALSE;
 END StrCmp;
@@ -123,134 +128,134 @@ BEGIN
   RETURN 1;  (* never return a zero length *)
 END StrLen;
 
-PROCEDURE CopyStringToHeap(VAR dest: ADDRESS; VAR src: ARRAY OF CHAR);
+PROCEDURE CopyStr(VAR d: ADDRESS; VAR s: ARRAY OF CHAR);
 VAR length: CARDINAL;
 BEGIN
-  length := StrLen(src);
-  Allocate(dest, length+1);
-  MOVE(ADR(src), dest, length);
-END CopyStringToHeap;
+  length := StrLen(s);
+  Allocate(d, length+1);
+  MOVE(ADR(s), d, length);
+END CopyStr;
 
-PROCEDURE NewNode(nodeKind:CARDINAL):ADDRESS;
+PROCEDURE NewNode(k:CARDINAL):ADDRESS;
 VAR ptr: Compiler.RecordPtr;
 BEGIN
   Allocate(ptr, 14);
-  ptr^.word4 := nodeKind;
+  ptr^.word4 := k;
   RETURN ptr
 END NewNode;
 
-PROCEDURE NewSizedNode(nodeKind:CARDINAL):ADDRESS;
+PROCEDURE NewSized(k:CARDINAL):ADDRESS;
 VAR ptr: Compiler.RecordPtr;
 BEGIN
-  IF    nodeKind <=  1 THEN Allocate(ptr, 14)
-  ELSIF nodeKind <=  6 THEN Allocate(ptr, 10)
-  ELSIF nodeKind <= 11 THEN Allocate(ptr, 12)
+  IF    k <=  1 THEN Allocate(ptr, 14)
+  ELSIF k <=  6 THEN Allocate(ptr, 10)
+  ELSIF k <= 11 THEN Allocate(ptr, 12)
   ELSE               Allocate(ptr, 16)
   END;
-  ptr^.word4 := nodeKind;
+  ptr^.word4 := k;
   RETURN ptr
-END NewSizedNode;
+END NewSized;
 
-PROCEDURE MakeIdentifierNode(nodeKind: CARDINAL): ADDRESS;
+PROCEDURE MakeIden(k: CARDINAL): ADDRESS;
 VAR ptr : Compiler.RecordPtr;
 BEGIN
-  NeedIdentifier;
-  IF ADDRESS(scopeCursor) = SymTab.currentScope THEN Errors.ReportErrorWithText(1, tokenBuffer) END;
-  ptr := NewNode(nodeKind);
-  CopyStringToHeap(ptr^.word1, tokenBuffer);
+  NeedID;
+  IF ADDRESS(scopeCur) = SymTab.currentScope THEN Errors.ReportErrorWithText(1, tokBuf) END;
+  ptr := NewNode(k);
+  CopyStr(ptr^.word1, tokBuf);
   GetSym;
   RETURN ptr
-END MakeIdentifierNode;
+END MakeIden;
 
-PROCEDURE InsertSymbol(node: SymTab.T1);
+PROCEDURE InsertSy(n: SymTab.T1);
 BEGIN
-  IF FindIdent(ADR(SymTab.currentScope^.link1), node^.link1, 9 IN scanOptions) # NIL THEN
-    Errors.ReportErrorWithText(1, node^.link1^)
+  IF FindIden(ADR(SymTab.currentScope^.link1), n^.link1, 9 IN scanOpt) # NIL THEN
+    Errors.ReportErrorWithText(1, n^.link1^)
   END;
-  node^.link0 := SymTab.currentScope^.link1;
-  SymTab.currentScope^.link1 := node;
-END InsertSymbol;
+  n^.link0 := SymTab.currentScope^.link1;
+  SymTab.currentScope^.link1 := n;
+END InsertSy;
 
-PROCEDURE DeclareIdentifier(nodeKind: CARDINAL): ADDRESS;
+PROCEDURE DeclIden(k: CARDINAL): ADDRESS;
 VAR ptr: SymTab.T1;
 BEGIN
-  ptr := MakeIdentifierNode(nodeKind);
+  ptr := MakeIden(k);
   ptr^.link0 := SymTab.currentScope^.link1;
   SymTab.currentScope^.link1 := ptr;
   RETURN ptr;
-END DeclareIdentifier;
+END DeclIden;
 
-PROCEDURE OpenScope(scopeChain:ADDRESS; next: ADDRESS);
+PROCEDURE OpenScop(a:ADDRESS; b: ADDRESS);
 BEGIN
   Allocate(SymTab.currentScope, 14);
-  SymTab.currentScope^.w0 := scopeChain;
-  SymTab.currentScope^.link1 := next;
-END OpenScope;
+  SymTab.currentScope^.w0 := a;
+  SymTab.currentScope^.link1 := b;
+END OpenScop;
 
-PROCEDURE WriteListingPrefix;
+PROCEDURE WritList;
 VAR PipeChar[034EH]: CHAR;
 BEGIN
   Texts.WriteLn(2);
-  IF listingEnabled 
+  IF listing 
   THEN Texts.WriteCard(2, CodeGen.nextEmitPos - codeSize, 4)
   ELSE Texts.SetCol(2, 4)
   END;
   Texts.WriteChar(2, PipeChar);
   Texts.WriteChar(2, ' ')
-END WriteListingPrefix;
+END WritList;
 
-PROCEDURE EchoSourceChar;
+PROCEDURE EchoChar;
 BEGIN
-  IF (ORD(curChar) + 1) MOD 256 > 32 THEN Texts.WriteChar(2, curChar); RETURN END;
-  IF curChar = LINEFEED THEN column := 0; WriteListingPrefix; RETURN END;
-  IF curChar = TAB      THEN 
+  IF (ORD(curCh) + 1) MOD 256 > 32 THEN Texts.WriteChar(2, curCh); RETURN END;
+  IF curCh = LINEFEED THEN column := 0; WritList; RETURN END;
+  IF curCh = TAB      THEN 
     REPEAT Texts.WriteChar(2," "); INC(column) UNTIL column MOD 8 = 0;
-  ELSIF (curChar < " ") AND (curChar # CR) THEN
+  ELSIF (curCh < " ") AND (curCh # CR) THEN
     Texts.WriteChar(2, "^");
-    Texts.WriteChar(2, CHR(ORD(curChar)+40H))
+    Texts.WriteChar(2, CHR(ORD(curCh)+40H))
   END;
-END EchoSourceChar;
+END EchoChar;
 
-PROCEDURE RefillBuffer;
+PROCEDURE Refill;
 VAR nbRead: CARDINAL;
 BEGIN
-  nbRead := Files.ReadBytes(sourceFile, ADR(buffer), 128);
+  nbRead := Files.ReadBytes(srcFile, ADR(buffer), 128);
   IF nbRead < 128 THEN buffer[nbRead] := EOT END;
   bufIndex := 0;
-  NextChar
-END RefillBuffer;
+  NextCh
+END Refill;
 
-PROCEDURE InitScanner;
+PROCEDURE InitScan;
 BEGIN
-  curChar  := ' ';
+  curCh  := ' ';
   column   := 0;
   bufIndex := 128;
-  IF 0 IN scanOptions THEN WriteListingPrefix END;
-  Files.NoTrailer(sourceFile)
-END InitScanner;
+  IF 0 IN scanOpt THEN WritList END;
+  Files.NoTrailer(srcFile)
+END InitScan;
 
-PROCEDURE OpenSourceFile;
+PROCEDURE OpenSrc;
 VAR nbRead: CARDINAL;
 BEGIN
-  IF NOT Files.Open(sourceFile, ComLine.inName) THEN HALT END;
-  InitScanner;
-  Files.SetPos(sourceFile, LONG((tokenPos DIV 128) * 128));
-  nbRead   := Files.ReadBytes(sourceFile, ADR(buffer), 128);
-  bufIndex := tokenPos MOD 128;
-  filePos  := tokenPos;
+  IF NOT Files.Open(srcFile, ComLine.inName) THEN HALT END;
+  InitScan;
+  Files.SetPos(srcFile, LONG((tokPos DIV 128) * 128));
+  nbRead   := Files.ReadBytes(srcFile, ADR(buffer), 128);
+  bufIndex := tokPos MOD 128;
+  filePos  := tokPos;
   GetSym
-END OpenSourceFile;
+END OpenSrc;
 
-PROCEDURE NextChar; (* original was in Z80 code *)
+PROCEDURE NextCh; (* original was in Z80 code *)
 VAR ch: CHAR;
 BEGIN
-  IF bufIndex = 128 THEN RefillBuffer
+  IF bufIndex = 128 THEN Refill
   ELSE
     ch := buffer[bufIndex];
     INC(bufIndex);
-    IF ch = EOT THEN curChar := 377C ELSE curChar := ch END;
+    IF ch = EOT THEN curCh := 377C ELSE curCh := ch END;
     INC(filePos);
-    IF 0 IN scanOptions THEN
+    IF 0 IN scanOpt THEN
       IF ch >= ' ' THEN
         INC(column);
         IF flag # 0 THEN
@@ -258,28 +263,28 @@ BEGIN
           RETURN; RETURN; (* padding *)
         END;
       END;
-      EchoSourceChar
+      EchoChar
     END;
   END;
   RETURN;
 (* padding to compensate for smaller length *)
   INC(ch); INC(ch); INC(ch); INC(ch); INC(ch); INC(ch);
   INC(ch); INC(ch); INC(ch); INC(ch); RETURN; RETURN; RETURN; RETURN;
-END NextChar;
+END NextCh;
 
 PROCEDURE GetSym;
 (* $[- keep procedure names *)
 
   (* proc 35 *)
-  PROCEDURE ParseNumber;
+  PROCEDURE ParseNum;
   VAR intPart: CARDINAL;
   VAR expVal: CARDINAL;
-  VAR curDigit: CARDINAL;
-  VAR prevDigit: CARDINAL;
+  VAR curDig: CARDINAL;
+  VAR prevDig: CARDINAL;
   VAR limit: CARDINAL;
-  VAR expAdjust: INTEGER;
+  VAR expAdj: INTEGER;
   VAR negExp: BOOLEAN;
-  VAR isDecimal : BOOLEAN;
+  VAR isDec : BOOLEAN;
   VAR isOctal: BOOLEAN;
   VAR decVal: LONGINT;
   VAR decFull: LONGINT;
@@ -313,381 +318,383 @@ PROCEDURE GetSym;
       RETURN r
     END Power10;
   
-    PROCEDURE AccumulateDigit;
+    PROCEDURE AccumDig;
     VAR digit: CARDINAL;
     BEGIN
-      IF tokenLength < 128 THEN tokenBuffer[tokenLength] := curChar; INC(tokenLength) END;
-      NextChar;
-      digit := ORD(curChar) - ORD('0');
+      IF tokLen < 128 THEN tokBuf[tokLen] := curCh; INC(tokLen) END;
+      NextCh;
+      digit := ORD(curCh) - ORD('0');
       IF digit > 9 THEN
         IF digit >= 17 THEN digit := digit - 7 ELSE digit := 16 END;
       END; (* 043C *)
-      curDigit := digit
-    END AccumulateDigit;
+      curDig := digit
+    END AccumDig;
   
   (* $[- keep procedure names *)
-  BEGIN (* ParseNumber *)
+  BEGIN (* ParseNum *)
     intPart  := 0;
     decVal := LONG(0);
-    expAdjust  := 0;
+    expAdj  := 0;
     hexVal := decVal;
     octVal := decVal;
     decFull := decVal;
-    tokenLength:= 0;
-    curDigit  := ORD(curChar) - ORD('0');
-    prevDigit  := curDigit;
+    tokLen:= 0;
+    curDig  := ORD(curCh) - ORD('0');
+    prevDig  := curDig;
     isOctal := TRUE;
-    isDecimal  := TRUE;
+    isDec  := TRUE;
     REPEAT
-      IF prevDigit > 7 THEN
+      IF prevDig > 7 THEN
         isOctal := FALSE;
-        IF prevDigit > 9 THEN isDecimal := FALSE END;
+        IF prevDig > 9 THEN isDec := FALSE END;
       END;
-      IF curDigit <= 9 THEN
-        decFull := decFull * LONG(10) + LONG(curDigit);
-        IF decFull < 3355443L THEN decVal := decFull ELSE INC(expAdjust) END;
-        IF curDigit <= 7 THEN octVal := octVal * LONG(8) + LONG(curDigit) END;
+      IF curDig <= 9 THEN
+        decFull := decFull * LONG(10) + LONG(curDig);
+        IF decFull < 3355443L THEN decVal := decFull ELSE INC(expAdj) END;
+        IF curDig <= 7 THEN octVal := octVal * LONG(8) + LONG(curDig) END;
       END; (* 04b1 *)
-      IF hexVal <= LONG(65535) THEN hexVal := hexVal * LONG(16) + LONG(curDigit) END;
-      prevDigit := curDigit;
-      AccumulateDigit;
-    UNTIL curDigit > 15;
-    literalType := Compiler.CardType;
-    IF curChar = '.' THEN
-      AccumulateDigit;
-      IF    curChar = '.' THEN curChar := DEL; DEC(tokenLength)
-      ELSIF curChar = ')' THEN curChar := ']'; DEC(tokenLength)
+      IF hexVal <= LONG(65535) THEN hexVal := hexVal * LONG(16) + LONG(curDig) END;
+      prevDig := curDig;
+      AccumDig;
+    UNTIL curDig > 15;
+    litType := Compiler.CardType;
+    IF curCh = '.' THEN
+      AccumDig;
+      IF    curCh = '.' THEN curCh := DEL; DEC(tokLen)
+      ELSIF curCh = ')' THEN curCh := ']'; DEC(tokLen)
       ELSE
-        IF NOT isDecimal THEN ScannerError(30) END;
-        literalType := Compiler.RealType;
-        WHILE curDigit <= 9 DO
+        IF NOT isDec THEN ScanErr(30) END;
+        litType := Compiler.RealType;
+        WHILE curDig <= 9 DO
           IF decVal < 3355443L THEN
-            decVal := decVal * LONG(10) + LONG(curDigit);
-            DEC(expAdjust)
+            decVal := decVal * LONG(10) + LONG(curDig);
+            DEC(expAdj)
           END; (* 0527 *)
-          AccumulateDigit;
+          AccumDig;
         END; (* 052B *)
-        IF curDigit IN {13, 14} THEN
-          IF curDigit = 13 THEN literalType := Compiler.LongrealType END;
+        IF curDig IN {13, 14} THEN
+          IF curDig = 13 THEN litType := Compiler.LongrealType END;
           expVal := 0;
-          AccumulateDigit;
-          negExp := (curChar = '-');
-          IF negExp OR (curChar = '+') THEN AccumulateDigit END;
-          IF curDigit > 9 THEN ScannerError(30) END;
+          AccumDig;
+          negExp := (curCh = '-');
+          IF negExp OR (curCh = '+') THEN AccumDig END;
+          IF curDig > 9 THEN ScanErr(30) END;
           REPEAT
-            IF expVal < 255 THEN expVal := expVal * 10 + curDigit END;
-            AccumulateDigit;
-          UNTIL curDigit > 9;
+            IF expVal < 255 THEN expVal := expVal * 10 + curDig END;
+            AccumDig;
+          UNTIL curDig > 9;
           IF negExp
-          THEN DEC(expAdjust, expVal)
-          ELSE INC(expAdjust, expVal)
+          THEN DEC(expAdj, expVal)
+          ELSE INC(expAdj, expVal)
           END;
         END; (* 0577 *)
-        IF literalType = Compiler.RealType THEN
+        IF litType = Compiler.RealType THEN
           IF decVal >= 16777216L
-          THEN realValue := FLOAT((decVal + LONG(1)) DIV LONG(2)) * 2.0
-          ELSE realValue := FLOAT(decVal)
+          THEN realVal := FLOAT((decVal + LONG(1)) DIV LONG(2)) * 2.0
+          ELSE realVal := FLOAT(decVal)
           END;
-          IF    expAdjust < 0 THEN realValue := realValue / Power10(-expAdjust)
-          ELSIF expAdjust # 0 THEN realValue := realValue * Power10(expAdjust)
+          IF    expAdj < 0 THEN realVal := realVal / Power10(-expAdj)
+          ELSIF expAdj # 0 THEN realVal := realVal * Power10(expAdj)
           END;
         ELSE
-          tokenBuffer[tokenLength] := 0C;
-          IF NOT Doubles.StrToDouble(tokenBuffer, longrealValue) THEN ScannerError(74) END;
+          tokBuf[tokLen] := 0C;
+          IF NOT Doubles.StrToDouble(tokBuf, lrealVal) THEN ScanErr(74) END;
         END;
       END;
     END; (* 05D4 *)
-    IF literalType^.word4 # 8 THEN
-      IF curChar = 'L' THEN
-        AccumulateDigit;
-        realValue := REAL(decFull);
-        literalType := Compiler.LongintType;
+    IF litType^.word4 # 8 THEN
+      IF curCh = 'L' THEN
+        AccumDig;
+        realVal := REAL(decFull);
+        litType := Compiler.LongintType;
       ELSE
         limit := 65535;
-        IF curChar = 'H' THEN AccumulateDigit; decVal := hexVal
+        IF curCh = 'H' THEN AccumDig; decVal := hexVal
         ELSE
-          IF prevDigit IN {11, 12} THEN
-            IF NOT isOctal THEN ScannerError(30) END;
+          IF prevDig IN {11, 12} THEN
+            IF NOT isOctal THEN ScanErr(30) END;
             decVal := octVal;
-            IF prevDigit = 12 THEN literalType := Compiler.CharType; limit := 255 END;
+            IF prevDig = 12 THEN litType := Compiler.CharType; limit := 255 END;
           ELSE
-            IF NOT isDecimal OR (prevDigit > 9) THEN ScannerError(30) END;
+            IF NOT isDec OR (prevDig > 9) THEN ScanErr(30) END;
             decVal := decFull;
           END;
         END; (* 062e *)
-        IF decVal > LONG(limit) THEN ScannerError(73) END;
-        cardValue := CARD(decVal);
+        IF decVal > LONG(limit) THEN ScanErr(73) END;
+        cardVal := CARD(decVal);
       END;
     END; (* 063f *)
-    IF charClassTable^[ORD(curChar)] = 10 THEN ScannerError(30) END;
+    IF charClas^[ORD(curCh)] = 10 THEN ScanErr(30) END;
   EXCEPTION
-  | OVERFLOW: ScannerError(73)
+  | OVERFLOW: ScanErr(73)
   | REALOVERFLOW: 
-      IF expAdjust >= 0 THEN ScannerError(74) END;
-      realValue := REAL(0L);
-  END ParseNumber;
+      IF expAdj >= 0 THEN ScanErr(74) END;
+      realVal := REAL(0L);
+  END ParseNum;
   
 (* $[+ remove procedure names *)
-  PROCEDURE SkipComment;
+  PROCEDURE SkipComm;
   VAR optIdx: CARDINAL;
   BEGIN
     REPEAT
       REPEAT
-        IF curChar = CHR(255) THEN ScannerError(29) END;
-        NextChar;
-        IF curChar = '(' THEN
-          REPEAT NextChar UNTIL curChar # '(';
-          IF curChar = '*' THEN SkipComment END; (* recursive call *)
+        IF curCh = CHR(255) THEN ScanErr(29) END;
+        NextCh;
+        IF curCh = '(' THEN
+          REPEAT NextCh UNTIL curCh # '(';
+          IF curCh = '*' THEN SkipComm END; (* recursive call *)
         END;
-        IF curChar = '$' THEN
-          NextChar;
-          optIdx := CARDINAL(BITSET(curChar) * {0,1,2,3,4,6}) - ORD('L');
+        IF curCh = '$' THEN
+          NextCh;
+          optIdx := CARDINAL(BITSET(curCh) * {0,1,2,3,4,6}) - ORD('L');
           IF optIdx <= 15 THEN
-            NextChar;
-            IF    curChar = '-' THEN EXCL(scanOptions, optIdx)
-            ELSIF curChar = '+' THEN INCL(scanOptions, optIdx)
+            NextCh;
+            IF    curCh = '-' THEN EXCL(scanOpt, optIdx)
+            ELSIF curCh = '+' THEN INCL(scanOpt, optIdx)
             END;
             IF optIdx = 0 THEN Texts.WriteLn(2) END;
           END;
         END; (* 06c6 *)
-      UNTIL curChar = '*';
-      REPEAT NextChar UNTIL curChar # '*';
-    UNTIL curChar = ')';
-  END SkipComment;
+      UNTIL curCh = '*';
+      REPEAT NextCh UNTIL curCh # '*';
+    UNTIL curCh = ')';
+  END SkipComm;
 
-  PROCEDURE ScanNextToken():BOOLEAN; (* original was in Z80 code *)
+  PROCEDURE ScanNext():BOOLEAN; (* original was in Z80 code *)
   VAR j: CARDINAL;
   VAR nextClass: CARDINAL;
   BEGIN
-    isLiteral := FALSE;
-    identKind := 7;
-    WHILE curChar <= ' ' DO NextChar END;
-    tokenPos := filePos - 1;
-    tokenColumn := column;
-    IF curChar < CHR(128)
-    THEN curSymbol := charClassTable^[ORD(curChar)]
-    ELSE curSymbol := 0
+    isLit := FALSE;
+    identKd := 7;
+    WHILE curCh <= ' ' DO NextCh END;
+    tokPos := filePos - 1;
+    tokCol := column;
+    IF curCh < CHR(128)
+    THEN curSym := charClas^[ORD(curCh)]
+    ELSE curSym := 0
     END;
-    IF curSymbol = 10 THEN
+    IF curSym = 10 THEN
       j := 0;
       REPEAT
-        IF j # 128 THEN tokenBuffer[j] := curChar; INC(j) END;
-        NextChar;
-        nextClass := charClassTable^[ORD(curChar)];
+        IF j # 128 THEN tokBuf[j] := curCh; INC(j) END;
+        NextCh;
+        nextClass := charClas^[ORD(curCh)];
       UNTIL (nextClass # 10) AND (nextClass # 11);
-      tokenBuffer[j] := 0C;
+      tokBuf[j] := 0C;
       RETURN TRUE
     END; (* 0730 *)
     RETURN FALSE;
     (* padding to compensate for smaller code *)
     j := j+j+j+j+j+j+j+j+j+j+j+j+j+j+j+j+j+j+j+j+j+j+j+j+j+j+j+j
-  END ScanNextToken;
+  END ScanNext;
 
-VAR tokenDone: BOOLEAN;
+VAR tokDone: BOOLEAN;
     strLen: CARDINAL;
-    ignoreCase: BOOLEAN;
+    ignCase: BOOLEAN;
     quote: CHAR;
 BEGIN
   REPEAT
-    IF ScanNextToken() THEN
-      ignoreCase := 9 IN scanOptions;
-      curSymbol := keywordHashFunc(ADR(tokenBuffer), ignoreCase);
-      IF curSymbol # 0 THEN
-        identKind := 7;
-        IF ((curSymbol = 14) OR (curSymbol = 39)) AND NOT (12 IN scanOptions) THEN
+    IF ScanNext() THEN
+      ignCase := 9 IN scanOpt;
+      curSym := keyHash(ADR(tokBuf), ignCase);
+      IF curSym # 0 THEN
+        identKd := 7;
+        IF ((curSym = 14) OR (curSym = 39)) AND NOT (12 IN scanOpt) THEN
           Errors.AskContinue(2)
         END;
         RETURN
       END; (* 0797 *)
-      scopeCursor := ADDRESS(SymTab.currentScope);
+      scopeCur := ADDRESS(SymTab.currentScope);
       REPEAT
-        curNode  := FindIdent(ADR(scopeCursor^.link1), ADR(tokenBuffer), ignoreCase);
+        curNode  := FindIden(ADR(scopeCur^.link1), ADR(tokBuf), ignCase);
         IF curNode # NIL THEN
-          literalType := ADDRESS(curNode^.word2);
-          identKind  := curNode^.word4;
-          followSet := curNode^.word3;
+          litType := ADDRESS(curNode^.word2);
+          identKd  := curNode^.word4;
+          follSet := curNode^.word3;
           RETURN
         END;
-        scopeCursor := scopeCursor^.link0;
-      UNTIL scopeCursor = NIL;
-      identKind := 0;
+        scopeCur := scopeCur^.link0;
+      UNTIL scopeCur = NIL;
+      identKd := 0;
       RETURN
     END; (* 07BA *)
-    tokenDone := TRUE;
-    CASE curSymbol OF
-    | 0 : ScannerError(31 - ORD(curChar = CHR(255)) * 2)
-    | 2 : NextChar;
-          IF    curChar = '=' THEN curSymbol := 27; NextChar
-          ELSIF curChar = ')' THEN curSymbol := 7; NextChar
+    tokDone := TRUE;
+    CASE curSym OF
+    | 0 : ScanErr(31 - ORD(curCh = CHR(255)) * 2)
+    | 2 : NextCh;
+          IF    curCh = '=' THEN curSym := 27; NextCh
+          ELSIF curCh = ')' THEN curSym := 7; NextCh
           END;
-    | 3 : NextChar;
-          IF    curChar = '.' THEN curSymbol := 4; NextChar
-          ELSIF curChar = ')' THEN curSymbol := 6; NextChar
+    | 3 : NextCh;
+          IF    curCh = '.' THEN curSym := 4; NextCh
+          ELSIF curCh = ')' THEN curSym := 6; NextCh
           END;
-    |11 : isLiteral := TRUE;
-          identKind := 1;
-          curSymbol := 0;
-          ParseNumber;
-          tokenBuffer[tokenLength] := 0C
+    |11 : isLit := TRUE;
+          identKd := 1;
+          curSym := 0;
+          ParseNum;
+          tokBuf[tokLen] := 0C
     |12 : strLen  := 0;
-          isLiteral := TRUE;
-          identKind := 1;
-          curSymbol := 0;
-          quote  := curChar;
-          NextChar;
-          WHILE curChar # quote DO
-            IF curChar = LINEFEED THEN ScannerError(28) END;
-            IF curChar = CHR(255) THEN ScannerError(29) END;
+          isLit := TRUE;
+          identKd := 1;
+          curSym := 0;
+          quote  := curCh;
+          NextCh;
+          WHILE curCh # quote DO
+            IF curCh = LINEFEED THEN ScanErr(28) END;
+            IF curCh = CHR(255) THEN ScanErr(29) END;
             IF strLen < 128 THEN
-              tokenBuffer[strLen] := curChar;
+              tokBuf[strLen] := curCh;
               INC(strLen);
             END;
-            NextChar;
+            NextCh;
           END; (* 0839 *)
-          tokenBuffer[strLen] := 0C;
-          NextChar;
-          literalType := Compiler.charArrayDesc;
+          tokBuf[strLen] := 0C;
+          NextCh;
+          litType := Compiler.charArrayDesc;
           IF strLen = 1 THEN
-            literalType := Compiler.CharType;
-            cardValue  := ORD(tokenBuffer[0]);
+            litType := Compiler.CharType;
+            cardVal  := ORD(tokBuf[0]);
           END;
     ELSE
-          NextChar;
-          CASE curSymbol OF
-          | 43:  IF curChar = '*' THEN SkipComment; NextChar; tokenDone := FALSE
-              ELSIF curChar = '.' THEN curSymbol := 44; NextChar
-              ELSIF curChar = ':' THEN curSymbol := 45; NextChar
+          NextCh;
+          CASE curSym OF
+          | 43:  IF curCh = '*' THEN SkipComm; NextCh; tokDone := FALSE
+              ELSIF curCh = '.' THEN curSym := 44; NextCh
+              ELSIF curCh = ':' THEN curSym := 45; NextCh
               END;
-          | 54:  IF curChar = '=' THEN curSymbol := 56; NextChar 
-              ELSIF curChar = '>' THEN curSymbol := 53; NextChar
+          | 54:  IF curCh = '=' THEN curSym := 56; NextCh 
+              ELSIF curCh = '>' THEN curSym := 53; NextCh
               END;
-          | 55:  IF curChar = '=' THEN curSymbol := 57; NextChar END;
+          | 55:  IF curCh = '=' THEN curSym := 57; NextCh END;
           END;
     END;
-  UNTIL tokenDone;
+  UNTIL tokDone;
 END GetSym;
 
-PROCEDURE AcceptSymbol(sym: CARDINAL): BOOLEAN;
+PROCEDURE AcceptSy(s: CARDINAL): BOOLEAN;
 BEGIN
-  IF curSymbol = sym THEN GetSym; RETURN TRUE END;
+  IF curSym = s THEN GetSym; RETURN TRUE END;
   RETURN FALSE
-END AcceptSymbol;
+END AcceptSy;
 
-PROCEDURE PushWithScope;
+PROCEDURE PushWith;
 BEGIN
-  IF identKind = 6 THEN
-    withScopeSave^.word1 := ADDRESS(curNode^.high);
-    withScopeSave^.word0 := ADDRESS(SymTab.currentScope);
-    SymTab.currentScope  := ADDRESS(withScopeSave);
+  IF identKd = 6 THEN
+    withSave^.word1 := ADDRESS(curNode^.high);
+    withSave^.word0 := ADDRESS(SymTab.currentScope);
+    SymTab.currentScope  := ADDRESS(withSave);
     GetSym;
-    ExpectSymbol(3);
-    NeedIdentifier;
-    IF scopeCursor # ADDRESS(withScopeSave) THEN Errors.ReportErrorWithText(3, tokenBuffer) END;
+    ExpectSy(3);
+    NeedID;
+    IF scopeCur # ADDRESS(withSave) THEN Errors.ReportErrorWithText(3, tokBuf) END;
     SymTab.currentScope  := SymTab.currentScope^.w0;
   END;
-END PushWithScope;
+END PushWith;
 
-PROCEDURE ExpectSymbol(sym:CARDINAL);
+PROCEDURE ExpectSy(s:CARDINAL);
 VAR expSet: BITSET;
 VAR base: CARDINAL;
 BEGIN
-  IF curSymbol = sym THEN GetSym; RETURN END;
+  IF curSym = s THEN GetSym; RETURN END;
   base := 0;
   expSet := {};
-  IF    sym >= 51 THEN base := 51
-  ELSIF sym >= 40 THEN base := 40
-  ELSIF sym >= 27 THEN base := 27
-  ELSIF sym >= 13 THEN base := 13
+  IF    s >= 51 THEN base := 51
+  ELSIF s >= 40 THEN base := 40
+  ELSIF s >= 27 THEN base := 27
+  ELSIF s >= 13 THEN base := 13
   END;
-  expSet := expSet + {sym - base};
+  expSet := expSet + {s - base};
   Errors.ReportExpectedSet(expSet, base)
-END ExpectSymbol;
+END ExpectSy;
 
-PROCEDURE TestSymbolInSet(symSet: BITSET);
+PROCEDURE TestSet(s: BITSET);
 BEGIN
-  IF NOT (curSymbol IN symSet) THEN Errors.ReportExpectedSet(symSet, 0) END;
-END TestSymbolInSet;
+  IF NOT (curSym IN s) THEN Errors.ReportExpectedSet(s, 0) END;
+END TestSet;
 
-PROCEDURE TestSymbolRange40(symSet: BITSET);
+PROCEDURE TestR40(s: BITSET);
 BEGIN
-  IF NOT ((curSymbol-40) IN symSet) THEN Errors.ReportExpectedSet(symSet, 40) END;
-END TestSymbolRange40;
+  IF NOT ((curSym-40) IN s) THEN Errors.ReportExpectedSet(s, 40) END;
+END TestR40;
 
-PROCEDURE TestSymbolRange13(symSet: BITSET);
+PROCEDURE TestR13(s: BITSET);
 BEGIN
-  IF NOT ((curSymbol-13) IN symSet) THEN Errors.ReportExpectedSet(symSet, 13) END;
-END TestSymbolRange13;
+  IF NOT ((curSym-13) IN s) THEN Errors.ReportExpectedSet(s, 13) END;
+END TestR13;
 
-PROCEDURE NeedIdentifier;
+PROCEDURE NeedID;
 BEGIN
-  IF (identKind = 7) OR isLiteral THEN
+  IF (identKd = 7) OR isLit THEN
     Errors.ShowErrorPosition('A');
     Texts.WriteString(3, "Identifier");
     Texts.WriteString(3, EXPECTED);
-    Errors.Allocate;
+    Errors.WriteFoundToken;
     Errors.AskEditOrQuit;
   END;
-END NeedIdentifier;
+END NeedID;
 
-PROCEDURE ExpectStringLiteral(VAR pattern: ARRAY OF CHAR);
+PROCEDURE ExpectSt(VAR p: ARRAY OF CHAR);
 BEGIN
-  NeedIdentifier;
-  IF StrCmp(ADR(tokenBuffer), ADR(pattern), 9 IN scanOptions) THEN GetSym; RETURN END;
-  Errors.ReportErrorWithText(9, pattern);
-END ExpectStringLiteral;
+  NeedID;
+  IF StrCmp(ADR(tokBuf), ADR(p), 9 IN scanOpt) THEN GetSym; RETURN END;
+  Errors.ReportErrorWithText(9, p);
+END ExpectSt;
 
-PROCEDURE ExpectIdentKind(kind: CARDINAL);
+PROCEDURE ExpectKd(k: CARDINAL);
 BEGIN
-  IF identKind # kind THEN
-    NeedIdentifier;
-    IF identKind = 0 THEN Errors.ReportErrorWithText(0, tokenBuffer) END;
+  IF identKd # k THEN
+    NeedID;
+    IF identKd = 0 THEN Errors.ReportErrorWithText(0, tokBuf) END;
     Errors.ShowErrorPosition('B');
-    Errors.WriteKindName(kind);
+    Errors.WriteKindName(k);
     Texts.WriteString(3, EXPECTED);
-    Errors.WriteKindName(identKind);
+    Errors.WriteKindName(identKd);
     Texts.WriteString(3, " found");
     Errors.AskEditOrQuit;
   END;
-END ExpectIdentKind;
+END ExpectKd;
 
 PROCEDURE Compile;
 
-  (* Z80 proc 40 removed, replaced by a MCode one in module VarAddr *)
-  (*
-  PROCEDURE VarAddress(VAR v: WORD):ADDRESS;
-  CODE("Z80RET")
-  END VarAddress;
-  *)
+  (* Z80 proc 40 removed in Reloaded; v1.00 rejects SYSTEM.ADR on simple
+     unstructured variables, so this open-array shim recovers the address.
+     Proven on hardware: open VAR ARRAY OF WORD accepts any variable, and
+     ADR(x) inside is legal (probe ZZ.DEF/MOD). *)
+  PROCEDURE VarAddr(VAR x: ARRAY OF WORD): ADDRESS;
+  BEGIN
+    RETURN ADR(x);
+  END VarAddr;
 
 VAR addr: ADDRESS;
     ptr       [006EH]: CARDINAL;
     console   [0072H]: BOOLEAN;
-    jmpOpcode [0074H]: CARDINAL;
-    jmpAddress[0075H]: CARDINAL;
+    jmpOpc [0074H]: CARDINAL;
+    jmpAddr[0075H]: CARDINAL;
 
 (* $[- keep procedure names *)
 
 BEGIN
-  jmpOpcode := 0C3H;
-  addr      := VarAddr.ADR(scanOptions)-6;
+  jmpOpc := 0C3H;
+  addr      := VarAddr(scanOpt)-6;
   addr      := ADDRESS(addr^) - 4;
-  jmpAddress:= addr + CARDINAL(addr^) + 3;
+  jmpAddr:= addr + CARDINAL(addr^) + 3;
   MARK(addr);
   ptr       := 0;
   console   := (ComLine.outName = "CON:");
-  listingEnabled  := FALSE;
-  tokenPos  := 0;
-  Allocate(withScopeSave, 14);
-  Compiler.InitCompiler;
-  IF sourceFile <> NIL THEN
-    Allocate(codeBuffer, 4096);
+  listing  := FALSE;
+  tokPos  := 0;
+  Allocate(withSave, 14);
+  Compiler.OpenSourceAndOutput;
+  IF srcFile <> NIL THEN
+    Allocate(codeBuf, 4096);
     Loader.Call("COMPILE");
     IF Compiler.nativeCodeRequested THEN
-      CheckStackMark(codeBuffer + CodeGen.nextEmitPos);
+      CheckStk(codeBuf + CodeGen.nextEmitPos);
       IF CodeGen.windowBase <> 0 THEN
-        MOVE(codeBuffer, codeBuffer + CodeGen.windowBase, CodeGen.nextEmitPos - CodeGen.windowBase);
+        MOVE(codeBuf, codeBuf + CodeGen.windowBase, CodeGen.nextEmitPos - CodeGen.windowBase);
         Files.SetPos(codeFile, LONG(0));
-        IF Files.ReadBytes(codeFile, codeBuffer, CodeGen.windowBase) <> CodeGen.windowBase THEN
+        IF Files.ReadBytes(codeFile, codeBuf, CodeGen.windowBase) <> CodeGen.windowBase THEN
           RAISE Files.EndError
         END;
       END;

+ 75 - 75
src/compiler/STATEMEN.MOD

@@ -125,7 +125,7 @@ BEGIN
     IF Words(curBlockNode)^[2] = NIL THEN (*{004c-004f}*)
       CodeGen.EmitMiscOp(0, (*{0051-0052} *)
         CalcMemOffset() + ORD(Express.spillFlag = 1) * 128); (*{0053-005a} shl 7 *)
-    ELSIF 8 IN Scanner.scanOptions THEN (*{005e-0062} *)
+    ELSIF 8 IN Scanner.scanOpt THEN (*{005e-0062} *)
       CodeGen.QueueConst(9); (*{0064-0065} *)
       CodeGen.QueueConst(0); (*{0067-0068} *)
       CodeGen.QueueConst(0); (*{006a-006b} *)
@@ -155,13 +155,13 @@ BEGIN
   Express.BoolCondHelper; (*{007d} parse CASE selector *)
   Express.MatchOpClass(7, 40); (*{007f-0082} *)
   selTyp := Express.curDesc.raw[0]; (*{0084-0087} FIXME: typ pun *)
-  Scanner.ExpectSymbol(41); (*{0088-008a} OF *)
+  Scanner.ExpectSy(41); (*{0088-008a} OF *)
   CodeGen.EmitSystemCall(21); (*{008c-008e} *)
   CodeGen.EmitStandardOp(15); (*{008f-0092} jump to dispatch *)
   CodeGen.OpenFixup(topFix, TRUE); (*{0094-0097} *)
   head := NIL; (*{0099-009a} *)
   tail := NIL; (*{009b-009c} *)
-  WHILE NOT (Scanner.curSymbol IN BITSET{8,10,13}) DO (*{009d-00a4} *)
+  WHILE NOT (Scanner.curSym IN BITSET{8,10,13}) DO (*{009d-00a4} *)
     armFix := CodeGen.MarkCodePos(14); (*{00a6-00aa} *)
     Express.GetTypeDesc(selTyp, ADR(lo), ADR(hi)); (*{00ac-00b1} FIXME: (dest,mode,src) roles *)
     prev := NIL; (*{00b3-00b4} *)
@@ -189,14 +189,14 @@ BEGIN
     ELSE
       head := buf; (*{00fa-00fb} *)
     END;
-    Scanner.TestSymbolInSet(BITSET{1,2}); (*{00fc-00fd} `,`/`:` *)
-    IF Scanner.AcceptSymbol(1) THEN (*{00ff-0100} `,`: another label, loop to 00ac *)
+    Scanner.TestSet(BITSET{1,2}); (*{00fc-00fd} `,`/`:` *)
+    IF Scanner.AcceptSy(1) THEN (*{00ff-0100} `,`: another label, loop to 00ac *)
     END;
     Scanner.GetSym; (*{0105} consume `:` *)
     WHILE NOT ParseStatSeqLoop(BITSET{8,10,13}) DO END; (*{0107-010b} arm body *)
     CodeGen.EmitStandardOp(20); (*{010d-010f} jump to end *)
   END;
-  IF NOT Scanner.AcceptSymbol(8) THEN (*{0111-0115} `|`: more arms loop to 009d *);
+  IF NOT Scanner.AcceptSy(8) THEN (*{0111-0115} `|`: more arms loop to 009d *);
   END;
   DEC(nestDepth); (*{0117-0119} *)
   endFix := CodeGen.InsertFixup(topFix, TRUE); (*{011a-011e} *)
@@ -215,11 +215,11 @@ BEGIN
     INC(lo); (*{0158-015a} *)
     IF head = NIL THEN END; (*{015b-015d} loop to 013c while head#NIL *)
   END;
-  IF Scanner.AcceptSymbol(10) THEN (*{015f-0160} ELSE *)
+  IF Scanner.AcceptSy(10) THEN (*{015f-0160} ELSE *)
     WHILE NOT ParseStatSeqLoop(BITSET{13}) DO END; (*{0164-0168} *)
   END;
   Scanner.GetSym; (*{0187} consume END *)
-  IF 8 IN Scanner.scanOptions THEN (*{016c-0170} range-check variant epilogue *)
+  IF 8 IN Scanner.scanOpt THEN (*{016c-0170} range-check variant epilogue *)
     CodeGen.QueueConst(13); (*{0172-0173} *)
     CodeGen.QueueConst(0); (*{0175-0176} *)
     CodeGen.QueueConst(0); (*{0178-0179} *)
@@ -266,17 +266,17 @@ BEGIN
   END;
   Express.EmitOp; (*{01d0} proc6 *)
   isInt := ORD(Express.curDesc.raw[0] = Compiler.IntType); (*{01d2-01d8} FIXME *)
-  Scanner.ExpectSymbol(27); (*{01d9-01db} `:=` *)
+  Scanner.ExpectSy(27); (*{01d9-01db} `:=` *)
   Express.BoolCondHelper; (*{01dd} lower bound *)
   Express.ConstToCard(Words(ctrl)^[0], 27); (*{01df-01e5} FIXME: ctrlDescTyp *)
   MOVE(Express.curDesc, loD, 10); (*{01e5-01e9} *)
   Express.PopExprDesc(ctrl); (*{01ea-01eb} FIXME: ADDRESS arg *)
-  Scanner.ExpectSymbol(42); (*{01ed-01ef} TO *)
+  Scanner.ExpectSy(42); (*{01ed-01ef} TO *)
   Express.BoolCondHelper; (*{01f1} upper bound *)
   Express.ConstToCard(Words(ctrl)^[0], 42); (*{01f3-01f7} *)
   MOVE(Express.curDesc, hiD, 10); (*{01f9-01fd} *)
   step := 1; (*{01fe-01ff} *)
-  IF Scanner.AcceptSymbol(29) THEN (*{0200-0204} BY *)
+  IF Scanner.AcceptSy(29) THEN (*{0200-0204} BY *)
     Express.GetConstVal; (*{0206} proc13 *)
     Express.ConstToCard(Compiler.IntType, 29); (*{0208-020c} *)
     step := Express.curDesc.raw[2]; (*{020e-0211} const step *)
@@ -303,7 +303,7 @@ BEGIN
   top := CodeGen.MarkCodePos(13); (*{0343-0347} *)
   Express.BoolCondHelper; (*{0348} *)
   Express.ConstToCard(Compiler.BooleanType, 37); (*{034a-034e} *)
-  Scanner.ExpectSymbol(30); (*{0350-0352} DO *)
+  Scanner.ExpectSy(30); (*{0350-0352} DO *)
   CodeGen.EmitStandardOp(16); (*{0354-0356} jump-if-false *)
   CodeGen.OpenFixup(fix, TRUE); (*{0358-035b} *)
   WHILE NOT ParseStatSeqLoop(BITSET{13}) DO END; (*{035d-0361} body to END *)
@@ -353,13 +353,13 @@ BEGIN
     END;
     CodeGen.emitEnabled := FALSE; (*{03bf-03c0} suppress dead arm *)
   END;
-  Scanner.ExpectSymbol(35); (*{03c2-03c4} THEN *)
+  Scanner.ExpectSy(35); (*{03c2-03c4} THEN *)
   IF NOT constCond THEN (*{03c6-03c8} *)
     CodeGen.EmitStandardOp(16); (*{03ca-03cc} jump-if-false *)
     CodeGen.OpenFixup(elseFix, TRUE); (*{03ce-03d1} *)
   END;
   WHILE NOT ParseStatSeqLoop(BITSET{10,11,13}) DO END; (*{03d3-03d7} *)
-  IF Scanner.AcceptSymbol(13) THEN (*{03d9-03dc} END: done *)
+  IF Scanner.AcceptSy(13) THEN (*{03d9-03dc} END: done *)
     IF NOT constCond THEN (*{03de-03e0} *)
       chained := ORD(CodeGen.InsertFixup(elseFix, TRUE)); (*{03e2-03e6} FIXME pun *)
     END;
@@ -372,7 +372,7 @@ BEGIN
     END;
   END;
   CodeGen.emitEnabled := savedEmit # 0; (*{0400-0405} FIXME: exact condition TBD *)
-  IF Scanner.AcceptSymbol(11) THEN (*{0407-040a} ELSIF: nested IF *)
+  IF Scanner.AcceptSy(11) THEN (*{0407-040a} ELSIF: nested IF *)
     ParseIf(); (*{040c} recursion *)
   ELSE
     Scanner.GetSym; (*{040f} consume ELSE *)
@@ -450,14 +450,14 @@ BEGIN
   saved := Express.curDesc.raw[0]; (*{04c7-04c9} FIXME: typ pun *)
   Express.MatchOpClass(1024, 38); (*{04ca-04cf} *)
   IF Words(saved)^[4] IN BITSET{2,3,5} THEN (*{04d1-04de} FIXME set TBD *)
-    Scanner.OpenScope(SymTab.currentScope, Words(saved)^[0]); (*{04d9-04dd} FIXME *)
+    Scanner.OpenScop(SymTab.currentScope, Words(saved)^[0]); (*{04d9-04dd} FIXME *)
   END;
   IF Words(Express.curDesc.raw[0])^[0] # Compiler.CardType THEN (*{04e0-04e8} FIXME *)
     Express.PushOperand(ADR(Express.curDesc)); (*{04e0-04e2} FIXME arity *)
     Express.PopExprDesc(ADR(Express.curDesc)); (*{04ea-04ec} FIXME *)
   END;
   MOVE(Words(SymTab.currentScope)^[2], ADR(Express.curDesc), 10); (*{04ee-04f5} FIXME *)
-  Scanner.ExpectSymbol(30); (*{04f6-04f8} DO *)
+  Scanner.ExpectSy(30); (*{04f6-04f8} DO *)
   WHILE NOT ParseStatSeqLoop(BITSET{13}) DO END; (*{04fa-04fe} body to END *)
   SymTab.currentScope := Words(SymTab.currentScope)^[0]; (*{0500-0503} FIXME pun *)
   Scanner.GetSym; (*{0505} consume END *)
@@ -468,19 +468,19 @@ END ParseWith;
 PROCEDURE ParseReturn;
 VAR info: CARDINAL;
 BEGIN
-  Scanner.PushWithScope; (*{050b} *)
+  Scanner.PushWith; (*{050b} *)
   IF caseActive = 0 THEN (*{050d-050f} *)
-    Scanner.ExpectIdentKind(2); (*{0511-0512} *)
+    Scanner.ExpectKd(2); (*{0511-0512} *)
   END;
-  IF Scanner.identKind = 2 THEN (*{0514-0518} function context *)
-    IF 1 IN Scanner.followSet THEN (*{051a-051e} *)
+  IF Scanner.identKd = 2 THEN (*{0514-0518} function context *)
+    IF 1 IN Scanner.follSet THEN (*{051a-051e} *)
       info := Words(Scanner.curNode)^[6] + 2; (*{0520-0525} *)
     ELSE
-      info := ORD(1 IN Scanner.followSet) - ORD(6 IN Scanner.followSet); (*{0528-052e} *)
+      info := ORD(1 IN Scanner.follSet) - ORD(6 IN Scanner.follSet); (*{0528-052e} *)
     END;
     CodeGen.QueueConst(Words(Scanner.curNode)^[5] + info * 256); (*{052f-0536} *)
     Scanner.GetSym; (*{0538} *)
-    IF Scanner.AcceptSymbol(1) THEN (*{053a-053d} `,` before value *)
+    IF Scanner.AcceptSy(1) THEN (*{053a-053d} `,` before value *)
       Express.BoolCondHelper; (*{053f} *)
       Express.ParseSelector(FALSE, Compiler.charArrayDesc, NIL); (*{0541-0546} FIXME: 39 dropped *)
     ELSE
@@ -506,13 +506,13 @@ PROCEDURE ParseStatSeqLoop(stop: BITSET): BOOLEAN;
 (* ~proc4: every driver is REPEAT proc4(set) UNTIL TRUE with empty body,
    so proc4 parses ONE step; 14 pre-emption for nested CASE. *)
 BEGIN
-  IF Scanner.curSymbol IN stop THEN RETURN TRUE END;
-  IF Scanner.curSymbol = 14 THEN (* CaseSym FIXME *)
+  IF Scanner.curSym IN stop THEN RETURN TRUE END;
+  IF Scanner.curSym = 14 THEN (* CaseSym FIXME *)
     ParseCaseTail;
   ELSE
     ParseStatement;
   END;
-  RETURN Scanner.curSymbol IN stop;
+  RETURN Scanner.curSym IN stop;
 END ParseStatSeqLoop;
 
 PROCEDURE EmitJumpFixup;
@@ -533,10 +533,10 @@ BEGIN
   saveNest := nestDepth; (*{056b} *)
   saveLoop := exitDepth; (*{056d} FIXME: group wrote loopExitMark *)
   saveScope := SymTab.currentScope; (*{056f} FIXME: ADDRESS pun *)
-  IF Scanner.curSymbol = 0 THEN GOTO identLed END; (*{0572} *)
-  IF Scanner.curSymbol IN BITSET{8..14} THEN GOTO done END; (*{0577} *)
-  Express.CentralError((121 <= Scanner.curSymbol) AND (Scanner.curSymbol <= 130), 20); (*{0580} *)
-  kw := Scanner.curSymbol; (*{058c} *)
+  IF Scanner.curSym = 0 THEN GOTO identLed END; (*{0572} *)
+  IF Scanner.curSym IN BITSET{8..14} THEN GOTO done END; (*{0577} *)
+  Express.CentralError((121 <= Scanner.curSym) AND (Scanner.curSym <= 130), 20); (*{0580} *)
+  kw := Scanner.curSym; (*{058c} *)
   Scanner.GetSym; (*{058f} *)
   CASE kw OF (*{0591-05a6} default (125) -> ParseFor *)
     121: ParseLoop
@@ -552,22 +552,22 @@ BEGIN
   END;
   GOTO done;
 identLed:
-  Scanner.PushWithScope; (*{05c4} *)
-  IF Scanner.identKind = 4 THEN (*{05c6} proc call *)
+  Scanner.PushWith; (*{05c4} *)
+  IF Scanner.identKd = 4 THEN (*{05c6} proc call *)
     Express.ParseDesignatorTail; (*{05cc} *)
-    IF Scanner.AcceptSymbol(43) THEN (*{05d0} '(' *)
+    IF Scanner.AcceptSy(43) THEN (*{05d0} '(' *)
       Express.MatchOpClass(512, 43); (*{05d9} *)
       Express.CentralError(Express.curDesc.raw[2] = 0, 61); (*{05db} FIXME: scratch2 TBD *)
       Express.StoreOperand; (* proc19 *) (*{05e9?} *)
     ELSE
-      Scanner.ExpectSymbol(27); (*{05e9} ':=' *)
+      Scanner.ExpectSy(27); (*{05e9} ':=' *)
       Express.ParseAssignment; (*{05f2?} FIXME: group wrote ParseAssignRhs=proc17 *)
     END;
-  ELSIF Scanner.identKind = 5 THEN (*{05f2} *)
-    Express.CentralError(Scanner.literalType = NIL, 61); (*{05f8} FIXME: pun *)
+  ELSIF Scanner.identKd = 5 THEN (*{05f2} *)
+    Express.CentralError(Scanner.litType = NIL, 61); (*{05f8} FIXME: pun *)
     Express.LoadOperand; (* proc18 *) (*{05e9?} *)
-  ELSIF Scanner.identKind = 0 THEN (*{0604} *)
-    Errors.ReportErrorWithText(128, Scanner.tokenBuffer); (*{0609} *)
+  ELSIF Scanner.identKd = 0 THEN (*{0604} *)
+    Errors.ReportErrorWithText(128, Scanner.tokBuf); (*{0609} *)
   ELSE
     Errors.ReportError(21); (*{0612} *)
   END;
@@ -584,14 +584,14 @@ VAR
   saveCode: CARDINAL;
   savePool: CARDINAL;
 BEGIN
-  saveOpts := Scanner.scanOptions; (*{0636} *)
-  savePos := Scanner.tokenPos; (*{0639} FIXME: group wrote word25 *)
-  Scanner.GetStackMark(mark); (*{063d} *)
+  saveOpts := Scanner.scanOpt; (*{0636} *)
+  savePos := Scanner.tokPos; (*{0639} FIXME: group wrote word25 *)
+  Scanner.GetStack(mark); (*{063d} *)
   saveCode := CodeGen.nextEmitPos; (*{0641} *)
   savePool := SymTab.stringPoolPtr; (*{0644} *)
   EmitJumpFixup; (* ~proc15 *) (*{0647} *)
-  Scanner.TestSymbolInSet(follow + BITSET{9}); (*{0648} entry assert *)
-  IF Scanner.AcceptSymbol(9) THEN (* guarded-seq introducer *)
+  Scanner.TestSet(follow + BITSET{9}); (*{0648} entry assert *)
+  IF Scanner.AcceptSy(9) THEN (* guarded-seq introducer *)
     REPEAT UNTIL ParseStatSeqLoop(follow) END; (*{0654} *)
   END;
   RETURN TRUE;
@@ -610,16 +610,16 @@ BEGIN
   caseActive := 1; (*{0685} *)
   cnt := 0; (*{0687} *)
   tab := 0; (*{0689} *)
-  IF NOT (Scanner.curSymbol IN BITSET{8,10,13}) THEN (*{068b} *)
+  IF NOT (Scanner.curSym IN BITSET{8,10,13}) THEN (*{068b} *)
     fix1 := CodeGen.MarkCodePos(15); (*{0694} *)
-    Scanner.PushWithScope; (*{0699} *)
-    Scanner.ExpectIdentKind(2); (*{069b} *)
+    Scanner.PushWith; (*{0699} *)
+    Scanner.ExpectKd(2); (*{069b} *)
     LOOP
       Scanner.Allocate(labelAddr, 6); (*{06a0} FIXME: operand slots TBD *)
-      IF 1 IN Scanner.followSet THEN (* const-label class *)
+      IF 1 IN Scanner.follSet THEN (* const-label class *)
         step := Words(Scanner.curNode)^[0] + 2; (*{06a5?} FIXME *)
       ELSE
-        step := 1 - ORD(6 IN Scanner.followSet);
+        step := 1 - ORD(6 IN Scanner.follSet);
       END;
       WHILE tab <> 0 DO
         Express.CentralError(Words(tab)^[1] = Words(tab)^[1], 47); (*{06cd} FIXME: dup-label slots TBD *)
@@ -627,17 +627,17 @@ BEGIN
       END;
       INC(cnt);
       Scanner.GetSym;
-      Scanner.TestSymbolInSet(BITSET{1,2}); (*{06e0} *)
-      IF NOT Scanner.AcceptSymbol(1) THEN EXIT END; (*{06e3} *)
+      Scanner.TestSet(BITSET{1,2}); (*{06e0} *)
+      IF NOT Scanner.AcceptSy(1) THEN EXIT END; (*{06e3} *)
     END;
     Scanner.GetSym;
     REPEAT UNTIL ParseStatSeqLoop(BITSET{8,10,13}) END; (*{06eb} arm seq *)
     SyncToStatStart; (* ~proc3 *)
   END;
-  IF NOT Scanner.AcceptSymbol(8) THEN GOTO noMoreArms END; (*{06f2} '|' *)
+  IF NOT Scanner.AcceptSy(8) THEN GOTO noMoreArms END; (*{06f2} '|' *)
   GOTO caseLoop; (* back to {068b} FIXME: restructure to LOOP *)
 noMoreArms:
-  elseSeen := ORD(Scanner.AcceptSymbol(10)); (*{06f8} ELSE FIXME pun *)
+  elseSeen := ORD(Scanner.AcceptSy(10)); (*{06f8} ELSE FIXME pun *)
   IF elseSeen # 0 THEN
     INC(cnt);
     fix1 := CodeGen.MarkCodePos(15);
@@ -663,9 +663,9 @@ BEGIN
   WHILE node # NIL DO (*{073a} *)
     IF NOT (0 IN Words(node)^[3]) THEN GOTO advance END; (*{073e} FIXME pun *)
     IF 5 IN Words(node)^[3] THEN (*{0745} *)
-      Scanner.FindIdent(SymTab.currentScope, node, 9 IN Scanner.scanOptions); (*{074b} FIXME: group wrote Proc22 6-push id-check; arity TBD *)
-      IF Scanner.FindIdent(SymTab.currentScope, node, 9 IN Scanner.scanOptions) = node THEN
-        Errors.ReportErrorWithText(128, Scanner.tokenBuffer); (*{0758} FIXME: raw (5, node, s1, 128) *)
+      Scanner.FindIden(SymTab.currentScope, node, 9 IN Scanner.scanOpt); (*{074b} FIXME: group wrote Proc22 6-push id-check; arity TBD *)
+      IF Scanner.FindIden(SymTab.currentScope, node, 9 IN Scanner.scanOpt) = node THEN
+        Errors.ReportErrorWithText(128, Scanner.tokBuf); (*{0758} FIXME: raw (5, node, s1, 128) *)
       END;
       GOTO advance;
     END;
@@ -732,7 +732,7 @@ VAR f: CARDINAL; n: CARDINAL; saveHeap: ADDRESS;
 BEGIN
   MARK(saveHeap);
   CodeGen.EmitMiscOp(3, ORD(Express.spillFlag = 1));
-  Files.FindFileOnDrives(f, Scanner.tokenBuffer, "COM"); (*{0863?} FIXME: raw (addr-2, buf, 128) *)
+  Files.FindFileOnDrives(f, Scanner.tokBuf, "COM"); (*{0863?} FIXME: raw (addr-2, buf, 128) *)
   n := 0;
   REPEAT
     CodeGen.Emit1(0); (* FIXME: bodyL5 byte; Files.FileProc09 TBD *)
@@ -750,34 +750,34 @@ BEGIN
   curBlockNode := tag; (*{08a6} *)
   Express.spillTop := SymTab.stringPoolPtr; (*{08a8} FIXME: group wrote spillTop *)
   nestDepth := 0; exitDepth := 0;
-  Scanner.listingEnabled := TRUE; (*{08b8?} FIXME: group wrote word23 *)
+  Scanner.listing := TRUE; (*{08b8?} FIXME: group wrote word23 *)
   caseActive := 0; exitEmitted := 0;
   Scanner.codeSize := CodeGen.nextEmitPos; (*{08b8} FIXME: group wrote word22 *)
-  wasVar := ORD(Scanner.identKind = 5); (*{08bd} *)
-  nonEmpty := ORD(Scanner.curSymbol = 23); (*{08c2} body-lead FIXME *)
+  wasVar := ORD(Scanner.identKd = 5); (*{08bd} *)
+  nonEmpty := ORD(Scanner.curSym = 23); (*{08c2} body-lead FIXME *)
   IF nonEmpty # 0 THEN
     Scanner.GetSym;
-    WHILE NOT Scanner.AcceptSymbol(9) DO Scanner.GetSym END; (*{08cd} skip past BEGIN *)
-    nonEmpty := ORD(Scanner.curSymbol <> 13);
+    WHILE NOT Scanner.AcceptSy(9) DO Scanner.GetSym END; (*{08cd} skip past BEGIN *)
+    nonEmpty := ORD(Scanner.curSym <> 13);
   END;
   needEpilogue := nonEmpty; (*{08d8} *)
   IF (Words(curBlockNode)^[4] = 5) AND (Express.spillFlag = 0) THEN (*{08da} *)
     CodeGen.EmitExtCall3(3, curBlockNode, CalcMemOffset()); (*{08e0} FIXME: 3rd arg BYTEAt TBD *)
     IF Compiler.rangeCheckEnabled THEN CodeGen.OpenFixup(fix, TRUE) END; (*{08ea} *)
-    IF 15 IN Scanner.scanOptions THEN CodeGen.Emit1(255) (*{08f3} *)
+    IF 15 IN Scanner.scanOpt THEN CodeGen.Emit1(255) (*{08f3} *)
     ELSE
-      EmitNameHash(Scanner.tokenBuffer); (*{08ff} FIXME: raw (g6, s1, 128) *)
+      EmitNameHash(Scanner.tokBuf); (*{08ff} FIXME: raw (g6, s1, 128) *)
       CodeGen.EmitWord(0);
     END;
     Scanner.codeSize := CodeGen.nextEmitPos; (*{0908} FIXME *)
     IF wasVar # 0 THEN
       Scanner.GetSym;
-      Scanner.ExpectSymbol(43); (*{0912} '(' *)
-      Express.CentralError(Scanner.isLiteral AND (Scanner.literalType = Compiler.CharType), 33); (*{0916} *)
+      Scanner.ExpectSy(43); (*{0912} '(' *)
+      Express.CentralError(Scanner.isLit AND (Scanner.litType = Compiler.CharType), 33); (*{0916} *)
       EmitComBytes; (* nested proc19 *)
       Scanner.GetSym;
-      Scanner.ExpectSymbol(5); (*{0927} ')' *)
-      fix := ORD(Scanner.AcceptSymbol(9)); (*{092b} FIXME pun *)
+      Scanner.ExpectSy(5); (*{0927} ')' *)
+      fix := ORD(Scanner.AcceptSy(9)); (*{092b} FIXME pun *)
     ELSE
       CodeGen.EmitStandardOp(22);
       CodeGen.Emit1(255);
@@ -789,7 +789,7 @@ BEGIN
       CloseBlockChain(SymTab.currentScope); (*{094c} FIXME: ADDRESS pun *)
       IF nonEmpty # 0 THEN REPEAT UNTIL ParseStatSeqLoop(BITSET{13,14}) END END; (*{0951} *)
       SyncToStatStart;
-      IF Scanner.AcceptSymbol(14) THEN ParseCaseTail END; (*{095c} *)
+      IF Scanner.AcceptSy(14) THEN ParseCaseTail END; (*{095c} *)
       IF Express.spillFlag <> 0 THEN (*{0962} *)
         CodeGen.PokeCodeByte(SymTab.stringPoolPtr - 255, Scanner.codeSize + 1); (* FIXME *)
       END;
@@ -809,19 +809,19 @@ BEGIN
     END;
   END;
   IF Compiler.rangeCheckEnabled THEN fix := ORD(CodeGen.InsertFixup(fix, FALSE)) END; (*{09ab} FIXME pun *)
-  Scanner.listingEnabled := FALSE; (* FIXME: group wrote word23 *)
-  Scanner.ExpectSymbol(13); (*{09b8} END *)
-  Scanner.ExpectStringLiteral(Scanner.tokenBuffer); (*{09bb} FIXME: group wrote Proc21; END-name match TBD *)
+  Scanner.listing := FALSE; (* FIXME: group wrote word23 *)
+  Scanner.ExpectSy(13); (*{09b8} END *)
+  Scanner.ExpectSt(Scanner.tokBuf); (*{09bb} FIXME: group wrote Proc21; END-name match TBD *)
   IF (Words(curBlockNode)^[4] = 5) AND (Express.spillFlag = 0) THEN (*{09c2} *)
-    Scanner.TestSymbolInSet(BITSET{3}); (* '.' module end *)
+    Scanner.TestSet(BITSET{3}); (* '.' module end *)
   ELSE
-    Scanner.TestSymbolInSet(BITSET{9});
+    Scanner.TestSet(BITSET{9});
   END;
-  IF (NOT Compiler.rangeCheckEnabled) AND (0 IN Scanner.scanOptions) THEN (*{09d7} *)
+  IF (NOT Compiler.rangeCheckEnabled) AND (0 IN Scanner.scanOpt) THEN (*{09d7} *)
     Texts.WriteString(3, "----- Size = "); (* FIXME: Texts.proc09 idiom *)
     Texts.WriteCard(3, CodeGen.nextEmitPos - Scanner.codeSize, 0); (* FIXME: Texts.proc11 *)
   END;
-  IF 4 IN Scanner.scanOptions THEN (*{0a02} *)
+  IF 4 IN Scanner.scanOpt THEN (*{0a02} *)
     Loader.Call("PRINTCOD"); (* FIXME: +CARDINAL 7 *)
   END;
 END ParseBeginBlock;

+ 8 - 28
src/compiler/SYMTAB.DEF

@@ -1,11 +1,10 @@
-(* Renamed for readability. Semantics unchanged where upstream existed.
-   EXPANDED for SYMTAB.MOD draft v1: upstream SYMTAB.DEF only declared words
-   2..9, but symtab.txt uses words 7,8,10..27. Words 7,8 renamed in place
-   (same slot type); words 10..27 appended with MCode word numbers in comments.
-   Signatures for the 8 exported procs filled from the draft bodies; all
-   marked (*draft*) until the MCD diff confirms them. *)
+(* Renamed for readability. Signatures for the 8 exported procs filled from
+   the draft bodies; all marked (*draft*) until the MCD diff confirms them.
+   Words 10..27 live in the IMPLEMENTATION module (proven: exporting them
+   overflows the compiler name table; the upstream DEF shape with words 2..9
+   is the true interface). *)
 DEFINITION MODULE SYMTAB;
-FROM SYSTEM IMPORT ADDRESS, WORD;
+FROM SYSTEM IMPORT ADDRESS, WORD, BYTE;
 IMPORT Files;
 
 TYPE Ext = ARRAY [0..2] OF CHAR;
@@ -34,29 +33,10 @@ VAR
     (* word 6 *) moduleTable: POINTER TO ARRAY [0..99] OF Symbol;
     (* word 7 *) modStage: POINTER TO ARRAY [0..16] OF Symbol;
     (* word 8 *) scopeChain: POINTER TO ARRAY [0..16] OF T1;
-    (* word 9 *) currentScope: POINTER TO RECORD w0:WORD; link1: T1 END;
-    (* word 10 *) ownNamePtr: ADDRESS;
-    (* word 11 *) stageSpare11: CARDINAL; (* use TBD; no evidence yet *)
-    (* word 12 *) symHeapBase: ADDRESS;
-    (* word 13 *) scopeHeapBase: ADDRESS;
-    (* word 14 *) strHeapBase: ADDRESS;
-    (* word 15 *) symTop: CARDINAL;
-    (* word 16 *) scopeTop: CARDINAL;
-    (* word 17 *) strTop: CARDINAL;
-    (* word 18 *) exportHead: CARDINAL;
-    (* word 19 *) stageNameTotal: CARDINAL;
-    (* word 20 *) savedSymInfo: CARDINAL;
-    (* word 21 *) savedStrInfo: CARDINAL;
-    (* word 22 *) symCap: CARDINAL;
-    (* word 23 *) scopeCap: CARDINAL;
-    (* word 24 *) strCap: CARDINAL;
-    (* word 25 *) stageFlag: CARDINAL; (* B: nestedProcFlag; C: compileActive *)
-    (* word 26 *) stageSpare26: CARDINAL; (* use TBD; no evidence yet *)
-    (* word 27 *) checksumTemp: CARDINAL;
-
+    (* word 9 *) currentScope: POINTER TO RECORD w0:ADDRESS; link1: T1 END; (* w0 holds scope-chain addresses (ParseWith pop, OpenScope link); WORD mistyping fails v1.00 *)
 (*draft*) PROCEDURE CompileDispatch(VAR wsp: ARRAY OF BYTE; impl: BOOLEAN; prog: BOOLEAN);
 (*draft*) PROCEDURE DefineDefinitionModule(isImpl: CARDINAL);
-(*draft*) PROCEDURE DefineProgramModule(fromSeen: CARDINAL);
+(*draft*) PROCEDURE DefineProgramModule(setAddr: ADDRESS; tag: CARDINAL); (*FIXME: audit UNKNOWN — param1 dead in body; roles TBD*)
 (*draft*) PROCEDURE InitSymbolTables(opt: BITSET; imports: T1; modName: T1);
 (*draft*) PROCEDURE BuildBitsetConst(VAR name: ARRAY OF CHAR): BOOLEAN;
 (*draft*) PROCEDURE SaveSymbolFile;

+ 92 - 69
src/compiler/SYMTAB.MOD

@@ -42,6 +42,29 @@ FROM SYSTEM IMPORT ADDRESS, ADR, MOVE;
    kind <= 1, 10 for kind <= 6, 12 for kind <= 11, else 16). *)
 TYPE Words = POINTER TO ARRAY [0..7] OF CARDINAL;
 
+(* Implementation-module globals (words 10..27). NOT exported: putting them
+   in the DEF overflows the compiler name table (proven on real hardware).
+   Numbering: DEF vars occupy words 2..9, these follow. *)
+VAR
+    (* word 10 *) ownNamePtr: ADDRESS;
+    (* word 11 *) stageSpare11: CARDINAL; (* use TBD *)
+    (* word 12 *) symHeapBase: ADDRESS;
+    (* word 13 *) scopeHeapBase: ADDRESS;
+    (* word 14 *) strHeapBase: ADDRESS;
+    (* word 15 *) symTop: CARDINAL;
+    (* word 16 *) scopeTop: CARDINAL;
+    (* word 17 *) strTop: CARDINAL;
+    (* word 18 *) exportHead: CARDINAL;
+    (* word 19 *) stageNameTotal: CARDINAL;
+    (* word 20 *) savedSymInfo: CARDINAL;
+    (* word 21 *) savedStrInfo: CARDINAL;
+    (* word 22 *) symCap: CARDINAL;
+    (* word 23 *) scopeCap: CARDINAL;
+    (* word 24 *) strCap: CARDINAL;
+    (* word 25 *) stageFlag: CARDINAL; (* nestedProcFlag / compileActive readings *)
+    (* word 26 *) stageSpare26: CARDINAL; (* use TBD *)
+    (* word 27 *) checksumTemp: CARDINAL;
+
 (* 14-byte symbol-heap entry = 7 words (group C names). *)
 TYPE SymEntryPtr = POINTER TO SymEntry;
      SymEntry = RECORD
@@ -208,7 +231,7 @@ PROCEDURE GetName(VAR name: ADDRESS; off: CARDINAL);
 (* proc21 @0268 — inverse of NewString: heap copy of pooled string *)
 BEGIN
   IF off <> 0 THEN (*{/*026a*/}*)
-    Scanner.CopyStringToHeap(name, StringPtr(strHeapBase + off)^); (*{/*026e*/}*)
+    Scanner.CopyStr(name, StringPtr(strHeapBase + off)^); (*{/*026e*/}*)
   ELSE
     name := NIL; (*{/*027b*/}*)
   END;
@@ -274,9 +297,9 @@ BEGIN
   e := Words(scopeHeapBase + 16 * idx); (*{/*028a*/}*)
   node := T1(e^[1]); (*{/*0290*/}*)
   IF node <> NIL THEN RETURN END; (*{/*0294*/}*)
-  (* Allocator size classes exact: Scanner.NewSizedNode(kind) =
+  (* Allocator size classes exact: Scanner.NewSized(kind) =
      14 bytes for kind <= 1, 10 for kind <= 6, 12 for kind <= 11, else 16. *)
-  new := Scanner.NewSizedNode(e^[4]); (*{/*0299*/}*)
+  new := Scanner.NewSized(e^[4]); (*{/*0299*/}*)
   nw := Words(new);
   e^[1] := CARDINAL(new); (* memoize {/*029e*/} *)
   node := new; (*{/*02a1*/}*)
@@ -354,7 +377,7 @@ BEGIN
   GetName(nm, sentry^[1]); (* heap copy of name {/*0316*/} *)
   nw^[1] := CARDINAL(nm);
   nmt := nm;
-  existing := Scanner.FindIdent(Scanner.List(scope), nm, 9 IN Scanner.scanOptions);
+  existing := Scanner.FindIden(Scanner.List(scope), nm, 9 IN Scanner.scanOpt);
   (* SCANNER.proc22 + scanOptions {/*031f*/} *)
   IF (existing <> NIL) AND NOT (5 IN Compiler.RecordPtr(existing)^.word3) THEN
     (* FIXME: word3 access needs Compiler.Record layout; original reads the
@@ -374,7 +397,7 @@ BEGIN
     nw^[5] := CARDINAL(nm2);
   ELSIF sentry^[4] >= 5 THEN (*{/*037b*/}*)
     IF existing = NIL THEN (*{/*0381*/}*)
-      Scanner.GetStackMark(mark); (*{/*0385*/}*)
+      Scanner.GetStack(mark); (*{/*0385*/}*)
       nw^[6] := 0; (*{/*0389*/}*)
       UnlinkScope(ADR(nw^[6]), sentry^[6]); (*{/*038c*/}*)
       IF (sentry^[4] = 5) AND (stageFlag <> 0) THEN (*{/*0393*/} global25 *)
@@ -411,7 +434,7 @@ BEGIN
     CodeGen.FlushCodeWindow;
   END;
   freeBytes := 4096 - (CodeGen.nextEmitPos - CodeGen.windowBase); (*{/*03ee*/}*)
-  symHeapBase := Scanner.codeBuffer + CodeGen.nextEmitPos - CodeGen.windowBase; (*{/*03f8*/}*)
+  symHeapBase := Scanner.codeBuf + CodeGen.nextEmitPos - CodeGen.windowBase; (*{/*03f8*/}*)
   symCap := freeBytes DIV 28 - 1; (*{/*0402*/} DIV (2*14) *)
   scopeHeapBase := symHeapBase + (symCap + 1) * 14; (*{/*040a*/}*)
   scopeCap := freeBytes DIV 64 + 7; (*{/*0412*/} DIV (4 SHL 4) *)
@@ -524,7 +547,7 @@ VAR
     WHILE idx # 0 DO
       e := symHeapBase + idx * 14; (*{/*0559*/}*)
       IF Scanner.StrCmp(StringPtr(symHeapBase + strHeapBase + e^.nameOff)^,
-                        StringPtr(name)^, 9 IN Scanner.scanOptions) THEN (*{/*0568*/}*)
+                        StringPtr(name)^, 9 IN Scanner.scanOpt) THEN (*{/*0568*/}*)
         RETURN idx;
       END;
       idx := e^.link; (*{/*0570*/}*)
@@ -566,7 +589,7 @@ VAR
 
 BEGIN
   imp := importRec;
-  caseFlag := 9 IN Scanner.scanOptions;
+  caseFlag := 9 IN Scanner.scanOpt;
   importEvery := 10 IN imp^.flags;
   sysAdr := ADDRESS(Compiler.systemModule); sysImp := sysAdr;
   IF Scanner.StrCmp(StringPtr(imp^.name)^, StringPtr(sysImp^.name)^, caseFlag) THEN (*{/*05e9*/}*)
@@ -624,11 +647,11 @@ BEGIN
     ImportOne(ADR(imp^.anchor), exportHead); (* NOTE order: see ImportOne note *)
   ELSE
     REPEAT
-      Scanner.NeedIdentifier; (*{/*06d0*/}*)
-      findIdx := FindExport(exportHead, ADR(Scanner.tokenBuffer)); (*{/*06d2*/}*)
+      Scanner.NeedID; (*{/*06d0*/}*)
+      findIdx := FindExport(exportHead, ADR(Scanner.tokBuf)); (*{/*06d2*/}*)
       e := symHeapBase + findIdx * 14;
       IF (findIdx = 0) OR NOT (0 IN e^.flags) THEN (*{/*06e0*/}*)
-        Errors.PrintOverlayMessage(3, Scanner.tokenBuffer); (*{/*06ed*/}*)
+        Errors.PrintOverlayMessage(3, Scanner.tokBuf); (*{/*06ed*/}*)
         Texts.WriteLn(3);
         Texts.WriteLn(3);
         Texts.WriteString(3, "Exported are:"); (*{/*06f9*/}*)
@@ -648,8 +671,8 @@ BEGIN
       END;
       EnterIdent(ADR(currentScope^.link1), findIdx); (*{/*0756*/}*)
       Scanner.GetSym; (*{/*075c*/}*)
-      Scanner.TestSymbolInSet(BITSET{1,9}); (*{/*075e*/}*)
-    UNTIL NOT Scanner.AcceptSymbol(1); (* "," {/*0763*/} *)
+      Scanner.TestSet(BITSET{1,9}); (*{/*075e*/}*)
+    UNTIL NOT Scanner.AcceptSy(1); (* "," {/*0763*/} *)
     Scanner.GetSym; (*{/*0769*/}*)
   END;
   scopeIdx := 15;
@@ -675,12 +698,12 @@ VAR scp: ScopePtr; found: Compiler.RecordPtr;
 BEGIN
   LOOP
     scp := scope;
-    found := Scanner.FindIdent(scp^.idents, ADR(Scanner.tokenBuffer),
-                               9 IN Scanner.scanOptions); (*{/*07af*/}*)
+    found := Scanner.FindIden(scp^.idents, ADR(Scanner.tokBuf),
+                               9 IN Scanner.scanOpt); (*{/*07af*/}*)
     IF found # NIL THEN RETURN ADDRESS(found) END; (*{/*07bc*/}*)
     scope := ADDRESS(scp^.outer); (*{/*07c3*/}*)
     IF (scope = ADDRESS(NIL)) OR (scope = ADDRESS(Compiler.stdScopeAnchor)) THEN (*{/*07c7*/}*)
-      Errors.ReportErrorWithText(0, Scanner.tokenBuffer); (*{/*07d0*/}*)
+      Errors.ReportErrorWithText(0, Scanner.tokBuf); (*{/*07d0*/}*)
     END;
   END;
 END SkipQualident;
@@ -696,23 +719,23 @@ PROCEDURE DefineDefinitionModule(isImpl: CARDINAL);
    against @07d8 must confirm. *)
 VAR node, chain, tmp: T1;
 BEGIN
-  IF Scanner.AcceptSymbol(15) THEN (* DEFINITION {/*07d8*/} *)
-    Scanner.NeedIdentifier;
+  IF Scanner.AcceptSy(15) THEN (* DEFINITION {/*07d8*/} *)
+    Scanner.NeedID;
     node := T1(SkipQualident(ADDRESS(Scanner.curNode)));
-    Scanner.ExpectIdentKind(6);
+    Scanner.ExpectKd(6);
     SymbolAssert(10 IN node^.word3, 44); (*{/*07f0*/}*)
     isImpl := node^.word5;
     Scanner.GetSym;
-    Scanner.ExpectSymbol(16);
+    Scanner.ExpectSy(16);
   END;
-  Scanner.NeedIdentifier; (*{/*080a*/} common tail *)
+  Scanner.NeedID; (*{/*080a*/} common tail *)
   node := T1(SkipQualident(ADDRESS(Scanner.curNode)));
   SymbolAssert((node^.word4 <> 6) OR (10 IN node^.word3), 44);
   IF (node^.word4 = 3) AND (node^.link2 = NIL) THEN
     chain := node^.link0; (*{/*0829*/}*)
     WHILE LookupChain(CARDINAL(chain), CARDINAL(node^.link2)) <> NIL DO
       Scanner.Allocate(tmp, 14);
-      tmp^ := chain^; Scanner.InsertSymbol(tmp);
+      tmp^ := chain^; Scanner.InsertSy(tmp);
       INCL(tmp^.word3, 0);
       chain := chain^.link0;
     END;
@@ -721,18 +744,18 @@ BEGIN
     Compiler.compilationActive := 0;
   END;
   Scanner.Allocate(tmp, 14); (*{/*0865*/}*)
-  tmp^ := node^; Scanner.InsertSymbol(tmp);
+  tmp^ := node^; Scanner.InsertSy(tmp);
   INCL(tmp^.word3, 0);
   Scanner.GetSym;
-  Scanner.TestSymbolInSet(BITSET{2,9}); (* FIXME: group wrote 514; BITSET{2,9} guesses bits — confirm *)
-  WHILE NOT Scanner.AcceptSymbol(1) DO (*{/*087b*/}*)
-    Scanner.NeedIdentifier;
+  Scanner.TestSet(BITSET{2,9}); (* FIXME: group wrote 514; BITSET{2,9} guesses bits — confirm *)
+  WHILE NOT Scanner.AcceptSy(1) DO (*{/*087b*/}*)
+    Scanner.NeedID;
     node := T1(SkipQualident(ADDRESS(Scanner.curNode)));
     SymbolAssert((node^.word4 <> 6) OR (10 IN node^.word3), 44);
-    tmp^ := node^; Scanner.InsertSymbol(tmp);
+    tmp^ := node^; Scanner.InsertSy(tmp);
     INCL(tmp^.word3, 0);
     Scanner.GetSym;
-    Scanner.TestSymbolInSet(BITSET{2,9});
+    Scanner.TestSet(BITSET{2,9});
   END;
   Scanner.GetSym;
 END DefineDefinitionModule;
@@ -740,7 +763,7 @@ END DefineDefinitionModule;
 PROCEDURE BuildBitsetConst(VAR name: ARRAY OF CHAR): BOOLEAN;
 (* proc5 @088a *)
 BEGIN
-  RETURN Scanner.FindIdent(NIL, ADR(name), 9 IN Scanner.scanOptions) <> NIL;
+  RETURN Scanner.FindIden(NIL, ADR(name), 9 IN Scanner.scanOpt) <> NIL;
   (* FIXME: FindIdent(list, identifier, case) — group passed (ADR(name), case)
      i.e. list/name swapped; order TBD from @088a. *)
 END BuildBitsetConst;
@@ -754,23 +777,23 @@ VAR dup: BOOLEAN; mark, node, tmp: T1; i: CARDINAL;
 BEGIN
   modStage^[16].word := 0; (*{/*089a*/} FIXME: group wrote moduleTable^[16] := 0 *)
   Scanner.GetSym;
-  fromSeen := ORD(Scanner.AcceptSymbol(26));
-  IF fromSeen # 0 THEN INCL(Scanner.followSet, 10) END; (*{/*08a8*/}*)
-  Scanner.NeedIdentifier;
-  IF BuildBitsetConst(Scanner.tokenBuffer) THEN
-    Errors.ReportErrorWithText(15, Scanner.tokenBuffer); (*{/*08b6*/}*)
+  fromSeen := ORD(Scanner.AcceptSy(26));
+  IF fromSeen # 0 THEN INCL(Scanner.follSet, 10) END; (*{/*08a8*/}*)
+  Scanner.NeedID;
+  IF BuildBitsetConst(Scanner.tokBuf) THEN
+    Errors.ReportErrorWithText(15, Scanner.tokBuf); (*{/*08b6*/}*)
   END;
   Scanner.Allocate(tmp, 6);
-  Scanner.CopyStringToHeap(Scanner.tokenBuffer, tmp); (* order TBD *)
+  Scanner.CopyStr(Scanner.tokBuf, tmp); (* order TBD *)
   Scanner.GetSym; (*{/*0902*/} ident list loop *)
-  Scanner.TestSymbolInSet(BITSET{2,9});
-  WHILE NOT Scanner.AcceptSymbol(1) DO (*{/*0904*/}*)
-    Scanner.NeedIdentifier;
-    IF BuildBitsetConst(Scanner.tokenBuffer) THEN
-      Errors.ReportErrorWithText(15, Scanner.tokenBuffer);
+  Scanner.TestSet(BITSET{2,9});
+  WHILE NOT Scanner.AcceptSy(1) DO (*{/*0904*/}*)
+    Scanner.NeedID;
+    IF BuildBitsetConst(Scanner.tokBuf) THEN
+      Errors.ReportErrorWithText(15, Scanner.tokBuf);
     END;
     Scanner.GetSym;
-    Scanner.TestSymbolInSet(BITSET{2,9});
+    Scanner.TestSet(BITSET{2,9});
   END;
   Scanner.GetSym;
   (* FIXME: FROM/dup branches ({08d1..08ec}) omitted — re-read @08c0-0902. *)
@@ -788,7 +811,7 @@ BEGIN
   IF imports <> NIL THEN (*{/*0928*/}*)
     WHILE imports <> NIL DO
       currentScope^.link1 :=
-        Scanner.FindIdent(NIL, imports^.link1, 9 IN Scanner.scanOptions);
+        Scanner.FindIden(NIL, imports^.link1, 9 IN Scanner.scanOpt);
       (* FIXME: list arg TBD; group wrote FindIdent(imports^.word1, ...) *)
       node := currentScope^.link1;
       IF node = NIL THEN
@@ -799,21 +822,21 @@ BEGIN
       chain := imports^.link0; imports := chain;
     END;
   END;
-  Scanner.GetStackMark(mark);
-  Scanner.CheckStackMark(mark); (* FIXME: group passed symOptions; mark form kept *)
+  Scanner.GetStack(mark);
+  Scanner.CheckStk(mark); (* FIXME: group passed symOptions; mark form kept *)
   UnlinkScope(modName, CARDINAL(modName)); (* FIXME: arg roles TBD; proc19 *)
 END InitSymbolTables;
 
 PROCEDURE NoteImported;
 (* proc34 @0997 *)
 BEGIN
-  IF NOT (0 IN Scanner.scanOptions) THEN RETURN END;
+  IF NOT (0 IN Scanner.scanOpt) THEN RETURN END;
   IF Compiler.compilationActive THEN
     Texts.WriteString(3, "Imported:");
     Compiler.compilationActive := FALSE;
   END;
   Texts.WriteChar(3, 2C); Texts.WriteChar(3, 12C);
-  Texts.WriteString(3, Scanner.tokenBuffer);
+  Texts.WriteString(3, Scanner.tokBuf);
   Texts.WriteLn(3);
 END NoteImported;
 
@@ -821,27 +844,27 @@ PROCEDURE DoImportList;
 (* proc33 @09c8 *)
 VAR node: T1;
 BEGIN
-  IF Scanner.AcceptSymbol(15) THEN (* FROM x IMPORT {/*09c8*/} *)
-    Scanner.NeedIdentifier;
+  IF Scanner.AcceptSy(15) THEN (* FROM x IMPORT {/*09c8*/} *)
+    Scanner.NeedID;
     Scanner.Allocate(node, 6);
-    Scanner.CopyStringToHeap(Scanner.tokenBuffer, node); (* order TBD *)
+    Scanner.CopyStr(Scanner.tokBuf, node); (* order TBD *)
     NoteImported;
-    Scanner.ExpectSymbol(16);
+    Scanner.ExpectSy(16);
     ImportAll(node); (* FIXME: group wrote ImportOne(node); @09c8 calls proc28=ImportAll *)
   ELSE (* plain IMPORT {/*09ec*/} *)
     Scanner.GetSym;
     NoteImported;
-    node := Scanner.DeclareIdentifier(6);
+    node := Scanner.DeclIden(6);
     node^.word3 := BITSET{3,10}; (* FIXME: group wrote CARDINAL({3,10})=1027 *)
     ImportAll(node);
-    Scanner.TestSymbolInSet(BITSET{2,9});
-    WHILE NOT Scanner.AcceptSymbol(1) DO (*{/*0a00*/}*)
+    Scanner.TestSet(BITSET{2,9});
+    WHILE NOT Scanner.AcceptSy(1) DO (*{/*0a00*/}*)
       Scanner.GetSym;
       NoteImported;
-      node := Scanner.DeclareIdentifier(6);
+      node := Scanner.DeclIden(6);
       node^.word3 := BITSET{3,10};
       ImportAll(node);
-      Scanner.TestSymbolInSet(BITSET{2,9});
+      Scanner.TestSet(BITSET{2,9});
     END;
     Scanner.GetSym;
   END;
@@ -853,15 +876,15 @@ PROCEDURE CompileBody(save: T1);
    group's reading but details are low-confidence. *)
 VAR mark: ADDRESS; i, j: CARDINAL; sc: T1; desc: T1;
 BEGIN
-  Scanner.GetStackMark(mark); (*{/*0a0c*/}*)
-  WHILE (Scanner.curSymbol - 15) IN BITSET{3} DO DoImportList END; (*{/*0a12*/}*)
+  Scanner.GetStack(mark); (*{/*0a0c*/}*)
+  WHILE (Scanner.curSym - 15) IN BITSET{3} DO DoImportList END; (*{/*0a12*/}*)
   CodeGen.InitCodeGenerator;
-  Scanner.TestSymbolRange13(BITSET{0..8}); (* FIXME: 495/483 sets TBD *)
-  Scanner.TestSymbolRange13(BITSET{0..8});
-  IF Scanner.curSymbol <> 13 THEN (* FIXME: COMPILER.bodyHook() — no such export; Pass1 DCLS hook? *) END;
-  WHILE Scanner.AcceptSymbol(13) DO
-    save^.link1 := ADDRESS(Scanner.tokenBuffer); (* FIXME: types punned *)
-    Scanner.TestSymbolInSet(BITSET{3});
+  Scanner.TestR13(BITSET{0..8}); (* FIXME: 495/483 sets TBD *)
+  Scanner.TestR13(BITSET{0..8});
+  IF Scanner.curSym <> 13 THEN (* FIXME: COMPILER.bodyHook() — no such export; Pass1 DCLS hook? *) END;
+  WHILE Scanner.AcceptSy(13) DO
+    save^.link1 := ADDRESS(Scanner.tokBuf); (* FIXME: types punned *)
+    Scanner.TestSet(BITSET{3});
   END;
   InitHeaps; EnterStandards;
   symTop := 0; scopeTop := 14; strTop := 1; exportHead := 0;
@@ -908,25 +931,25 @@ PROCEDURE TryCompile(): BOOLEAN;
 VAR saveOpt: BITSET; savePos: CARDINAL; saveMark: ADDRESS;
     saveScope: T1; saveCount, saveErr: CARDINAL;
 BEGIN
-  saveOpt := Scanner.scanOptions; savePos := Scanner.tokenPos;
-  Scanner.GetStackMark(saveMark);
+  saveOpt := Scanner.scanOpt; savePos := Scanner.tokPos;
+  Scanner.GetStack(saveMark);
   saveScope := currentScope^.link1; saveCount := moduleCount;
   saveErr := Errors.errorNumber;
-  IF (Scanner.curSymbol - 15) IN BITSET{3} THEN
+  IF (Scanner.curSym - 15) IN BITSET{3} THEN
     DoImportList;
     LOOP
       (* FIXME: BodyParseStep(saveMark) — Pass1 DCLS body hook, see FRONTEND.md *)
       EXIT;
     END;
   ELSE
-    Scanner.TestSymbolRange13(BITSET{0..10}); (* FIXME: 2031 set TBD *)
+    Scanner.TestR13(BITSET{0..10}); (* FIXME: 2031 set TBD *)
   END;
   RETURN TRUE;
 EXCEPTION
   moduleCount := saveCount; currentScope^.link1 := saveScope;
   IF Errors.errorNumber > saveErr THEN (*{/*0b4c*/}*)
-    Scanner.tokenPos := savePos; Scanner.scanOptions := saveOpt;
-    Scanner.CheckStackMark(saveMark);
+    Scanner.tokPos := savePos; Scanner.scanOpt := saveOpt;
+    Scanner.CheckStk(saveMark);
     Errors.RollbackToMark;
     CodeGen.OpenEmitter;
     RETURN FALSE;

+ 28 - 0
tools/chain.sh

@@ -0,0 +1,28 @@
+#!/bin/bash
+# chain.sh — compile a list of workfiles, fresh M2 boot per file.
+# Usage: chain.sh <drive-dir> <file1> [file2 ...]
+# Prints last lines of each compile for inspection.
+DRV="$1"; shift
+for f in "$@"; do
+  cat > /tmp/m2one_$$.txt <<EOF
+SLEEP 2
+SEND D:\r
+EXPECT D>
+SEND M2\r
+EXPECT ork file
+SLEEP 2
+SEND C
+EXPECT Workfile name
+SEND $f\r
+SLEEP 20
+EOF
+  echo "############ $f"
+  python3 tools/m2drive.py "$DRV" /tmp/m2one_$$.txt 2>&1 | python3 -c "
+import sys,re
+out = sys.stdin.read()
+clean = re.sub(r'\x1b\[[0-9;?]*[a-zA-Z]|\x1b[()][AB0]', '', out)
+i = clean.find('Workfile name:')
+seg = clean[i:i+700] if i>=0 else clean[-400:]
+print(repr(seg))"
+done
+rm -f /tmp/m2one_$$.txt

+ 87 - 0
tools/m2drive.py

@@ -0,0 +1,87 @@
+#!/usr/bin/env python3
+"""m2drive.py — pty driver for scripted Turbo Modula-2 (cpmulator) sessions.
+Usage: m2drive.py <drive-dir> <script.txt> [--timeout N]
+script.txt lines:  EXPECT <regex> | SEND <text-with-\\r-\\n> | SLEEP <sec> | LOG <note>
+Matching is done on a cleaned screen buffer with an advancing cursor, so
+repeated EXPECTs (e.g. several "SYM produced") each wait for FRESH output.
+Exits 0 iff every EXPECT matched in order.
+"""
+import os, pty, re, select, sys, time
+
+ANSI = re.compile(rb'\x1b\[[0-9;?]*[a-zA-Z]|\x1b[()][AB0]')
+
+
+def main():
+    drv, script = sys.argv[1], sys.argv[2]
+    timeout = float(sys.argv[4]) if len(sys.argv) > 4 else 10.0
+    steps = []
+    for line in open(script):
+        line = line.rstrip('\n')
+        if not line or line.startswith('#'):
+            continue
+        cmd, _, arg = line.partition(' ')
+        steps.append((cmd, arg))
+    pid, fd = pty.fork()
+    if pid == 0:
+        os.execvp('/home/eric/bin/CPM/Cpmulator/cpmulator',
+                  ['cpmulator', '-drive-d', drv])
+    clean = b''   # ANSI-stripped screen, consumed as matched
+    try:
+        for cmd, arg in steps:
+            if cmd == 'SEND':
+                data = arg.encode().decode('unicode_escape').encode('latin1')
+                os.write(fd, data)
+                time.sleep(1.0)
+                clean += drain(fd, 1.0)
+            elif cmd == 'SLEEP':
+                clean += drain(fd, float(arg))
+            elif cmd == 'EXPECT':
+                t0 = time.time()
+                while True:
+                    m = re.search(arg.encode(), clean)
+                    if m:
+                        clean = clean[m.end():]
+                        break
+                    if time.time() - t0 > timeout:
+                        print(f'MISS: {arg}')
+                        print('--- screen tail ---')
+                        print(clean[-2000:].decode('latin1', 'replace'))
+                        return 1
+                    clean += drain(fd, 0.5)
+                print(f'HIT: {arg}', flush=True)
+            elif cmd == 'LOG':
+                print(f'# {arg}', flush=True)
+        print('--- done ok ---')
+        print('--- screen tail ---')
+        print(cleantail(clean, 1500))
+        return 0
+    finally:
+        try:
+            os.close(fd)
+        except OSError:
+            pass
+
+
+def cleantail(clean, n):
+    return clean[-n:].decode('latin1', 'replace')
+
+
+def drain(fd, wait):
+    """Read available pty output for up to `wait` seconds, ANSI-stripped."""
+    out = b''
+    end = time.time() + wait
+    while time.time() < end:
+        r, _, _ = select.select([fd], [], [], max(0, end - time.time()))
+        if not r:
+            continue
+        try:
+            chunk = os.read(fd, 65536)
+        except OSError:
+            break
+        if not chunk:
+            break
+        out += chunk
+    return ANSI.sub(b'', out)
+
+
+sys.exit(main())