cdc:nos2.source:nam5871:syngen
Table of Contents
SYNGEN
Table Of Contents
Source Code
- SYNGEN.txt
- *DECK SYNGEN
- OVERLAY(SYNGEN,0,0)
- PRGM SYNGEN;
- BEGIN
- #**********************************************************************#
- ITEM COPYRIGHT C(34) =
- "COPYRIGHT CONTROL DATA SYSTEMS INC.1994";
- #**********************************************************************#
- ITEM ABTFLAG B = FALSE; # TRUE IF *ABORT-ON-ERRORS* PARAMETER #
- # WAS SPECIFIED ON CONTROL STATEMENT #
- XREF
- BEGIN
- ITEM LFLAG; #FLAG FOR LISTING OPTION CHOSEN #
- # 1 = FULL OUTPUT LISTING REQUESTED.#
- # 0 = DIAGNOSTICS ONLY. #
- ITEM TFLAG; #FLAG FOR CONSTRUCTION OF A TABLE OF #
- #TRACING INFORMATION FOR USE IN TRACING #
- #PATHS THRU SYNTBLE. 1 = TRACEM TABLE IS#
- #BUILT (DEFAULT CASE). 0 = NOT BUILT. #
- ITEM REWIND; #FLAG FOR FILE POSITION OPTION CHOSEN #
- # 1 = ALL FILES REWOUND AT END. #
- # 0 = NO FILES REWOUND AT END. #
- ITEM LXREFWS; #WSA FOR LXREF FILE WRITING. #
- ITEM DXREFWS; #WSA FOR DXREF FILE WRITING. #
- ITEM SXREFWS; #WSA FOR SXREF FILE WRITING. #
- PROC SYNOPEN; #COMPASS RTN WHICH OPENS ALL SYNGEN FILE#
- PROC SYNABT; #COMPASS RTN WHICH ABORTS JOB AFTER #
- #WRITING DAYFILE DIAGNOSTICS. #
- PROC SYNCOM; #COMPASS RTN WHICH WRITES PRESET ARRAY #
- #RECORDS TO SYNGEN"S OUTPUT FILE. #
- PROC SYNCOPY; #COMPASS RTN WHICH COPIES THE SYNTBLE #
- #FILE, AND TRACEM FILE IF BUILT, TO THE #
- #SYNGEN OUTPUT FILE. #
- ARRAY SYNIWSA[8]; #WORKING STORAGE FOR SYNGEN"S INPUT FILE#
- ITEM INWORD C(0,0,10);
- ITEM SYNIRL; #INPUT RECORD LENGTH IN CHARACTERS. #
- ITEM SYNORL; #OUTPUT RECORD LENGTH IN CHARACTERS. #
- ITEM SYNEOF; #EOF FLAG, 1=EOF. #
- ARRAY SYNTWSA[5]; #WSA FOR TRACEM FILE I/O. #
- ITEM TRACEWSAWD C(0,0,10);
- PROC SYNPRNT; #COMPASS RTN WHICH WRITES RECORDS ON THE#
- #SYSTEM OUTPUT FILE. #
- PROC SYNREAD; #COMPASS RTN WHICH READS RECORDS (CARD #
- #IMAGES) FROM SYNGEN"S INPUT FILE. #
- PROC LXREFW; #COMPASS RTNS TO WRITE AND READ THE #
- PROC LXREFR; #LABEL CROSS REFERENCE FILE, THE DIAG- #
- PROC DXREFW; #NOSTIC CROSS REFERENCE FILE AND THE #
- PROC DXREFR; #SUBROUTINE CROSS REFERENCE FILE, #
- PROC SXREFW; #RESPECTIVELY. #
- PROC SXREFR;
- PROC TRACEW; #COMPASS RTN WHICH WRITES ON THE TRACEM #
- #FILE. #
- PROC SYNCLSE; #COMPASS RTN WHICH CLOSES ALL FILES AND #
- #WRITES OUT THE PRESET ARRAYS BUILT BY #
- #SYNGEN. #
- END
- XDEF PROC SYNTBLR;
- XDEF ITEM HDRDATE C(10);
- XDEF ITEM HDRTIME C(10);
- XREF PROC SYNTIDA;
- XREF ITEM OUTLEN; # RECORD LENGTH FOR COMPILE FILE #
- XREF ITEM REALEOF;
- STATUS CHARTYPE ALPHABETIC, NUMERIC, DELIMITER;
- DEF SCALL # #; # FOR READABILITY OF PROC CALLS #
- ITEM TYPE; # TYPE OF CHARACTER FROM -GETCHAR- #
- ARRAY AINCHAR[0]; # HOLDS CHARACTER FROM -GETCHAR- #
- BEGIN
- ITEM INCHARC C(0,54,1); # FOR CHARACTER USAGE #
- ITEM INCHARI U(0,54,6); # FOR NUMBER USAGE #
- END
- ITEM FC; # FROM CHAR IN -INWORD- #
- ITEM FW; # FROM WORD IN QUIWSA ARRAY #
- ITEM TOPENTRY; # TOP ENTRY IN THE SKIPTBL #
- XREF ITEM DIRFLAG; # FLAG FOR A SKIP DIRECTIVE. 1 A #
- # DIRECTIVE, 0- NOT A DIRECTIVE #
- XREF ITEM SKIPFLG; # FLAG FOR SKIPPING. 1- SKIP, #
- # 0- NOSKIP, -1 - A TRUE IFEQ #
- XREF PROC ENDINP;
- ARRAY HASHEDTABLE[127]; #TABLE OF POINTERS TO DATA ACCESSED VIA #
- ITEM HASHENTRY = [128(0)];#HASHED CODES. #
- BASED ARRAY SYMBOLTABLE; #ARRAY FOR ACCESSING SYMBOL TABLE #
- BEGIN #ENTRIES. #
- ITEM SNAME C(1,0,10);#WORD OF SYMBOL NAME. #
- ITEM SDEFINEBIT B(0,0,1);#TRUE IF DEFINED, FALSE OTHERWISE. #
- ITEM SLENGTH I(0,6,6);#LENGTH OF SYMBOL IN WORDS. #
- ITEM STYPE I(0,12,6); #TYPE OF SYMBOL (LABEL, ROUTINE, ETC.) #
- ITEM NEXTPTR I(0,24,18);#PTR TO NEXT ENTRY IN A CHAIN. #
- ITEM SVALUE I(0,42,18);#VALUE OF THE SYMBOL. #
- END
- BASED ARRAY SYMBOLTABLE2;#ARRAY FOR ACCESSING A 2ND SYMBOL TABLE #
- BEGIN #ENTRY SIMULTANEOUSLY. #
- ITEM SNAME2 C(1,0,10);
- ITEM SLENGTH2 I(0,6,6);
- END
- BASED ARRAY SORT; #USED FOR SORTING THE CROSS REFERENCES. #
- ITEM SORTWORD;
- BASED ARRAY SYNTBLE; # USED FOR THE -SYNTBLE- -FILE- #
- ITEM SYNTBLEWD;
- ARRAY [1]; #RESULT OF BINARY NUMBER CONVERTED TO #
- ITEM OCTAL; #DISPLAY-CODED OCTAL. #
- ARRAY [3]; #HOLDS SYMBOL TO BE INSERTED IN SYMBOL #
- # TABLE OR EXTRACTED FROM IT. #
- ITEM NAME C(0,0,10); #NAME OF SYMBOL . #
- ARRAY SCRATCH[13]; #SCRATCH STORAGE FOR I/O RECORDS. #
- ITEM SCRATCHWD C(0,0,10);
- BASED ARRAY RA; #ARRAY FOR EXAMINING THE SYSTEMS COMMUN-#
- BEGIN #ICATION AREA #
- ITEM CCPARAM C(0,0,1);#ACCESSES 1ST CHAR OF CONTROL CARD PARS#
- ITEM NEXTAVAIL I(0,42,18);#ACCESSES NEXT AVAILABLE WORD IN FL#
- ITEM NRCCPARAMS I(0,42,18);#COUNT OF PARAMS ON CONTROL CARD. #
- ITEM FULLWORD I(0,0,60);
- ITEM CCFILENAME I(,,42);#ACCESSES LFN CONTROL CARD PARAMS. #
- END
- BASED ARRAY LABELPTRS; #ARRAY OF POINTERS TO LABELLED SECTIONS #
- ITEM LABELPTR; #OF THE SYNTABLE. AS EACH LABEL IS DE- #
- #FINED AN ENTRY IN THIS TABLE IS ASSIGN-#
- #ED TO IT AND A POINTER VALUE STORED IN #
- #THE ASSIGNED ENTRY. #
- BASED ARRAY SUBLABELPTRS[99];#POINTERS TO SUBLABEL SECTIONS #
- ITEM SUBLABELPTR (,,60);#WITHIN EACH LABELLED SECTION. RE- #
- #INITIALIZED FOR EACH LABELLED SECTION. #
- #POINTER VALUE IS NEG IF SUBLABEL IS UN-#
- #DEFINED, POS IF DEFINED. ARRAY IS IN- #
- #DEXED BY SUBLABEL NUMBER. #
- ARRAY DUPELABELMSG[7];
- ITEM DUPELABEL C(0,0,10) = [" ******** "," ",
- " "," ",
- " DOUBLY","-DEFINED, ",
- "LATEST OVE","RRIDES. "];
- ARRAY UNDEFMESSAGE[6];
- ITEM UNDEFMESS C(0,0,10) = [" ******** "," ",
- " "," ",
- " UNDEFI","NED ",
- " "];
- ARRAY [2]; #DISPLAY-CODED LABEL OF SYNTBLE SECTION #
- ITEM CURRENTLABEL C(,,10); #CURRENTLY BEING BUILT. #
- ARRAY BADDIGITMSG[4];
- ITEM BADDIGIT C(0,0,10) = [" ******** "," ",
- "IS NOT A V","ALID INTEG",
- "ER. "];
- ARRAY LEXSEQ[6];
- ITEM LSWORD C(0,0,10) = [" ******** ","KEYWORD OU",
- "T OF SEQUE","NCE - ",
- 3(" ")];
- ARRAY BADOCTALMSG2[4];
- ITEM BADOCT2 C(0,0,10) = [" ******** ","PRECEDING ",
- "CARD CONTA","INS BAD OC",
- "TAL DIGIT."];
- ARRAY LABELCOMMENT[5]; #COMMENT FOR LABEL IN SYNTBLE PRESET. #
- ITEM LABELCOMWORD C(,,10) = [" # : ",4(" "),
- " # "];
- ARRAY INSTRCOMMENT[5]; #COMMENT FOR WORD OF CODE IN SYNTBLE. #
- ITEM INSTRUCTCOM C(,,10) = [" # ",4(" "),
- " # "];
- ARRAY PRESETCODE[5]; #FORMAT FOR PRESET LINE OF SYNTBLE CODE.#
- BEGIN
- ITEM PRESET C(,,10) = [" O"" ",4(" "),
- """, "];
- ITEM PRESETI; #REDEFINITION OF WORD USAGE. #
- END
- BASED ARRAY LABELENTRY; #FORMATS AN ENTRY IN THE LBLPTRS PRESET #
- BEGIN #ARRAY #
- ITEM LABELNAME C(0,0,10); #NAME OF LABEL. #
- ITEM LABELPRESET C(5,0,10); #DECIMAL PTR TO SYNTBLE SECTION. #
- END
- ARRAY PROCNAME[5];
- ITEM PNAME C(,,10) = [" PROC SYN","TAXTABLE; ",4(" ")];
- ARRAY LABELPTRHEDR[5]; #HEADER RECORD FOR LBLPTRS PRESET ARRAY.#
- ITEM LABELPTRHDR C(0,0,10) = [" ARRAY LBL","PTRS [",
- " ]; ",3(" ")];
- ARRAY LABELPTRITEM[5]; #ITEM DEF RECORD FOR LBLPTRS ARRAY PRE- #
- ITEM LBLPTRITEM C(0,0,10) = [" ITEM LB","LPTR U = [", #SET. #
- 4(" ")];
- ARRAY LABELPTRTAIL[5]; #RECORD FOR TERMINATION OF LBLPTRS PRE- #
- ITEM LBLPTRTAIL C(0,0,10) = [5(" ")," ]; "];#SET#
- ARRAY TRACEMTAIL[5]; #TAILEND RECORD FOR TRACEM PRESET. #
- ITEM TRACEMTAILWD C(0,0,10) = [5(" ")," ]; "];
- ARRAY TRACEMHDR[5]; #1ST RECORD FOR TRACEM ARRAY PRESET. #
- ITEM TRACEMHDRWD C(0,0,10) = [" ARRAY TRA","CEM [ ",
- "]; ",3(" ")];
- ARRAY SKIPLINE[5];
- ITEM SKIP C(,,10) = [6(" ")];
- ARRAY DXREFHEADER2[3];
- ITEM DXREFHDR2 C(,,10) = [" DIAGNOSTI","C ",
- "REFERENCED"," AT "];
- ARRAY LXREFHEADER2[5];
- ITEM LXREFHDR2 C(0,0,10) = [" LABEL "," ",
- " "," ",
- "REFERENCED"," BY "];
- ARRAY SXREFHEADER2[5];
- ITEM SXREFHDR2 C(0,0,10) = [" SUBROUTIN","E SWITC",
- "H POSITION"," ",
- "REFERENCED"," BY "];
- ARRAY SXREFHEADER3[3];
- ITEM SXREFHDR3 C(0,0,10) = [" "," BASE ",
- "10 BASE ","8 "];
- BASED ARRAY LEXICON [0]; # #
- BEGIN # #
- ITEM LEXWRD C(0,00,10); # KEYWORD (MAX LENGTH IS 30 CHR)#
- ITEM LEXID I(0,00,15); # UNIQUE OCTAL VALUE ASSOCIATED #
- # WITH THE KEY WORD. #
- ITEM LEX1PARAM I(0,15,15); # PARAMETER VALUE TO BE ASSOCIAT#
- ITEM LEX2PARAM I(0,30,15); # ED WITH THE KEY WORD #
- ITEM LEXSYNSECT I(0,45,15); # CONTAINS KEYWORD = LABEL FLAG.#
- # IF A KEYWORD IS THE SAME AS A #
- # LABEL, THE ADDRESS OF THE #
- # LABEL IN SYNTABLE WILL OVERLAY#
- # THE FLAG IN LEXSYNSECT. #
- END
- BASED ARRAY SYN1SCRATCH [0]; # BASED ARRAY POINTING TO ONE #
- ITEM KEY1WRD C(0,00,10); # WORD KEYWORDS. #
- BASED ARRAY SYN2SCRATCH [0]; # BASED ARRAY POINTING TO TWO #
- ITEM KEY2WRD C(0,00,10); # WORD KEYWORDS. #
- BASED ARRAY SYN3SCRATCH [0]; # BASED ARRAY POINTING TO THREE #
- ITEM KEY3WRD C(0,00,10); # WORD KEYWORDS. #
- ARRAY LOCWORDS [26];
- ITEM LOCWRD I(0,0,60) = [27(0)];
- ARRAY KEYWRDHDR [5]; # HEADER FOR LEXWORDS PRESET ARRAY. #
- ITEM KEYHDR C(0,0,10) = [" ARRAY LEX","WORDS [",
- " ]; ",3(" ")];
- ARRAY KEYWRDITEM [5]; # ITEM DEF FOR LEXWORDS PRESET ARRAY. #
- ITEM KEYITEM C(0,0,10) = [" ITEM LE","XWRD U = [",
- 4(" ")];
- ARRAY KEYWRDTERM [5]; # TERM FOR LEXWORDS PRESET ARRAY. #
- ITEM KEYTERM C(0,0,10) = [5(" ")," ]; "];
- ARRAY KEYWRDLINE [5]; # KEYWRD ENTRY IN LEXWORDS PRESET ARRAY. #
- ITEM KEYLINE C(0,0,10) = [" O""",2(" "),
- """, # "," ",
- " # "];
- ARRAY LEXICONHDR [5]; # HEADER FOR THE LEXICON PRESET ARRAY. #
- ITEM LEXHDR C(,,10) = [" ARRAY LEX","ICON [26];"," ",
- 3(" ")];
- ARRAY LEXICONITEM [5]; # ITEM DEF FOR THE LEXICON PRESET ARRAY. #
- ITEM LEXITEM C(0,0,10) = [" ITEM LE","X U = [ ",
- 4(" ")];
- ARRAY LEXICONTERM [5]; # TERM FOR THE LEXICON PRESET ARRAY. #
- ITEM LEXTERM C(0,0,10) = [5(" ")," ]; "];
- ARRAY LEXICONLINE [5]; # ENTRY IN THE LEXICON PRESET ARRAY. #
- ITEM LEXLINE C(0,0,10) = [" O""",2(" "),
- """, ",2(" ")];
- ITEM NUMBER1WRD;
- ITEM NUMBER2WRD;
- ITEM NUMBER3WRD;
- ITEM KEYFIRSTCHAR;
- ITEM MAXKEYWRDS;
- ITEM KEY1PTR = 0; # INDEX TO ONE WORD KEYWORDS. #
- ITEM KEY2PTR = 0; # INDEX TO TWO WORD KEYWORDS. #
- ITEM KEY3PTR = 0; # INDEX TO THREE WORD KEYWORDS#
- ITEM LEXPTR; # INDEX TO LEXID,LEX1PARAM, #
- # LEX2PARAM, LEXSYNSECT#
- ITEM ENTRIES; # COUNTER CONTAINING THE NUMBER #
- # OF ENTRIES BASED ON THE FIRST #
- # CHARACTER. #
- ITEM FIRSTCHAR; # CONTAIN THE DISPLAY CODE VALUE#
- # 01 THRU 32. COMPARED AGAINST #
- # THE FIRST CHARACTER OF THE KEY#
- # WORD TO DETERMINE THE NUMBER #
- # OF ENTRIES. #
- ITEM WRDLOCPTR; # INDEX INTO THE LEXWORDLOC #
- # TABLE. #
- ITEM TOTALWORDS; # COUNT OF TOTAL NUMBER OF WORDS#
- # PROCESSED IN LEXWORDS. #
- ITEM NUMBER1KEY; # TOTAL NUMBER OF 1 WORD KEYWRDS#
- ITEM NUMBER2KEY; # TOTAL NUMBER OF 2 WORD KEYWRDS#
- ITEM NUMBER3KEY; # TOTAL NUMBER OF 3 WORD KEYWRDS#
- # #
- # #
- # #
- # #
- # #
- ARRAY SYNCHARS[72]; # CONTAINS SYNTAX SPECIFICATIONS#
- ITEM CHAR C(0,0,10); # INPUT TO SYNGEN. 1 CHAR PER #
- # WORD. #
- BASED ARRAY STATETRANS [15,12];
- ITEM SWITCHVALUE I(0,0);
- ARRAY STATTRNS [207];
- ITEM SWTHVAL I(0,0,60) = [1,15(0),
- 2,3,3(0),42,0,7(28),31,0,
- 32,6,7,8,11,12,15,16,19,2(29),24,
- 2(29),31,0,
- 33,9,10,0,30,2(0),7(30),31,0,
- 34,13,14,13(30),
- 39,40,41,4(0),7(30),2(0),
- 35,17,18,4(0),7(29),31,0,
- 36,4,5,2(0),43,0,8(30),0,
- 36,4,5,2(0),43,0,3(29),21,4(29),0,
- 37,22,23,4(0),8(29),0,
- 36,4,5,2(0),43,0,5(29),25,2(29),0,
- 38,26,27,2(0),43,0,8(29),0,
- 36,4,5,2(0),43,0,2(29),20,5(29),0];
- STATUS SCHAR COLN,COMA,SLSH,ASK, # MUST CORRESPOND TO THE STATUS #
- DSGN,MINUS,PLUS,D, # ENTRIES IN THE STATE TRANSIT- #
- Y,E,S,N,O,LETTER, # ION TABLE. #
- DIGIT,SPC; # #
- ARRAY STATUSLIST[72]; #CONTAINS THE LEXICAL STATUS OF #
- ITEM STATLIST S:SCHAR (0,0,60) # CORRESPONDING ENTRY IN THE #
- = [72(S"COMA")]; # SYNCHARS ARRAY. #
- ARRAY DREQ[41] S(1); # DRIVER REQUESTS AND THEIR #003860
- BEGIN # OPERAND VALUES. #
- ITEM SYNR C(,,10) = ["SUBS",,"KEY",,"NAME",,"LIT",,"NUM",,
- "INT",,"FLT",,"FIX",,"SNW",,"SNC",,
- "FNAME",,"SNS",,"EOS",, 003880
- "SPREC",,"DPREC",,"CHARLIT",,"CHRMSK",,
- "OCTAL",,"CMPLX",,"EOT",,"EOF"];
- ITEM REQSTRUCTION I(1,0,60) = [ 3 ,,# +SUBS #
- 100 ,,# +KEY #
- 101 ,,# +NAME #
- 102 ,,# +LIT #
- 105 ,,# +NUM #
- 107 ,,# +INT #
- 110 ,,# +FLT #
- 108 ,,# +FIX #
- 13 ,,# +SNW #
- 14 ,,# +SNC #
- 99 ,,# +FNAME # 003900
- 15 ,,# +SNS # 003910
- 10 ,,# +EOS # 003920
- 111 ,,# +SPREC #
- 112 ,,# +DPREC #
- 103 ,,# +CHARLIT #
- 104 ,,# +CHRMSK #
- 106 ,,# +OCTAL #
- 109 ,,# +CMPLX #
- 12 ,,# +EOT #
- 11 # +EOF #];
- END
- ARRAY USTATE [7];
- ITEM US C(0,0,10) = [" ******** ","UNRECOGNIZ","ABLE STATE",
- "MENT------",,,,];
- ARRAY UKEY[7];
- ITEM UK C(0,0,10) = [" ******** ","UNDEFINED ","KEYWORD IG",
- "NORED --- ",,,,];
- ARRAY UACT[7];
- ITEM UA C(0,0,10) = [" ******** ","UNRECOGNIZ","ABLE ACTIO",
- "N IGNORED-",,,,];
- ARRAY NOSYNSECT[6];
- ITEM NOSYNS C(,,10) = [" ******** ","PRECEDING ","KEYWORD HA",
- "S NO CORRE","SPONDING S","YNTAX SECT",
- "ION "];
- BASED ARRAY SERR [0];
- ITEM SYNERROR C(0,0,10);
- ARRAY HEADERLINE[0] S(13);
- BEGIN
- ITEM HDREJECT C(0,0,10) = ["1 "];
- ITEM HDRPROC C(1,0,10);
- ITEM HDRPROC1 C(2,0,10) = [" "];
- ITEM HDRTITLE C(3,0,40);
- ITEM HDRSYNGEN C(7,0,20) = ["SYNGEN "];
- ITEM HDRDATE1 C(9,0,10);
- ITEM HDRTIME1 C(10,0,10);
- ITEM HDRPAGE C(11,0,10) = [" PAGE "];
- ITEM HDRPAGENO C(12,0,5);
- END
- ITEM # #
- BP = 0, # CONTAINS THE BIT POSITION OF #
- # CURRENT CHARACTER. #
- WRDPTR, # POINTER TO THE WORD THAT CONT-#
- # AINS THE CURRENT CHARACTER. #
- CHRPTR = 73, # INDEX INTO THE SYNCHARS AND #
- # STATUSLIST ARRAYS. #
- LASTCHAR = 72, # PTR TO THE ENTRY IN SYNCHARS #
- # CONTAINING THE LAST SOURCE #
- # CHAR IN AN INPUT RECORD. #
- CHARIND , # CONTAINS CHARACTER OR NUMERIC #
- # INDICATOR. #
- STATE = 0; # CONTAINS SUBSCRIPT INTO THE #
- # STATE TRANSITION TABLE. #
- STATUS SFLAG INSERT, EXTRACT;#STATUS LIST FOR INS$EXT. #
- ITEM
- COUNTER = 0, #SCRATCH VARIABLE USED IN COUNTING. #
- CTEMP C(10), #SCRATCH STORAGE - CHARACTERS. #
- CURNTLABLPTR, #PTR TO ENTRY IN SYMBOL TABLE FOR LABEL #
- #OF SYNTBLE SECTION CURRENTLY BEING BILT#
- CURNTSUBLABL C(2), #DISPLAY-CODED NAME OF CURRENT SUBSEC- #
- #TION BEING BUILT. . #
- FIRSTSUBLABL, #FLAG INDICATING WHETHER FIRST SUBLABEL #
- #IN THE SECTION HAS BEEN FOUND. #
- DISPLAYINSTR C(7), #DISPLAY-CODED INSTRUCTION (\ 7 CHARS.) #
- ERRORCOUNT = 0, #TALLY OF ERRORS IN CURRENT COMPILATION.#
- ERRORFLAG, #FLAG FOR ERROR OCCURRENCE, 0=NO ERROR. #
- I, #TEMPORARY SCRATCH VARIABLE. #
- INS$EXT S:SFLAG = #FLAG FOR SYNHASH ROUTINE INDICATING #
- S"INSERT",#WHETHER A SYMBOL IS TO BE INSERTED OR #
- #EXTRACTED FROM THE SYMBOL TABLE. #
- J, #TEMPORARY SCRATCH VARIABLE. #
- K,L,M,N,ITEMP, #SCRATCH VARIABLES. #
- P, # INDEX FOR SYNTBLR AND W #
- LABELCOUNTER = 0, #INDEX INTO THE LABELPTRS ARRAY TO THE #
- #LAST SYMBOL WHICH HAS BEEN DEFINED. #
- LASTAVAIL, #PTR TO LAST UNALLOCATED WORD IN JOB"S #
- #FIELDLENGTH. #
- LASTRANSFER, #PTR TO LAST PREVIOUS TRANSFER POINT IN #
- #THE SYNTBLE. #
- RTEMP R, #SCRATCH STORAGE - REAL VALUES. #
- SECTIONWORD = 0, #NR OF CURRENT WORD OF SYNTBLE INSTRUC- #
- #TIONS RELATIVE TO 1ST WORD OF LABELLED #
- #SECTION. #
- SUBLABEL, #BINARY VALUE OF SUBLABEL INTEGER. #
- SYMBOLTYPE = O"23", #TYPE OF SYMBOL IN "NAME". (PRESET FOR #
- #SUBRBUILD ROUTINE). #
- SYMBOLLENGTH = 2, #LENGTH OF SYMBOL IN "NAME" IN WORDS. #
- #(PRESET FOR SUBRBUILD ROUTINE). #
- SYMBOLVALUE, #VALUE OF SYMBOL IN "NAME". #
- SYNSTRUCTION, #ENCODED SYNTBLE INSTRUCTION. #
- SYNTBLEPARCL = 0, #NR OF NEXT PARCEL TO BE BUILT. #
- SYNTBLEWORD, #TALLY OF WORDS IN THE SYNTBLE FILE. #
- TRACESKEL C(10) = #SKELETON FOR AN ENTRY IN THE PRESET #
- """ "",", #TRACEM ARRAY. #
- UNDEFSYMBOLS = 0; #TALLY OF UNDEFINED SYMBOLS IN SYMBOL #
- #TABLE. #
- ITEM OLDFL;
- ITEM OLDLA;
- ITEM OLD65;
- ITEM PTC B;
- ITEM FL I=0; # MAX FL FOR RUN. DISPLAYED AT END. #
- ITEM ERRORS I=0; # TOTAL ERRORS FOR RUN. DISPLAYED AT END#
- ITEM WORD1 = 0; #STARTING WORD IN SOURCE FOR KEYWORDS #
- #AND SUBROUTINE NAMES - EITHER CARD COL #
- #1 OR 11. #
- ITEM SYNORL1; #NO OF CHAR FOR PRINTER TO PRINT #
- ITEM LINENO; #LINE NUMBER OF LINE JUST PRINTED #
- ITEM PAGENO; #PAGE NUMBER OF LINE JUST PRINTED #
- ITEM SORTFL; #FL AVAILABLE FOR SORTING #
- DEF LINELIMIT #55#; #NO OF LINES PER PAGE #
- DEF INFILE #B<0,60>INWORD[0]#;#LFN OF SYNGEN"S INPUT. DEFAULT IS #
- #THE SYSTEM INPUT FILE. #
- DEF OUTFILE #B<0,60>INWORD[1]#;#LFN OF THE OUTPUT FILE FOR THE #
- #ARRAY PRESETS BUILT BY SYNGEN. DEFAULT #
- #IS "COMPILE". #
- DEF LSTFILE #B<0,60>INWORD[2]#; # LFN FOR THE LISTINGS OF INPUT#
- # CROSS REFERENCES,ETC. DEFAULT IS #
- # OUTPUT. #
- DEF LXREFWSA #LXREFWS#; #WSA FOR WRITING ON LXREF FILE. #
- DEF DXREFWSA #DXREFWS#; #WSA FOR WRITING ON DXREF FILE. #
- DEF SXREFWSA #SXREFWS#; #WSA FOR WRITING ON SXREF FILE. #
- CONTROL EJECT;
- PROC GETCHAR;
- #**********************************************************************#
- # #
- # GETCHAR #
- # #
- #**********************************************************************#
- # GETS THE NEXT CHARACTER FROM -SYNIWSA-. THE CHARACTER IS SCREENED FOR#
- # ITS TYPE AND -TYPE- IS SET TO THE APPROPRIATE STATUS CONSTANT. THE #
- # CHARACTER IS STORED IN -AINCHAR-, WHICH HAS ITEMS OF -INCHARI- AND #
- # -INCHARC-. ALSO ADVANCES -FC- AND -FW- AS NECESSARY TO INDICATE WHICH#
- # CHARACTER HAS BEEN SELECTED FROM -SYNIWSA-. #
- #**********************************************************************#
- BEGIN
- IF FC LS 9 THEN # STILL MORE CHARS IN THIS WORD #
- FC = FC + 1; # WE USE THE NEXT CHARACTER #
- ELSE
- BEGIN # START WITH THE NEXT WORD #
- FC = 0; # FIRST CHAR POSITION IN NEW WORD #
- FW = FW + 1; # NEXT WORD #
- END
- INCHARI[0] = B<FC*6, 6>INWORD[FW]; # AVOID THE CHARACTER BEAD #
- I = INCHARI[0]; # TEMPORARY STORAGE OF CHARACTER #
- TYPE = CHARTYPE"DELIMITER"; # ASSUME CHARACTER TYPE IS DELIMITER#
- IF I EQ O"53" THEN # CHARACTER IS A $ #
- TYPE = CHARTYPE"ALPHABETIC"; # $ IS A LEGAL CHARACTER #
- ELSE
- IF I LQ O"44" THEN # NINE OR UNDER #
- IF I GQ O"33" THEN # IN ZERO TO NINE RANGE #
- TYPE = CHARTYPE"NUMERIC";
- ELSE
- IF I EQ 0 THEN # -A- IS LOWEST LEGAL CHAR #
- TYPE = CHARTYPE"DELIMITER";
- ELSE # IN NORMAL A-Z RANGE #
- TYPE = CHARTYPE"ALPHABETIC";
- RETURN;
- END
- CONTROL EJECT;
- PROC CHKERRCNT;
- #**********************************************************************#
- # #
- # CHKERRCNT #
- # #
- #ROUTINE THAT UPDATES THE ERROR COUNT AND ABORTS THE COMPILATION IF #
- #THE ERROR COUNT EXCEEDES THE LIMIT OF 100 ERRORS. #
- # #
- BEGIN
- DEF ERRLIMIT #100#; # ERROR LIMIT #
- ERRORCOUNT = ERRORCOUNT + 1; # UPDATE ERROR COUNT #
- IF ERRORCOUNT GQ ERRLIMIT THEN
- SYNABT(3); # ERROR LIMIT EXCEEDED, ABORT #
- # COMPILATION. #
- RETURN;
- END
- CONTROL EJECT;
- XDEF PROC CHKSKIP;
- PROC CHKSKIP;
- #**********************************************************************#
- # #
- # CHKSKIP #
- # #
- #ROUTINE WHICH CONSTRUCTS AND MAINTAINS A TABLE OF DEFINED NAMES AND #
- #VALUES. IT PERFORMS INSERTS, VALUE ASSIGNMENTS, AND CHECKS VALUES #
- #DEPENDING ON ITS DIRECTIVES..... IFEQ, DEF, ENDIF. #
- #ALSO HANDLES A DIRECTIVE TO FORCE A NEW PAGE ON THE LISTING.... EJECT #
- # #
- #ALL DIRECTIVES MUST START IN THE VERY FIRST CHARACTER POSITION OF THE #
- #INPUT RECORD, AND MUST HAVE A SPACE FOLLOWING THE DIRECTIVE VERB. #
- #THE FOLLOWING SYNTAX DESCRIPTION APPLIES TO *EJECT* AND ALL NEW #
- #COMPILER DIRECTIVES. EVENTUALLY, IT SHOULD BE THE STANDARD... #
- #ALL COMPILER DIRECTIVES MUST BE IMMEDIATELY PRECEDED BY, AND FOLLOWED #
- #BY A SYMPL COMMENT DELIMITER. IN THIS WAY, UNRECOGNIZED COMMANDS CAN #
- #CAN BE TREATED AS COMMENTS. THE STARTING DELIMITER MUST APPEAR IN THE #
- #FIRST CHARACTER POSITION OF THE INPUT RECORD, WITH THE COMMAND VERB #
- #STARTING IN THE SECOND CHARACTER POSITION. #
- # #
- #ENTRY CONDITIONS: #
- # A NEW RECORD IN SYNIWSA #
- # #
- #EXTERNAL REFERENCES: #
- # SYNIWSA - INPUT WORKING STORAGE AREA #
- # SKIPFLG - FLAG FOR CONDITIONAL SKIPPING #
- # DIRFLAG - FLAG FOR COND. SKIP. DIRECTIVE ON INPUT #
- # SKIPCNT - INCREMENTED FOR AN IFEQ, DECREMENTED FOR AN ENDIF #
- # #
- #EXIT CONDITIONS: #
- # #
- # FLAGS, DIRFLAG AND SKIPFLG, WILL BE SET BY CHKSKIP TO INDICATE #
- # WHETHER OR NOT THE INPUT LINE IS TO BE PROCESSED BY THE COMPILER. #
- # SYNREAD PERFORMS SPECIAL PROCESSING FOR THE FLAG VALUES: #
- # #
- # DIRFLAG = 1, THE INPUT LINE WAS A COMPILER DIRECTIVE, AND IS #
- # NOT TO BE PROCESSED BY THE COMPILER. THE VALUE #
- # OF SKIPFLG IS IRRELEVANT. #
- # #
- # DIRFLAG = 0, THE INPUT LINE WAS NOT A COMPILER DIRECTIVE, AND #
- # THE VALUE OF SKIPFLG CONTROLS WHETHER OR NOT THE #
- # LINE WILL BE PROCESSED BY THE COMPILER. #
- # #
- # SKIPFLG = 0, THE INPUT LINE IS NOT UNDER THE CONTROL OF #
- # CONDITIONAL COMPILATION DIRECTIVES, AND SHOULD #
- # BE PROCESSED BY THE COMPILER. #
- # #
- # SKIPFLG = 1, THE INPUT LINE IS BEING SKIPPED BY CONDITIONAL #
- # COMPILATION DIRECTIVES, AND SHOULD NOT BE #
- # PROCESSED BY THE COMPILER. #
- # #
- # SKIPFLG = -1, THE INPUT LINE IS BEING INCLUDED BY CONDITIONAL #
- # COMPILATION DIRECTIVES, AND SHOULD BE PROCESSED #
- # BY THE COMPILER. #
- # #
- # #
- #ERROR CONDITIONS: #
- # NONE #
- # #
- BEGIN
- ITEM DIGIT B; # ITEM SAYS FIRST CHAR IS DIGIT #
- ITEM DIRCODE; # CODE USED TO REMEMBER WHAT DIRECT #
- # IVE IS BEING PROCESSED #
- # 1=DEF, 2=IFEQ, 3=ENDIF #
- ITEM TC; # TO CHAR IN -CONDNAME- #
- ITEM TW; # TO WORD IN -ACOND- #
- ARRAY ACOND [0:1] S(2) ; # ARRAY OF SCRATCH CONDITIONAL STUFF#
- BEGIN
- ITEM CONDNAME C(00,00,10); # NAME OF THESKIPITEM #
- ITEM CONDENTRY I(01,24,18); # ENTRY NUM. INTO SKIPTBL FOR #
- # THIS NAME #
- ITEM CONDVALUE I(01,42,18); # VALUE OF THIS NAME/NUMBER #
- END
- ARRAY SKIPTBL [1:25] S(2); # HOLDS THE TABLE OF SKIP ITEMS #
- BEGIN
- ITEM SKIPNAME C(00,00,10); # NAME OF THE ITEM #
- ITEM SKIPVALUE I(01,42,18); # VALUE OF THE ITEM #
- END
- FW = 0; # FROM-WORD IS FIRST WORD #
- DIRFLAG = 1; # ASSUME IT IS A DIRECTIVE #
- IF C<0,7>INWORD[0] EQ "#EJECT#"
- THEN
- BEGIN
- SCALL PRNTHDR;
- RETURN;
- END
- SCALL CHKLINO; # INCREMENT LINENO OR PAGENO #
- IF C<0,4>INWORD[0] EQ "DEF " THEN
- BEGIN
- FC = 3; # LAST CHAR POS CHECKED HERE #
- DIRCODE = 1; # CODE FOR DEF #
- END
- ELSE
- IF C<0,5>INWORD[0] EQ "IFEQ " THEN
- BEGIN
- FC = 4; # LAST CHAR POS CHECKED HERE #
- DIRCODE = 2; # CODE FOR IFEQ #
- END
- ELSE
- IF C<0,6>INWORD[0] EQ "ENDIF " THEN
- BEGIN
- DIRCODE = 3; # CODE FOR -ENDIF- #
- SKIPFLG = 0; # TERMINATE SKIPPING #
- RETURN;
- END
- ELSE
- BEGIN
- DIRFLAG = 0; # NOT A DIRECTIVE #
- RETURN;
- END
- FOR TW = 0 STEP 1 UNTIL 1 DO # FOR EACH OF THE TO-WORDS #
- BEGIN
- CONDNAME[TW] = " "; # INITIALIZE NAME TO BLANKS #
- CONDVALUE[TW] = 0; # INITIALIZE VALUE TO ZERO #
- CONDENTRY[TW] = 0; # NULL ENTRY POS IN -SKIPTBL- IS 0 #
- DIGIT = FALSE; # START WITH ASSUMPTION OF NOT DIGIT#
- FOR TC = 0 STEP 1 UNTIL 9 DO # FOR EACH POSSIBLE CHAR POS #
- BEGIN
- SCALL GETCHAR; # MOVE NEXT CHAR TO -AINCHAR- #
- IF TYPE EQ CHARTYPE"DELIMITER" THEN
- TEST TW; # MARKS THE END OF THIS TOKEN #
- IF TYPE EQ CHARTYPE"NUMERIC" AND TC EQ 0 THEN
- DIGIT = TRUE; # FIRST CHAR NUMERIC...INT LITERAL #
- IF DIGIT THEN # IF AN INTEGER LITERAL #
- IF TYPE EQ CHARTYPE"NUMERIC" THEN # ADD IN NUMBER VALUE #
- CONDVALUE[TW] = CONDVALUE[TW] * 10 + INCHARI[0] - O"33";
- ELSE #ONLY NUMERIC ALLOWED IN INT LITERAL#
- BEGIN
- TC = 10; # TO FORCE OUT OF -TC- LOOP #
- TEST TC; # WHERE WE SKIP TO NEXT DELIMITER #
- END
- ELSE
- C<TC,1>CONDNAME[TW] = INCHARC[0];
- END
- FOR TYPE = TYPE WHILE TYPE NQ CHARTYPE"DELIMITER" DO
- SCALL GETCHAR; # SKIP TO NEXT DELIMITER #
- END
- FOR I = 0 STEP 1 UNTIL 1 DO # FOR EACH OF THE SCRATCH ENTRIE#
- IF CONDNAME[I] NQ " " THEN # HAVE AN ITEM NAME...FIND IT #
- BEGIN
- FOR J = 1 STEP 1 UNTIL TOPENTRY DO # FOR EACH SKIP ITEM #
- IF SKIPNAME[J] EQ CONDNAME[I] THEN
- BEGIN
- CONDVALUE[I] = SKIPVALUE[J]; # SCRATCH ITEM GETS VALUE #
- CONDENTRY[I] = J; # ALSO ENTRY POSITION #
- TEST I; # FOUND THIS ONE, GO BACK FOR MORE #
- END
- TOPENTRY = TOPENTRY + 1; # NOT FOUND IN TABLE..ALLOCATE ENTRY#
- SKIPNAME[TOPENTRY] = CONDNAME[I]; # NAME THE ENTRY #
- SKIPVALUE[TOPENTRY] = 0; # GIVE IT A NULL VALUE #
- CONDVALUE[I] = 0; # GIVE THE SCRATCH ITEM NULL ALSO #
- CONDENTRY[I] = TOPENTRY; # ITS ENTRY POS IS THE TOP #
- END
- IF DIRCODE EQ 1 THEN # IF A -DEF- DIRECTIVE #
- BEGIN
- SKIPVALUE[CONDENTRY[0]] = CONDVALUE[1]; # IT RECEIVES VALUE #
- RETURN; # -DEF- ALL DONE. #
- END
- IF DIRCODE EQ 2 THEN # IT IS AN -IFEQ- DIRECTIVE #
- BEGIN
- IF CONDVALUE[0] NQ CONDVALUE[1] THEN SKIPFLG = 1; # SKIPPING #
- ELSE SKIPFLG = -1; # SIGNIFIES A GOOD COMPARE #
- RETURN; # -IFEQ- ALL DONE #
- END
- END
- CONTROL EJECT;
- PROC CHKLINO;
- #**********************************************************************#
- # #
- # CHKLINO #
- # #
- #ROUTINE WHICH ADDS 1 TO LINE NO AND COMPARES LINE NO TO LINE LIMIT. #
- #IF LINENO = LINELIMIT CALLS PRNTHDR TO PRINT HEADER AND RESET LINE NO #
- # #
- #ENTRY CONDITIONS #
- # LINENO AND PAGENO EQUAL LINE NUMBER AND PAGE NUMBER OF LAST LINE #
- # ANOTHER LINE IS ABOUT TO BE PRINTED #
- # #
- #EXIT CONDITIONS #
- # LINENO AND PAGENO = LINE AND PAGE NUMBER OF LINE ABOUT TO BE PRINTED#
- # USES SYNORL, CTEMP, ITEMP #
- # #
- BEGIN
- IF LINENO LS LINELIMIT THEN
- BEGIN
- LINENO = LINENO + 1; #INCREMENT LINE NO. IF ROOM ON PAGE #
- END
- ELSE
- BEGIN
- SCALL PRNTHDR; #PRINT HDR, RESET PAGENO, LINENO #
- END
- RETURN;
- END
- CONTROL EJECT;
- PROC PRNTHDR;
- #**********************************************************************#
- # #
- # PRNTHDR #
- # #
- #ROUTINE TO RESET LINENO AND PAGENO TO FIRST LINE ON NEXT PAGE AND #
- #PRINT HEADER AT TOP OF PAGE #
- # #
- #ENTRY CONDITIONS #
- # PAGENO = PAGE NUMBER OF LAST LINE ON OUTPUT FILE #
- # HEADER IN ARRAY HEADERLINE #
- # #
- #EXIT CONDITIONS #
- # HEADER PRINTED AT TOP OF NEXT PAGE #
- # LINENO AND PAGENO SET TO FIRST LINE ON NEXT PAGE #
- # USES SYNORL, CTEMP, ITEMP #
- # #
- #EXTERNAL REFERENCES #
- # SYNPRNT OUTPUT HEADER LINE AND TRIPLE SPACE LINE #
- # #
- BEGIN
- LINENO = 0; #RESET LINE NO #
- PAGENO = PAGENO + 1; #INCREMENT PAGE NO BY 1 #
- IF LFLAG NQ 0 THEN #IF LISTING BEING WRITTEN, NOT L=0 #
- BEGIN
- ITEMP = PAGENO; #INPUT PARAMETER TO BINTODISPDEC #
- SCALL BINTODISPDEC; #CONVERT PAGENO TO DISPLAY CODE DEC #
- HDRPAGENO[0] = CTEMP; #TRANSFER OUTPUT FROM BINTODISPDEC #
- SYNORL = 125;
- SYNPRNT(HEADERLINE); #PRINT HEADER LINE #
- SYNORL = 8;
- SYNPRNT("- "); #PRINT TRIPLE SPACE #
- END
- RETURN;
- END
- CONTROL EJECT;
- #**********************************************************************#
- # #
- # S Y N G E N #
- # #
- #THE SYSTEMS COMMUNICATION AREA MUST BE EXAMINED FOR PARAMETERS IN THE #
- #SYNGEN CONTROL CARD CALL. POSSIBILITIES ARE: #
- #SYNGEN CONTROL STATEMENT. NOTE - ONLY THE FIRST CHARACTER OF EACH #
- #PARAMETER IS USED TO CHECK AGAINST THE OPTION LIST. PARAMETER VALUES #
- #FOR FILENAMES ARE ACCEPTED UP TO SEVEN CHARACTERS LONG. THE #
- #POSSIBLE OPTIONS ARE: #
- # #
- # ABORT - OPTION TO CAUSE SYNGEN TO ABORT AFTER ALL COMPILATIONS IF #
- # ANY SOURCE ERRORS OCCURED. IF OMITTED, SYNGEN WILL JUST #
- # TERMINATE NORMALLY IF ERRORS HAVE OCCURRED. #
- # L=LFN - LFN OF THE FILE SYNGEN WILL WRITE A LISTING OF INPUT PLUS #
- # CROSS-REFERENCE AND DIAGNOSTICS REFERENCES. ALSO DIAGNOSTICS #
- # OF BAD INPUT. L=0 SUPPRESSES ALL OUTPUT EXCEPT DIAGNOSTICS. #
- # DEFAULT LFN IS OUTPUT #
- # I=LFN - LFN OF THE FILE SYNGEN IS TO USE AS IT"S INPUT FILE. THE #
- # THE DEFAULT NAME IS INPUT (SYSTEM INPUT FILE). #
- # O=LFN - LFN OF THE FILE SYNGEN IS TO USE FOR THE PRESET ARRAYS (THE #
- # DRIVING TABLES FOR SYNTAX ANALYZERS) WHICH IT BUILDS. #
- # DEFAULT NAME IS COMPILE. #
- # NOREWIND - FLAG INDICATING THE REQUEST FOR NOT REWINDING ALL FILES AT#
- # END OF SYNGEN EXECUTION. THE DEFAULT CASE IS REWINDING ALL #
- # FILES USED BY SYNGEN. #
- # T=1 - TRACEM TABLE IS BUILT. THE DEFAULT IS NO TRACE TABLE #
- # WHICH CORRESPONDS TO THE SYNTBLE, IS BUILT AND WRITTEN ON THE#
- # FILE WHICH IS TO CONTAIN ALL THE OTHER PRESET ARRAYS. #
- # CARDCOL=11 - SPECIFIES THAT THE KEYWORDS AND SUBROUTINE NAMES WILL BE#
- # OFFSET 10 COLUMNS TO THE RIGHT. #
- # #
- # OBSOLETE OPTIONS: #
- # #
- # P=PROC - NAME OF THE PROC TO BE COMPILED BY SYNGEN. THIS WILL BE THE #
- # NAME USED IN THE SYMPL SOURCE. THE USE OF THIS OPTION IS #
- # DISCOURAGED. THE PROC NAME SHOULD INSTEAD BE GIVEN ON THE #
- # FIRST SOURCE LINE GIVEN TO SYNGEN. THIS LINE SHOULD CONTAIN #
- # *PROC XXXXXXX* (FOR EXAMPLE) WITH THE *P* IN COLUMN 1. #
- # MULTIPLE PROCS CAN BE COMPILED BY ENDING EACH PROC WITH #
- # *TERM* IN COLUMN 1, THEREAFTER FOLLOWED BY THE NEXT #
- # *PROC XXXXXXX* IN COLUMN 1. #
- # #
- # #
- # ERRORS DIAGNOSED: ERRORS IN THE SYNGEN CONTROL CARD CAUSE A DAYFILE #
- # DIAGNOSTIC MESSAGE AND THE JOB IS ABORTED. #
- BEGIN
- LFLAG = 1; #INITIALIZE CONTROL CARD OPTIONS TO THE #
- INFILE = O"11162025240000000000";#DEFAULT VALUES. #
- OUTFILE = O"03171520111405000000";
- LSTFILE = O"17252420252400000000";
- TFLAG = 0;
- REWIND = 1;
- ERRORFLAG = 0;
- P<RA> = 2;
- J = NRCCPARAMS[50] - 1; #PICK NR OF PARAMS FOR INDEXING. #
- FOR I=0 STEP 2 UNTIL J DO
- BEGIN
- CTEMP = CCPARAM[I]; #ISOLATE 1ST CHAR IN CONTROL CARD PARAM.#
- IF CTEMP EQ "A" THEN # IF ABORT OPTION SPECIFIED BY USER #
- BEGIN
- ABTFLAG = TRUE; # ABORT-ON-ERRORS REQUESTED #
- I = I - 1; # THIS PARAM TAKES UP ONLY ONE WORD #
- TEST I;
- END
- IF CTEMP EQ "L" THEN #LISTING OPTION MAY BE SPECIFIED BY USER#
- BEGIN
- IF CCPARAM[I+1] NQ "0" THEN
- B<0,42>INWORD[2] = CCFILENAME[I+1];
- ELSE LFLAG = 0;
- TEST I;
- END
- IF CTEMP EQ "T" THEN #TRACE OPTION SPECIFIED BY USER MAY ONLY#
- BEGIN #BE FOLLOWED BY A ZERO, TURNING OFF THE #
- IF CCPARAM[I+1] NQ "0" THEN #OPTION AND FLAG. #
- TFLAG = 1;
- ELSE TFLAG = 0;
- TEST I;
- END
- IF CTEMP EQ "I" THEN #INPUT FILE OPTION IS EXERCISED BY THE #
- BEGIN #USER. #
- B<0,42>INWORD[0] = CCFILENAME[I+1];
- TEST I;
- END
- IF CTEMP EQ "O" THEN #OUTPUT FILE OPTION IS EXERCISED BY #
- BEGIN #THE USER. #
- B<0,42>INWORD[1] = CCFILENAME[I+1];
- TEST I;
- END
- IF CTEMP EQ "N" THEN #NOREWIND OPTION IS EXERCISED BY THE #
- BEGIN #USER. #
- I = I - 1; #THIS PARAM TAKES UP ONLY ONE WORD. #
- REWIND = 0;
- TEST I;
- END
- IF CTEMP EQ "C" THEN #KEYWORDS AND SUBROUTINE NAMES START IN #
- BEGIN #A COLUMN OTHER THAN ONE. #
- IF B<0,12>CCFILENAME[I+1] EQ O"3434" THEN #ONLY VALID #
- WORD1 = 1; #VALUE IS CARDCOL = 11. #
- ELSE ERRORFLAG = 1;
- TEST I;
- END
- IF CTEMP EQ "P" THEN #PROC NAMING OPTION EXERCISED. #
- BEGIN
- PNAME[0] = " PROC ";
- PNAME[1] = " ";
- K = 42;
- L = 0;
- FOR M=0 STEP 6 UNTIL 36 DO
- BEGIN
- ITEMP = B<M,6>CCFILENAME[I+1];
- IF ITEMP EQ 0 THEN
- GOTO ENDWITHSEMI;
- B<K,6>PNAME[L] = ITEMP;
- IF K GR 53 THEN
- BEGIN
- K = 0;
- L = 1;
- END
- ELSE K = K + 6;
- END
- ENDWITHSEMI:
- B<K,6>PNAME[L] = ";";
- TEST I;
- END
- ERRORFLAG = 1; #ERROR IF PARAM NOT ONE OF ABOVE. #
- END
- IF ERRORFLAG NQ 0 THEN #CONTROL CARD ERRORS CAUSE A JOB #
- SYNABT(1); #ABORT. #
- SYNOPEN; #SYNOPEN IS A COMPASS ROUTINE WHICH #
- #OPENS ALL FILES TO BE USED IN THIS #
- #SYNGEN RUN. #
- LASTAVAIL = B<0,60>INWORD[0] - 1; #PTR RETURNED BY SYNOPEN. #
- IF LASTAVAIL GR O"77777" THEN #HASHEDTABLE ENTRIES HAVE ONLY 15 #
- LASTAVAIL = O"77777"; #BITS FOR POINTERS, SO 77777 IS THE MOST#
- #CORE USABLE BY THIS VERSION. IF MORE #
- #CORE IS NECESSARY, THE SYMBOL TABLE #
- #ENTRIES MAY BE ADDRESSED RELATIVE TO #
- #THE HIGH END OF FL, RATHER THAN #
- #DIRECTLY. #
- OLD65 = NEXTAVAIL[51];
- OLDLA = LASTAVAIL;
- SCALL SYNTIDA; #SET TIME AND DATE INTO HEADER #
- HDRDATE1[0] = HDRDATE;
- HDRTIME1[0] = HDRTIME;
- PROCLOOP:
- # THE FOLLOWING IS CODE TO PRESET CM FOR A COMPILE OF A PROGRAM #
- NEXTAVAIL[51] = OLD65;
- P<SYNTBLE> = NEXTAVAIL[51]; # INITIAL POSITION OF SYNTBLE #
- SYNTBLEWORD = 1; # FIRST AVAILABLE WORD ADDRESS IN #
- # PSEUDO-WA FILE *SYNTBLE* #
- LASTAVAIL = OLDLA;
- FOR I = OLD65-2 STEP 1 UNTIL LASTAVAIL-2 DO FULLWORD[I] = 0;
- COUNTER = 0;
- ERRORCOUNT = 0;
- LABELCOUNTER = 0;
- SECTIONWORD = 0;
- SYMBOLTYPE = O"23";
- SYMBOLLENGTH = 2;
- SYNTBLEPARCL = 0;
- UNDEFSYMBOLS = 0;
- KEY1PTR = 0;
- KEY2PTR = 0;
- KEY3PTR = 0;
- BP = 0;
- STATE = 0;
- FOR I = 0 STEP 1 UNTIL 127 DO HASHENTRY[I] = 0;
- FOR I = 0 STEP 1 UNTIL 26 DO LOCWRD[I] = 0;
- FIRSTSUBLABL = 0;
- SECTIONWORD = 0;
- LASTRANSFER = 0;
- FIRSTCHAR = 0;
- CURRENTLABEL[0] = 0;
- CURRENTLABEL[1] = 0;
- CURRENTLABEL[2] = 0;
- INS$EXT = S"INSERT";
- P<SYMBOLTABLE> = 0;
- CHRPTR = 73;
- PTC = FALSE;
- SYNEOF = 0;
- ENDINP; # REWIND THE XREF FILES #
- OUTLEN = 60; # SET LENGTH FOR COMPILE RECORDS #
- LEXBUILD; #LEXBUILD IS A SYMPL PROC WHICH #
- #BUILDS THE LEXICON TABLES. #
- ITEMP = (OLDLA - LASTAVAIL) + (P<SYNTBLE> + SYNTBLEWORD);
- IF ITEMP GR FL
- THEN
- BEGIN
- FL = ITEMP; # MAINTAIN -FL- AS MAXIMUM FL #
- END
- P<SYNTBLE> = NEXTAVAIL[51]; # POSITION TO END OF LEXICAL TABLES #
- IF LFLAG NQ 0 THEN
- BEGIN
- HDRTITLE[0] = "INPUT SEMANTIC ROUTINES ";
- SCALL PRNTHDR; #START NEXT PAGE WITH HEADER #
- END
- SUBRBUILD; #SUBRBUILD IS A SYMPL PROC WHICH #
- #BUILDS A SUBROUTINE NAME TABLE FOR #
- #LATER IN BUILDING THE SYNTAX TABLE.#
- IF LFLAG NQ 0 THEN
- BEGIN
- HDRTITLE[0] = "INPUT SYNTAX SPECIFICATIONS ";
- SCALL PRNTHDR;
- END
- P<STATETRANS> = LOC(STATTRNS);#BUG IN SYMPL COMPILER COULD NOT #
- #PRESET A 2-D ARRAY, SO HAD TO PRESET A #
- #1-D ARRAY AND SET A 2-D BASED ARRAY TO #
- #IT FOR USE. #
- SYNBUILD; #SYNBUILD IS A SYMPL PROC WHICH #
- #CONSTRUCTS THE OUTPUT PRESET ARRAYS#
- #SYNTBLE, LBLPTRS, AND TRACEM, AS #
- #WELL AS THE CROSS REFERENCE FILES, #
- #IF LFLAG IS SET TO ONE. #
- SYNCOPY(SYNTBLEWORD); #COMPASS RTN WHICH COPIES SYNTBLE AND #
- #TRACEM. #
- CONLEXTABLES; #RTN WHICH CONVERTS BINARY LEXICON #
- #TABLES TO OUTPUT DISPLAY CODE AND #
- #WRITES THEN OUT. #
- IF NOT PTC THEN
- SYNCOM (" END
- ");
- ELSE
- BEGIN
- OUTLEN = 90;
- PTCTRANS:
- SYNREAD;
- IF C<0,3>INWORD[0] EQ "END" OR REALEOF GR 0 THEN GOTO PTCEOF;
- SYNCOM(SYNIWSA);
- GOTO PTCTRANS;
- PTCEOF: # #
- END
- SYNCOM(" END
- ");
- SYNCOM(" TERM;
- ");
- IF LFLAG NQ 0 THEN #IF THE USER REQUESTED A LISTING, #
- SYNXREF; #SYNREF IS A SYMPL ROUTINE WHICH #
- #SORTS THE CROSS REFERENCE LISTS AND#
- #PRINTS THEM. #
- ITEMP = (OLDLA - LASTAVAIL) + (P<SYNTBLE> + SYNTBLEWORD);
- IF ITEMP GR FL THEN FL = ITEMP; # MAINTAIN -FL- AS MAXIMUM FL #
- ERRORS = ERRORS + ERRORCOUNT; # MAINTAIN TOTAL ERRORS #
- IF REALEOF EQ 0 THEN GOTO PROCLOOP;
- WRAPUP: # #
- # ROUND THE MAXIMUM FL UP TO THE NEXT 100B WORDS #
- ITEMP = ((FL + O"100") / O"100") * O"100";
- BINTODISPOCT;
- ITEMP = ERRORS; # TOTAL ERRORS IN THIS RUN #
- BINTODISPDEC;
- SYNCLSE(CTEMP,OCTAL[1]); #SYNCLSE IS A COMPASS ROUTINE WHICH #
- #WRITES OUT THE PRESET ARRAYS WHICH HAVE#
- #BEEN BUILT BY SYNGEN, THEN CLOSES ALL #
- #THE FILES USED IN THIS SYNGEN RUN. #
- IF ABTFLAG # IF ABORT-ON-ERRORS REQUESTED #
- AND (ERRORS NQ 0) # AND ERRORS DID OCCUR #
- THEN
- BEGIN
- SYNABT(5); # SOURCE ERRORS -- ABORT REQUESTED #
- END
- STOP; # NORMAL TERMINATION OF SYNGEN #
- END
- CONTROL EJECT;
- #**********************************************************************#
- # #
- # SYNALLOCATE #
- # #
- #**********************************************************************#
- #FUNCTION WHICH ALLOCATES SPACE WITHIN THE JOB"S FIELDLENGTH, IN A CON-#
- #TIGUOUS FASHION, AND RETURNS A POINTER TO THE FWA OF THE ALLOCATED #
- #SPACE. THE LWA OF AVAILABLE SPACE IS OBTAINED FROM RA+54 AND THE FWA #
- #OF AVAILABLE SPACE IS OBTAINED FROM RA+53. AS SPACE IS ALLOCATED, RA+ #
- #53 OR RA+54 IS UPDATED. A NEGATIVE SIZE REQUEST IS ALLOCATED FROM FL #
- #BACKWARDS WHILE A POSITIVE SIZE REQUEST IS ALLOCATED FROM LWA CURRENT-#
- #LY ALLOCATED FORWARDS TOWARDS FL. #
- # ERRORS DIAGNOSED: REQUESTS THAT EXCEED THE JOB"S FIELDLENGTH RESULT #
- # IN DIAGNOSTIC MESSAGES FOLLOWED BY A HALT. #
- # #
- FUNC SYNALLOCATE(SIZE);
- BEGIN
- ITEM SIZE; #SIZE OF THE SPACE REQUESTED. #
- IF (P<SYNTBLE> + SYNTBLEWORD + ABS(SIZE)) GR LASTAVAIL
- THEN # THEN NOT ENOUGH ROOM FOR -SIZE- #
- BEGIN
- SYNABT(0); # INSUFFICIENT FL MESSAGE AND ABORT #
- END
- IF SIZE LS 0 THEN
- GOTO NEGSIZE;
- NEXTAVAIL[51] = NEXTAVAIL[51] + SIZE;#UPDATE PTR TO NEXT WORD #
- IF NEXTAVAIL[51] GR P<SYNTBLE> THEN # MOVE SYMTBLE OUT OF THE #
- BEGIN # WAY OF THE NEW TABLE #
- P<SORT> = NEXTAVAIL[51];
- FOR I = SYNTBLEWORD STEP -1 UNTIL 0 DO
- SORTWORD[I] = SYNTBLEWD[I];
- P<SYNTBLE> = P<SORT>;
- END
- SYNALLOCATE = NEXTAVAIL[51] - SIZE;#AVAILABLE AND RETURN PTR TO #
- RETURN; #ALLOCATED SPACE. #
- NEGSIZE:
- LASTAVAIL = LASTAVAIL + SIZE;#UPDATE PTR TO END OF AVAILABLE #
- SYNALLOCATE = LASTAVAIL + 1; #SPACE AND RETURN PTR TO THE ALLOCAT#
- RETURN; # ED SPACE. #
- END
- CONTROL EJECT;
- #*********************************************************************#
- # LEXBUILD #
- #*********************************************************************#
- PROC LEXBUILD;
- BEGIN
- HDRPROC[0] = " "; #BLANK FILL PROC NAME #
- HDRPROC1[0] = " ";
- HDRTITLE[0] = "INPUT KEYWORDS ";
- PAGENO = 0; #FORCE SYNREAD TO PRINT HEADER AT PAGE 1#
- LINENO = LINELIMIT; #ON NEXT (NONEOF) READ #
- P<SYN1SCRATCH> = SYNALLOCATE(750); # ALLOCATE SPACE FOR ONE #
- P<SYN2SCRATCH> = SYNALLOCATE(500); #TWO #
- P<SYN3SCRATCH> = SYNALLOCATE(300); #THREE WORD KEYWORDS #
- SYNREAD;
- IF REALEOF GR 0 THEN GOTO WRAPUP;
- IF C<0,4>INWORD[0] NQ "PROC" THEN GOTO READKEYWD1;
- PNAME[0] = " ";
- PNAME[1] = INWORD[0];
- PNAME[2] = INWORD[1];
- PNAME[3] = ";";
- HDRPROC[0] = INWORD[0]; #INSERT PROC **** IN HEADER #
- HDRPROC1[0] = INWORD[1];
- READKEYWRD: # #
- SYNREAD; # READ KEYWORD LIST (80 CHAR). #
- READKEYWD1:
- IF SYNEOF GR 0 THEN #STOP IF EOF ENCOUNTERED. #
- SYNABT(2);
- IF C<0,1>INWORD[WORD1] EQ " " THEN #IF 1ST CHAR IS BLANK THE CARD#
- GOTO READKEYWRD; #IS ASSUMED BLANK AND SKIPPED. #
- IF WORD1 NQ 0 THEN # MOVE WORDS 1,2 TO 0,1 AND IGNORE #
- BEGIN # WORD 0. #
- INWORD[0] = INWORD[1];
- INWORD[1] = INWORD[2];
- INWORD[2] = " ";
- END
- IF INWORD[0] EQ "+" AND #A + MAY BE A KEYWORD OR TERMINATOR.#
- C<6,4>INWORD[3] EQ " " THEN # IF NO LEXID FIELD, ASSUME #
- BEGIN #CARD IS TERMINATOR. #
- IF KEY1PTR EQ KEY2PTR AND #IF NO KEYWORDS READ BEFORE + THEN #
- KEY2PTR EQ KEY3PTR AND #NO LEXICON TO BUILD. #
- KEY3PTR EQ 0 THEN
- RETURN;
- NUMBER1WRD = KEY1PTR - 2; # SET KEYWORD SECTION BOUNDRIES.#
- NUMBER2WRD = KEY2PTR - 3; # #
- NUMBER3WRD = KEY3PTR - 4; # #
- GOTO PASS1; # #
- END
- K = 0; # WORD POINTER IN FOR-LOOP. #
- J = 0; # CHARACTER POINTER IN FOR-LOOP.#
- FOR I=0 STEP 1 UNTIL 29 DO # SCAN THE INPUT WORKING STORAGE#
- BEGIN # AREA FOR A BLANK. THE FIRST #
- IF B<J,6>INWORD[K] EQ O"55" # OCCURENCE OF A BLANK TERMINATE#
- THEN GOTO CHECKLENGTH; # S THE KEYWORD NAME. AT THE #
- # COMPLETION OF THE FOR-LOOP "I"#
- # WILL CONTAIN THE LENGTH OF THE#
- # KEYWORD. #
- IF J EQ 54 THEN # CHECK IF COMPLETE WORD HAS #
- BEGIN # BEEN SCANNED. IF IT HAS THEN #
- J = 0; # SET CHAR PTR (J) TO POINT TO #
- # THE 1ST CHAR OF THE NEXT WORD,#
- K = K + 1; # INCREMENT THE WORD PTR (K) TO #
- END # POINT TO THE NEXT WORD. #
- ELSE # #
- J = J + 6; # INCREMENT J TO POINT TO THE #
- END # NEXT CHARACTER. #
- CHECKLENGTH: # #
- B<J,60-J>INWORD[K] = " ";#BLANK REST OF WORD AS INSUR- #
- # ANCE. #
- IF I LS 11 THEN GOTO ONEKEYWORD; # CHECK FOR A "1" WORD KEYWORD. #
- IF I LS 21 THEN GOTO TWOKEYWORD; # CHECK FOR A "2" WORD KEYWORD. #
- # #
- KEY3WRD[KEY3PTR] = INWORD[0]; # STORE "FIRST" #
- KEY3WRD[KEY3PTR + 1] = INWORD[1];# "SECOND" #
- KEY3WRD[KEY3PTR + 2] = INWORD[2];# "THIRD" WORD OF THE #
- # KEYWORD IN A SCRATCH WORKING #
- # STORAGE AREA. #
- KEY3PTR = KEY3PTR + 4; # INCREMENT KEY3PTR TO POINT TO #
- # WHERE THE NEXT KEYWORD IS TO #
- # BE PLACED. #
- LEXPTR = KEY3PTR - 1; # POINTER TO WORD POSITION WHERE#
- # ID,P1,P2 AND SECT ARE TO BE #
- # PLACED. #
- P<LEXICON> = LOC(SYN3SCRATCH); # ARRAY FOR ACCESSING ID,P,P2 #
- # AND SECT. #
- GOTO MOVELEXICON; # #
- TWOKEYWORD: # #
- KEY2WRD[KEY2PTR] = INWORD[0]; # STORE "FIRST" #
- KEY2WRD[KEY2PTR + 1] = INWORD[1];# "SECOND" WORD OF THE #
- # KEYWORD IN A SCRATCH WORKING #
- # STORAGE AREA. #
- KEY2PTR = KEY2PTR + 3; # INCREMENT KEY2PTR TO POINT TO #
- # WHERE THE NEXT KEYWORD IS TO #
- # BE PLACED. #
- LEXPTR = KEY2PTR - 1; # POINTER TO WORD POSITION WHERE#
- # ID,P1,P2 AND SECT ARE TO BE #
- # PLACED. #
- P<LEXICON> = LOC(SYN2SCRATCH); # ARRAY FOR ACCESSING ID,P,P2 #
- GOTO MOVELEXICON; # AND SECT. #
- ONEKEYWORD: # #
- P<LEXICON> = LOC(SYN1SCRATCH); # #
- LEXWRD[KEY1PTR] = INWORD[0]; # STORE THE KEYWORD IN THE KEY- #
- # WORD ARRAY. #
- KEY1PTR = KEY1PTR + 2; # INCREMENT KEY1PTR TO POINT TO #
- # WHERE THE NEXT KEYWORD IS TO #
- # BE PLACED. #
- LEXPTR = KEY1PTR - 1; # POINTER TO WORD POSITION WHERE#
- # ID=P1,P2 AND SECT ARE TO BE #
- # PLACED. #
- MOVELEXICON: # #
- CTEMP = C<5,5>INWORD[3]; # CONVERT LEXID AND STORE IT. #
- DISPOCTTOBIN;
- LEXID[LEXPTR] = ITEMP;
- CTEMP = C<5,5>INWORD[4]; # CONVERT P1 AND STORE IT. #
- DISPOCTTOBIN;
- LEX1PARAM[LEXPTR] = ITEMP;
- CTEMP = C<5,5>INWORD[5]; # CONVERT P2 AND STORE IT. #
- DISPOCTTOBIN;
- LEX2PARAM[LEXPTR] = ITEMP;
- IF C<0,1>INWORD[3] EQ "*" THEN # CHECK FOR AN * IN COL 31. IF #
- LEXSYNSECT[LEXPTR] = -1; # THERE IS AN * PRESENT, SET #
- ELSE # LEXSYNSECT TO 1. IF THERE IS #
- LEXSYNSECT[LEXPTR] = 0; # NO * SET LEXSYNSECT TO 0. AN #
- # * INDICATES THAT THERE IS A #
- # LABELED SECTION NAME IN THE #
- # SYNTAX STATEMENTS THAT IS IDEN#
- # TICAL TO THIS KEYWORD. #
- GOTO READKEYWRD; # READ NEXT RECORD OF THE KEY- #
- # WORD LIST. #
- PASS1:
- P<LEXICON> = LOC(SYN1SCRATCH); # POINTER TO 1 WRD KEYWRD BUFFER#
- MAXKEYWRDS = NUMBER1WRD; # STORE NUMBER OF 1 WORD KEYWRDS#
- K = 2; # VALUE THAT LEXPTR IS INCREMENT#
- # ED BY. #
- I = 0; # BEGINNING BIT POSITION OF #
- # ENTRIES FIELD IN LEXWORDLOC. #
- J = 6; # BEGINNING BIT POSITION OF #
- # INDEX TO KEYWRD LIST FIELD IN #
- # LEXWORDLOC. #
- TOTALWORDS = 0; # INITIALIZE LEXWORDS WORD CNTR.#
- GOTO INITWRDLOC; # PROCESS KEYWORD. #
- PASS2:
- IF NUMBER2WRD LS 0 THEN # IF NO 2-WORD KEYWORDS, THEN GO#
- GOTO PASS3; # DO 3-WORD KEYWORDS. #
- P<LEXICON> = LOC(SYN2SCRATCH); # POINTER TO 2 WRD KEYWRD BUFFER#
- MAXKEYWRDS = NUMBER2WRD; # STORE NUMBER OF 2 WORD KEYWRDS#
- K = 3; # VALUE THAT LEXPTR IS INCREMENT#
- # ED BY. #
- I = 18; # BEGINNING BIT POSITION OF #
- # ENTRIES FIELD IN LEXWORDLOC. #
- J = 24; # BEGINNING BIT POSITION OF #
- # INDEX TO KEYWRD LIST FIELD IN #
- # LEXWORDLOC. #
- GOTO INITWRDLOC; # PROCESS KEYWORD. #
- PASS3:
- IF NUMBER3WRD LS 0 THEN # IF NO 3-WORD KEYWORDS, THEN GO#
- GOTO COMPACTLEX; # COMPACT THE TABLE. #
- P<LEXICON> = LOC(SYN3SCRATCH); # POINTER TO 3 WRD KEYWRD BUFFER#
- MAXKEYWRDS = NUMBER3WRD; # STORE NUMBER OF 3 WORD KEYWRDS#
- K = 4; # VALUE THAT LEXPTR IS INCREMENT#
- # ED BY. #
- I = 36; # BEGINNING BIT POSITION OF #
- # ENTRIES FIELD IN LEXWORDLOC. #
- J = 42; # BEGINNING BIT POSITION OF #
- # INDEX TO KEYWRD LIST FIELD IN #
- # LEXWORDLOC. #
- INITWRDLOC:
- ENTRIES = 1; # INITIALIZE 1ST CHAR COUNTER. #
- LEXPTR = 0; # INITIALIZE PTR TO KEYWRD LIST.#
- BUILDWRDLOC:
- WRDLOCPTR = B<0,6>LEXWRD[LEXPTR];# SET PTR TO VALUE OF 1ST CHAR #
- IF WRDLOCPTR GQ O"33" OR # CHECK FOR START OF SPECIAL #
- WRDLOCPTR EQ 0 THEN # CHARACTERS. #
- GOTO SPECIALCHARS;
- SKIPBADKEY:
- IF LEXPTR EQ MAXKEYWRDS THEN # CHECK FOR END OF LEXICON SEC- #
- GOTO SETLEXWRDLOC; # TION. #
- KEYFIRSTCHAR = # STORE AND CONVERT THE FIRST #
- B<0,6>LEXWRD[LEXPTR + K]; # CHAR OF THENEXT KEYWORD. #
- IF WRDLOCPTR EQ KEYFIRSTCHAR THEN# CHECK IF KEYWORDS EQUAL EACH #
- # OTHER ON FIRST CHAR ONLY. #
- BEGIN
- ENTRIES = ENTRIES + 1; # INCREMENT FIRST CHAR COUNTER. #
- LEXPTR = LEXPTR + K; # INCREMENT TO NEXT ENTRY. #
- GOTO BUILDWRDLOC; # PROCESS NEXT KEYWORD. #
- END
- IF KEYFIRSTCHAR LS WRDLOCPTR THEN# CHECK FOR SEQUENCE. IF NEXT #
- BEGIN # KEYWORD IS OUT OF SEQUENCE #
- # ISSUE DIAGNOSTIC, AND THEN #
- # PROCECDE WITH BUILDING THE LEX#
- # WORDLOC TABLE. #
- IF KEYFIRSTCHAR EQ 0 THEN # IF 64 CHAR SET THEN 0 (:) IS A#
- GOTO SETLEXWRDLOC; # VALID SPECIAL CHARACTER. #
- SCALL CHKLINO;
- SYNORL = 70;
- FOR M=2 STEP 1 UNTIL K DO
- LSWORD[M+2] = LEXWRD[LEXPTR+K+M-2];
- FOR M=M STEP 1 UNTIL 4 DO
- LSWORD[M+2] = " ";
- SYNPRNT(LEXSEQ);
- CHKERRCNT;
- ENTRIES = ENTRIES + 1; # OUT-OF-ORDER KEYWORDS WILL BE #
- LEXPTR = LEXPTR + K; # HIDDEN IN THE LEXICON SECTION #
- GOTO SKIPBADKEY; # IN WHICH THEY WERE FOUND, AND #
- END # THEY ARE NOT RETRIEVABLE. #
- SETLEXWRDLOC:
- B<J,12>LOCWRD[WRDLOCPTR] = # STORE PTR TO 1ST KEYWORD OF #
- TOTALWORDS; # THIS CHAR SET INTO LEXWRDLOC. #
- B<I,6>LOCWRD[WRDLOCPTR] = ENTRIES;#STORE THE NUMBER OF ENTRIES #
- # IN LEXWORDLOC. #
- TOTALWORDS = TOTALWORDS + ENTRIES * K;#PTR TO START OF NEW CHAR- #
- IF LEXPTR GQ MAXKEYWRDS THEN # IF END OF SECTION, WHICH ONE. #
- BEGIN
- NEXTPASS:
- IF K EQ 2 THEN # GO DO TWO-WORD KEYWORDS. #
- GOTO PASS2;
- IF K EQ 3 THEN # GO DO THREE-WORD KEYWORDS. #
- GOTO PASS3;
- GOTO COMPACTLEX; # GO COMPRESS INTO ONE ARRAY. #
- END
- ENTRIES = 1; # RESET ENTRY COUNTER. #
- LEXPTR = LEXPTR + K; # SET KEYWORD PTR TO NEXT KEYWRD#
- IF KEYFIRSTCHAR GQ O"33" OR # CHECK FOR START OF SPECIAL #
- KEYFIRSTCHAR EQ 0 THEN # CHARACTERS. #
- BEGIN
- SPECIALCHARS:
- B<J,12>LOCWRD[0] = TOTALWORDS;#STORE PTR TO START OF SPECIAL #
- B<I,6>LOCWRD[0] = # CHARS. #
- (MAXKEYWRDS - LEXPTR)/K + 1;#STORE NR ENTRIES FOR SPEC #
- TOTALWORDS = TOTALWORDS + MAXKEYWRDS - LEXPTR + K;#CHARS AND #
- # INCREMENT TOTALWORDS COUNT. #
- GOTO NEXTPASS; # CHECK PASS NUMBER. #
- END
- GOTO BUILDWRDLOC; # FINISH CURRENT LEXICON SECTION#
- COMPACTLEX:
- J = KEY2PTR - 1; # NUMBER OF WORDS IN THE 2-WORD #
- # KEYWORD BUFFER. #
- FOR K=0 STEP 1 UNTIL J DO
- BEGIN
- KEY1WRD[KEY1PTR] = KEY2WRD[K];# MOVE THE 2-WORD KEYWORDS IN- #
- # THE ONE WORD KEYWORD BUFFER. #
- KEY1PTR = KEY1PTR + 1; # INCREMENT PTR TO NEXT WORD. #
- END
- J = KEY3PTR - 1; # NBR OF WORDS IN THE 3-WORD #
- # KEYWORD BUFFER. #
- FOR K=0 STEP 1 UNTIL J DO
- BEGIN
- KEY1WRD[KEY1PTR] = KEY3WRD[K];# MOVE THE 3-WORD KEYWORDS IN- #
- # TO THE 1 WORD KEYWORD BUFFER. #
- KEY1PTR = KEY1PTR +1; # INCREMENT PTR TO NEXT WORD. #
- END
- NEXTAVAIL[51] = LOC(KEY1WRD[KEY1PTR]);#RESET PTR TO LAST USED #
- # WORD + 1 AFTER COMPACTION. #
- P<LEXICON> = LOC(SYN1SCRATCH); # SET TO COMPACTED TABLE. #
- RETURN; # RETURN TO SYNCTRL. #
- END
- CONTROL EJECT;
- #**********************************************************************#
- PROC DISPOCTTOBIN; # CONVERTS DISPLAY-CODED OCTAL #
- BEGIN # (CTEMP) TO BINARY (ITEMP). #
- ITEMP = 0; # INITIALIZE RESULT TO 0. #
- FOR M=0 STEP 6 UNTIL 54 DO # CONVERT UP TO 10 CHARACTERS, #
- BEGIN # ONE AT A TIME. #
- N = B<M,6>CTEMP;
- IF N EQ O"55" THEN # BLANK TERMINATES INTEGER BUT #
- IF ITEMP EQ 0 THEN # LEADING BLANKS ARE IGNORED. #
- TEST M; # #
- ELSE RETURN; # #
- IF N LS O"33" OR # PUT OUT DIAGNOSTIC IF AN IL- #
- N GR O"42" THEN # LEGAL OCTAL DIGIT IS FOUND. #
- BEGIN
- IF LFLAG EQ 0 THEN #IF LFLAG=0 THEN CARD HAS NOT #
- BEGIN # BEEN PRINTED ON OUTPUT. #
- SYNORL = SYNIRL + 10;#LIST CARD WITH ERROR. #
- SYNPRNT(LOC(SYNIWSA)-1);
- END # #
- SCALL CHKLINO;
- SYNORL = 50;
- ITEMP = 0;# ZERO IS RETURNED. #
- SYNPRNT(BADOCTALMSG2);
- CHKERRCNT;
- RETURN; # ILLEGAL DIGIT TERMINATES CON- #
- END # VERSION. #
- ITEMP = ITEMP*2**3 + N - O"33";#ADD 3 NEW BITS TO LOW #
- END # ORDER OF RESULT. #
- END
- CONTROL EJECT;
- #********************************************************************#
- # SYNTBLR #
- # A PROC TO -READ- ENTRIES FROM THE SYMBOL/CODE TABLE #
- #********************************************************************#
- PROC SYNTBLR(RWSA, RWA);
- BEGIN
- ARRAY RWSA;
- ITEM RWSAWD;
- ITEM RWA;
- FOR P = 0 STEP 1 UNTIL 5 DO
- RWSAWD[P] = SYNTBLEWD[RWA + P];
- RETURN;
- END
- CONTROL EJECT;
- #********************************************************************#
- # SYNTBLW #
- # A PROC TO -WRITE- ENTRIES TO THE SYMBOL/CODE TABLE #
- #********************************************************************#
- PROC SYNTBLW(WWSA, WWA);
- BEGIN
- ARRAY WWSA;
- ITEM WWSAWD;
- ITEM WWA;
- IF LOC (SYNTBLEWD [WWA + 6 ]) GQ LASTAVAIL THEN
- SYNABT(0); # ABORT WITH SHORT FL #
- FOR P = 0 STEP 1 UNTIL 5 DO
- SYNTBLEWD[WWA + P] = WWSAWD[P];
- RETURN;
- END
- CONTROL EJECT;
- #**********************************************************************#
- PROC CONLEXTABLES;
- BEGIN
- ITEMP = KEY1PTR - 1; # NBR OF WORDS IN KEYWORD LIST. #
- M = ITEMP; # SAVE VALUE. #
- BINTODISPDEC; # CONVERT TO DISPLAY DECIMAL. #
- B<0,30>KEYHDR[2] = B<0,30>CTEMP; # STORE NUMBER OF WORDS IN THE #
- # LEXWORDS PRESET ARRAY. #
- SYNCOM(KEYWRDHDR);
- SYNCOM(KEYWRDITEM);
- M = M - (KEY2PTR + KEY3PTR);
- J = 1;
- L = 0;
- STORE:
- FOR K=0 STEP 1 UNTIL M DO # MOVE KEYWORDS INTO THE PRESET #
- BEGIN # ARRAY. #
- IF L EQ J THEN
- BEGIN
- L = 0;
- KEYLINE[4] = " ";
- IF B<45,15>KEY1WRD[K] EQ O"77776" THEN #IF NO LABELLED #
- BEGIN # SECTION OF SYNTBLE CORRESPONDS#
- B<45,15>KEY1WRD[K] = 0;#TO THIS KEYWORD AND THERE WAS#
- IF LFLAG EQ 0 THEN # AN * IN COL 31 OF INPUT CARD, #
- BEGIN # PRINT MESSAGE AND ZERO-OUT THE#
- SCRATCHWD[0] = " ";#LEXSYNSECT FIELD PRIOR TO #
- FOR I=1 STEP 1 UNTIL J DO # CONVERSION. #
- SCRATCHWD[I] = KEY1WRD[K-(J+1)+I];
- SYNORL = I * 10;
- SYNPRNT(SCRATCH);
- END
- SCALL CHKLINO;
- SYNORL = 68;
- SYNPRNT(NOSYNSECT);
- CHKERRCNT;
- END
- END
- ELSE
- BEGIN
- L = L + 1; # STORE KEYWORDS IN COMMENTS. #
- IF J EQ 1 THEN # EQIVALENCE SIGNS AND SEMICO- #
- IF KEY1WRD[K] EQ "#" THEN #LONS CAN AFFECT COMPILATION #
- KEYLINE[4] = "EQUIV SIGN";#IF PLACED IN COMMENTS, SO #
- ELSE IF KEY1WRD[K] EQ ";" THEN #THEY MUST BE REPLACED #
- KEYLINE[4] = "SEMICOLON ";#WITH NAMES. #
- ELSE KEYLINE[4] = KEY1WRD[K];
- ELSE KEYLINE[4] = KEY1WRD[K];#KEYWORD GOES IN COMMENT. #
- END
- ITEMP = KEY1WRD[K]; # ENTRY CONDITION FOR CONVERSION#
- BINTODISPOCT; # CONVERT KEYWRD TO DISPLAY OCT.#
- B<0,60>KEYLINE[1] = OCTAL[0];# STORE CONVERTED VALUE. #
- B<0,60>KEYLINE[2] = OCTAL[1];# #
- SYNCOM(KEYWRDLINE); # MOVE TO OUTPUT FILES. #
- END
- IF KEY1PTR NQ 0 THEN
- BEGIN
- IF KEY2PTR NQ 0 THEN
- BEGIN
- M = KEY2PTR - 1;
- J = 2;
- L = 0;
- KEY2PTR = 0;
- P<SYN1SCRATCH> = LOC(KEY1WRD[K]);
- GOTO STORE;
- END
- IF KEY3PTR NQ 0 THEN
- BEGIN
- M = KEY3PTR - 1;
- J = 3;
- L = 0;
- KEY3PTR = 0;
- P<SYN1SCRATCH> = LOC(KEY1WRD[K]);
- GOTO STORE;
- END
- END
- SYNCOM(KEYWRDTERM);
- SYNCOM(LEXICONHDR); # MOVE HEADER TO OUTPUT FILES. #
- SYNCOM(LEXICONITEM); # MOVE ITEM DEC TO OUTPUT FILES.#
- FOR K=0 STEP 1 UNTIL 26 DO
- BEGIN
- ITEMP = LOCWRD[K]; # STORE WORD OF THE LEXICON TBL.#
- BINTODISPOCT; # CONVERT WORD TO DISPLAY OCTAL.#
- B<0,60>LEXLINE[1] = OCTAL[0];# STORE CONVERTED VALUE. #
- B<0,60>LEXLINE[2] = OCTAL[1];# #
- SYNCOM(LEXICONLINE);
- END
- SYNCOM(LEXICONTERM); # WRITE TERMINATOR FOR THE LEX- #
- RETURN; # ICON PRESET ARRAY AND RETURN. #
- END
- CONTROL EJECT;
- #**********************************************************************#
- # #
- # SUBRBUILD #
- # #
- #PROC WHICH PLACES THE USER-SUPPLIED SUBROUTINE NAMES INTO A HASH-CODED#
- #TABLE FOR LATER USE BY SYNSCAN WHEN THE SYNTAX TABLE - SYNTABLE - IS #
- #BEING BUILT. THE CARDS IN THE INPUT FILE INTO SYNIWSA BY THE COMPASS #
- #ROUTINE SYNREAD. IF THE USER DEFAULTS THE SWITCH VECTOR ENTRY VALUES #
- #HE GETS CONSECUTIVE VALUES ASSIGNED IN THE ORDER THE NAMES ARE READ. #
- #IF THE USER REQUESTED A LISTING OF HIS INPUT, THE COMPASS ROUTINE #
- #SYNPRNT IS CALLED TO PRINT OUT THE CARD IMAGE WITH THE SWITCH VALUE #
- #ADDED IF DEFAULTED. THE SUBROUTINE NAMES ARE ENTERED INTO A HASH-CODED#
- #TABLE USING AN INDIRECT-CHAINING SCHEME: THE HASH CODE IS AN ADDRESS #
- #IN A TABLE OF POINTERS TO DATA ENTRIES, SYNONYMS BEING CHAINED #
- #TOGETHER IN A PUSHDOWN OR LIFO STACK. THE SYMPL ROUTINE SYNHASH SETS #
- #THE BASED ARRAY TABLENTRY TO THE PROPER POSITION FOR THE NEXT ENTRY, #
- #ALLOCATING SPACE AS NECESSARY BY CALLING SYNALLOCATE. #
- # #
- # ERRORS DIAGNOSED: DUPLICATE ROUTINE NAMES ARE DIAGNOSED AND THE #
- # LATEST DEFINITION OVERRIDES. #
- # #
- PROC SUBRBUILD;
- BEGIN
- GETACARD:
- SYNREAD; #READ CARD INTO SYNIWSA. #
- IF SYNEOF GR 0 THEN #STOP IF EOF ENCOUNTERED. #
- SYNABT(2);
- IF WORD1 NQ 0 THEN # MOVE WORDS 1,2 TO 0,1 AND IGNORE #
- BEGIN # WORD 0. #
- INWORD[0] = INWORD[1];
- INWORD[1] = INWORD[2];
- INWORD[2] = " ";
- END
- IF INWORD[0] EQ " " THEN #ASSUMED TO BE BLANK CARD IF 1ST TEN #
- GOTO GETACARD; #CHARS BLANK. BLANK CARDS ARE SKIPPED. #
- IF INWORD[0] EQ "+" THEN #+ SIGN MEANS END OF SUBROUTINE #
- RETURN; #NAME LIST INPUT. #
- NAME[0] = INWORD[0];
- NAME[1] = C<0,2>INWORD[1];
- IF NAME[1] EQ " " THEN #SYMBOLLENGTH IS 1 WORD IF LESS THAN 11 #
- SYMBOLLENGTH = 1; #CHARS IN THE ROUTINE NAME. #
- ELSE SYMBOLLENGTH = 2;
- CTEMP = C<7,3>INWORD[1];
- IF CTEMP EQ " " THEN
- BEGIN #IF THE USER DEFAULTS THE SWITCH VECTOR #
- ITEMP = COUNTER; #INDEX FOR A SUBROUTINE NAME, HE GETS #
- COUNTER = COUNTER + 1;#VALUES ASSIGNED IN THE ORDER THE NAMES#
- END #ARE READ BY SYNGEN. #
- ELSE #ELSE THE VALUE GIVEN BY THE USER IS #
- DISPLAYTOBIN; #CONVERTED TO BINARY. #
- SYMBOLVALUE = ITEMP; #STORE VALUE OF SUBR NAME. #
- SYNHASH; #INSERT THE SUBROUTINE NAME AND SWITCH #
- #INDEX INTO THE SYMBOL TABLE. #
- IF ERRORFLAG EQ 2 THEN #ERROR MEANS HASH ROUTINE FOUND A DUPLI-#
- BEGIN #CATE SUBROUTINE NAME. #
- DUPELABEL[1] = NAME[0];
- DUPELABEL[2] = NAME[1];
- SCALL CHKLINO;
- SYNORL = 77;
- SYNPRNT(DUPELABELMSG);#PRINT OUT DIAGNOSTIC MESSAGE. #
- CHKERRCNT;
- END
- GOTO GETACARD; #LOOP TO GET NEXT INPUT CARD. #
- END
- CONTROL EJECT;
- #**********************************************************************#
- # #
- # SYNHASH #
- # #
- #PROC WHICH MANAGES THE SYNGEN SYMBOL TABLE, PERFORMING BOTH INSERTIONS#
- #AND EXTRACTIONS OF TABLE ENTRIES AS INDICATED BY THE INS$EXT FLAG. THE#
- #SYMBOL TABLE IS ORGANIZED AS A HASH-CODED ENTRY TABLE WITH INDIRECT #
- #CHAINING. I.E. THE HASHED CODE PROVIDES AN INDEX INTO A FIXED-LENGTH #
- #TABLE OF POINTERS. THE POINTER SO ACCESSED IS THE HEAD OF A CHAIN OF #
- #SYMBOL TABLE ENTRIES WITH THE SAME HASHED CODE (SYNONYMS). THE CHAIN #
- #IS A SIMPLE QUEUE OR FIFO LIST, WITH THE SPACE FOR EACH CHAIN ENTRY #
- #ALLOCATED WHEN IT IS ENTERED INTO THE CHAIN. CHAIN ENTRIES ARE LINKED #
- #BY POINTERS. #
- # ERRORS DIAGNOSED: 1.THE ERRORFLAG IS SET IF THE SAME SYMBOL IS MUL- #
- # TIPLY DEFINED AND THE LAST DEFINITION OVERRIDES.#
- # 2.THE ERRORFLAG IS SET IF AN EXTRACTION REQUEST #
- # REFERENCES AN UNDEFINED SYMBOL. #
- # #
- PROC SYNHASH;
- BEGIN
- ERRORFLAG = 0; #TURN OFF ERROR FLAG. #
- I = NAME[0]; #FIRST WORD OF SYMBOL. #
- ITEMP = SYMBOLLENGTH - 2;#CHECK LENGTH OF SYMBOL IN WORDS. #
- IF ITEMP LS 0 THEN #IF 10 CHARS OR LESS THEN GO TO FOLDING #
- GOTO FOLD; #CODE DIRECTLY. #
- IF ITEMP GR 0 THEN #IF 21-30 CHARS FOLD IN LAST WORD. #
- I = I + NAME[2];
- I = I + NAME[1]; #FOLD IN 2ND WORD. #
- FOLD:
- ITEMP = ((B<30,30>I*2**15)*2**15) + B<0,30>I;#SHIFT I LEFT(CIRCU-#
- #LAR) 30 BITS. #
- ITEMP = I + ITEMP; #FOLD ONE LAST TIME. #
- RTEMP = B<30,30>ITEMP * .0019569E-48;#PACK,NORMALIZE AND MULTIPLY#
- #BY A HASHING CONSTANT. #
- ITEMP = B<53,7>RTEMP; #ONLY 9 BITS USED FOR SYNGEN HASHING, 7 #
- J = B<51,2>RTEMP; #BITS FOR WORD INDEX AND 2 FOR THE 15- #
- #BIT QUADRANT OF THE WORD SO INDEXED. #
- P<SYMBOLTABLE> = B<J*15,15>HASHENTRY[ITEMP];#PTR TO 1ST IN CHAIN.#
- I = SYMBOLLENGTH - 2; #I = LENGTH OF SYMBOL CALLER IS QUERYING#
- IF INS$EXT EQ S"INSERT" THEN #IS THIS AN INSERTION OR AN EXTRAC- #
- GOTO INSERTION; #TION OF A SYMBOL AND VALUE. #
- SYMBOLVALUE = -1; #TO BE USED ONLY IF THIS EXTRACTION RE- #
- #QUEST IS 1ST REFERENCE TO UNDEFINED #
- #SYMBOL. #
- IF P<SYMBOLTABLE> EQ 0 THEN #IF SYMBOL IS UNDEFINED THEN INSERT A#
- BEGIN #REFERENCE TO THE SYMBOL. #
- ERRORFLAG = 1; #SET FLAG FOR UNDEFINED SYMBOL. #
- GOTO INSERTENTRY;
- END
- EXTRACT: #SEARCH DOWN CHAIN FOR SYMBOL MATCH. #
- IF NAME[0] EQ SNAME[0] AND #POSSIBLE MATCH IF THE 1ST WORDS OF #
- SYMBOLTYPE EQ STYPE[0] AND #SYMBOLS MATCH AND THE LENGTHS AND #
- SYMBOLLENGTH EQ SLENGTH[0] THEN #TYPES ARE THE SAME. #
- BEGIN
- IF I LS 0 THEN #MATCH FOUND IF 10 CHARS OR LESS IN LENG#
- GOTO EXTRACTMATCH;
- IF NAME[1] NQ SNAME[1] THEN #IF 2ND WORD DOES NOT MATCH #
- GOTO EXTNOMATCH;
- IF I EQ 0 OR #MATCH FOUND IF 20 CHARS OR LESS IN LENG#
- NAME[2] EQ SNAME[2] THEN #OR 3RD WORD MATCHES. #
- GOTO EXTRACTMATCH;
- END
- EXTNOMATCH:
- IF NEXTPTR[0] EQ 0 THEN #THIS ENTRY IS THE END OF A CHAIN, AND #
- BEGIN #THE SYMBOL HAS NO ENTRY IN THE SYMBOL #
- ERRORFLAG = 1; #TABLE, SO SET FLAG FOR UNDEFINED SYMBOL#
- GOTO ADDTOCHAIN; #AND ENTER A REFERENCE TO THE SYMBOL AT #
- END #THE END OF THE SYMBOL TABLE CHAIN. #
- P<SYMBOLTABLE> = NEXTPTR[0];#PTR TO NEXT ENTRY IN CHAIN. #
- GOTO EXTRACT; #GO CHECK FOR MATCH. #
- EXTRACTMATCH:
- SYMBOLVALUE = SVALUE[0]; #VALUE IS RETURNED TO CALLER. #
- IF NOT SDEFINEBIT[0] THEN #IF SYMBOL HAS NOT YET BEEN DEFINED, #
- BEGIN #THEN SET ERRORFLAG TO TELL CALLER AND #
- ERRORFLAG = 1; #SET VALUE TO POINTER TO LAST ENTRY IN #
- SVALUE[0] = SYNTBLEWORD + SYNTBLEPARCL + 7;# SYNTBLE WHICH #
- END #REFERENCES THIS SYMBOL. #
- RETURN; #RETURN TO CALLING ROUTINE. #
- INSERTION:
- IF P<SYMBOLTABLE> EQ 0 THEN #IF 0 THEN THIS IS 1ST USE OF THIS #
- GOTO INSERTENTRY; #HASH CODE. #
- INSERT:
- IF NAME[0] EQ SNAME[0] AND #POSSIBLE MATCH IF FIRST WORD AND #
- SYMBOLLENGTH EQ SLENGTH[0] THEN #LENGTHS ARE EQUAL. #
- BEGIN
- IF I LS 0 THEN #MATCH IF 10 CHARS OR LESS IN LENGTH, SO#
- GOTO MULTIPLEDEF;#GO CHECK FOR POSSIBLE MULTI-DEFINITION.#
- IF NAME[1] NQ SNAME[1] THEN #IF 2ND WORD DOES NOT MATCH #
- GOTO INSNOMATCH; #THEN SYMBOLS DO NOT MATCH. #
- IF I EQ 0 OR #MATCH FOUND IF 20 CHARS OR LESS IN LENG#
- NAME[2] EQ SNAME[2] THEN #OR 3RD WORD MATCHES, SO GO #
- GOTO MULTIPLEDEF;#CHECK FOR POSSIBLE MULTI-DEFINITION. #
- END
- INSNOMATCH:
- IF NEXTPTR[0] EQ 0 THEN #SYMBOL IS NOT IN CHAIN SO GO ADD IT. #
- GOTO ADDTOCHAIN;
- P<SYMBOLTABLE> = NEXTPTR[0];#PTR TO NEXT ENTRY IN CHAIN. #
- GOTO INSERT; #GO CHECK FOR MATCH. #
- INSERTENTRY:
- #IF THIS IS FIRST USE OF THIS HASHED #
- #CODE THEN STORE POINTER TO CHAIN IN THE#
- P<SYMBOLTABLE> = SYNALLOCATE(-SYMBOLLENGTH-1);#FIXED-LENGTH TABLE#
- B<J*15,15>HASHENTRY[ITEMP] = P<SYMBOLTABLE>;#OF POINTERS. #
- GOTO INSERTATTRIB;
- ADDTOCHAIN:
- NEXTPTR[0] = SYNALLOCATE(-SYMBOLLENGTH-1);#ELSE PUT THIS ENTRY ON#
- P<SYMBOLTABLE> = NEXTPTR[0];#THE END OF THE CHAIN OF SYNONYMS. #
- INSERTATTRIB:
- NEXTPTR[0] = 0; #MARK THIS ENTRY AS END OF CHAIN. #
- SLENGTH[0] = SYMBOLLENGTH;#STORE THE ATTRIBUTES OF THE SYMBOL. #
- STYPE[0] = SYMBOLTYPE;
- SNAME[0] = NAME[0];
- REPLACEATTR:
- SVALUE[0] = SYMBOLVALUE;
- IF I LS 0 THEN GOTO SETDEFBIT;
- SNAME[1] = NAME[1];
- IF I GR 0 THEN
- SNAME[2] = NAME[2];
- SETDEFBIT:
- IF INS$EXT NQ S"INSERT" THEN #RETURN TO CALLING ROUTINE IF THIS #
- BEGIN #WAS A FORWARD SYMBOL REFERENCE. #
- UNDEFSYMBOLS = UNDEFSYMBOLS + 1;#INCREMENT TALLY OF UNDEFINEE#
- SDEFINEBIT[0] = FALSE;#SYMBOLS. MARK AS UNDEFINED. #
- SVALUE[0] = SYNTBLEWORD + SYNTBLEPARCL + 7;
- RETURN;
- END
- SDEFINEBIT[0] = TRUE; #FOR INSERTIONS, TURN ON THE DEFINITION #
- RETURN; #BIT AND RETURN TO CALLING ROUTINE. #
- MULTIPLEDEF:
- IF STYPE[0] NQ SYMBOLTYPE THEN #IF NAMES ARE SAME BUT NOT TYPES #
- GOTO INSNOMATCH; #IT IS NOT A MULTIPLY-DEFINED SYMBOL. #
- IF NOT SDEFINEBIT[0] THEN #IF NAMES AND TYPES MATCH BUT #
- BEGIN #SYMBOL WAS PREVIOUSLY UNDEFINED, RETURN#
- ITEMP = SVALUE[0]; #PTR TO CHAIN OF REFERENCES IN ITEMP AND#
- SVALUE[0] = SYMBOLVALUE;#REPLACE WITH SYMBOLVALUE. MARK THE #
- SDEFINEBIT[0] = TRUE;#SYMBOL AS DEFINED. #
- UNDEFSYMBOLS = UNDEFSYMBOLS - 1;#REDUCE UNDEFSYMBOL TALLY. #
- ERRORFLAG = 3; #FLAG INDICATES SYMBOL PREVIOUSLY UNDEF.#
- RETURN;
- END
- ERRORFLAG = 2; #FOR TRUE MULTIPLE-DEFINITIONS, SET FLAG#
- GOTO REPLACEATTR; #AND OVERRIDE PREVIOUS DEFINITION. #
- END
- CONTROL EJECT;
- #**********************************************************************#
- # #
- # SYNBUILD #
- # #
- #ROUTINE WHICH CONSTRUCTS THE SYNTABLE (TABLE WHICH IS USED TO DRIVE #
- #THE SYNTAX ANALYSIS FOR A SYSTEM) AND THE TRACEM TABLE (TABLE WHICH IS#
- #USED TO TRACE ANY PATH THROUGH THE SYNTABLE) PLUS THREE CROSS REFER- #
- #ENCE LISTS - LABELS, SUBROUTINES, AND DIAGNOSTICS. #
- # #
- #ENTRY CONDITIONS: #
- # SYNGEN"S INPUT FILE MUST BE POSITIONED TO THE THIRD SECTION CONTAIN-#
- # ING THE SYNTAX SPECIFICATIONS, THE SUBROUTINE NAMES MUST HAVE BEEN #
- # ENTERED INTO THE SYMBOL TABLE AND THE LEXICON TABLES MUST HAVE BEEN #
- # BUILT. #
- # #
- #EXTERNAL REFERENCES: #
- # SYNSCAN - CODE WHICH IDENTIFIES SYNTAX ENTRIES IN THE INPUT CARD. #
- # SYNHASH - PROC WHICH ENTERS OR RETRIEVES INFO FROM THE SYMBOL TABLE.#
- # SYNALLOCATE - PROC WHICH ALLOCATES SPACE WITHIN A JOB"S FIELDLENGTH.#
- # SYNPRNT - ROUTINE WHICH PRINTS AN OUTPUT LINE. #
- # #
- #EXIT CONDITIONS: #
- # SYNTABLE, TRACEM, AND THE THREE CROSS REFERENCE LIST ARE BUILT AND #
- # SYNGEN"S INPUT FILE IS POSITIONED AT EOF. #
- # #
- #ERROR CONDITIONS: #
- # UNDEFINED LABEL REFERENCE BY THE USER"S SYNTAX SPECIFICATIONS. #
- # UNDEFINED SUBLABEL REFERENCE BY THE USER"S SYNTAX SPECIFICATIONS. #
- PROC SYNBUILD;
- BEGIN
- P<SUBLABELPTRS> = SYNALLOCATE(100);#ALLOCATE SPACE FOR SAVING #
- #PTRS TO SUBLABELS IN A SYNTBLE SECTION.#
- FOR I=0 STEP 1 UNTIL 99 DO #INITIALIZE SUBLABEL POINTERS TO ZERO.#
- SUBLABELPTR[I] = 0;
- P<LABELPTRS> = P<SUBLABELPTRS>+100;#LABELPTRS ARRAY SPACE WILL BE#
- #ALLOCATED AS NEEDED. #
- LASTRANSFER = 0; #INITIALIZE ALL POINTERS AND COUNTERS. #
- COUNTER = 0; #INITIALIZE CODE LINE COUNTER. #
- LABELCOUNTER = 0;
- SYNTBLEPARCL = 0;
- CURRENTLABEL[0] = 0;
- FIRSTCHAR = 0; #INIT SCAN FLAG FOR DELIMITERS AND #
- #COMMENTS. #
- IF TFLAG NQ 0 THEN #IF A TRACEM ARRAY IS REQUESTED, THEN #
- BEGIN #WRITE THE ARRAY ITEM DESCRIPTION TO THE#
- TRACEWSAWD[0] = " ITEM TR";#FILE. #
- TRACEWSAWD[1] = "ACEINSTR C";
- TRACEWSAWD[2] = "(,,10) = [";
- TRACEWSAWD[3] = " ";
- TRACEWSAWD[4] = " ";
- TRACEWSAWD[5] = " ";
- TRACEW;
- TRACEWSAWD[0] = " ";#RESET 1ST WORD OF THE WSA TO A #
- END #BLANK. #
- SCRATCHWD[0] = " ARRAY SYN";
- SCRATCHWD[1] = "TBLE[ ";
- SCRATCHWD[2] = "]; ";
- SCRATCHWD[3] = " ";
- SCRATCHWD[4] = " ";
- SCRATCHWD[5] = " ";
- SYNTBLW(SCRATCH,SYNTBLEWORD);
- SYNTBLEWORD = SYNTBLEWORD + 6;
- SCRATCHWD[0] = " ITEM SY";
- SCRATCHWD[1] = "NWORD U =[";
- SCRATCHWD[2] = " ";
- SYNTBLW(SCRATCH,SYNTBLEWORD);
- SYNTBLEWORD = SYNTBLEWORD + 6;
- GOTO SYNSCAN; #CALL SYNSCAN PROCEDURE TO CRACK INPUT #
- #AND GIVE CONTROL TO PROPER SYNTACTIC #
- #ROUTINE. #
- #**********************************************************************#
- DRIVERREQ: #DRIVER REQUESTS AND KEYWORD CALLS. #
- ENCODE:
- ITEMP = SYNSTRUCTION; #CONVERT INSTRUCTION TO DISPLAY-CODED #
- BINTODISPOCT; #OCTAL, LEFT-JUSTIFIED BLANK-FILLED. #
- SYNSTRUCTION = (B<30,30>OCTAL[1]*2**15)*2**15 + O"5555555555";
- STORECODE:
- IF TFLAG NQ 0 THEN #IF TRACEM REQUESTED AND THIS INSTRUC- #
- IF FIRSTSUBLABL EQ 1 THEN #TION ISN"T 1ST SUBLABEL DEFINED IN #
- BEGIN #SECTION, THEN MAKE ENTRY IN THE CURRENT#
- B<6,42>TRACESKEL = B<0,42>DISPLAYINSTR;# TRACEM RECORD. #
- TRACEWSAWD[1+SYNTBLEPARCL] = TRACESKEL;
- END
- ELSE FIRSTSUBLABL = 1; #SET FLAG SO NEXT INSTRUCTION GETS OUT. #
- C<0,7>INSTRUCTCOM[SYNTBLEPARCL+1]=DISPLAYINSTR;#COMMENT FOR CODE.#
- PRESETI[1+SYNTBLEPARCL] = SYNSTRUCTION;#STORE CODED INSTRUCTION. #
- IF SYNTBLEPARCL GR 2 THEN #IF FULL SYNTBLE WORD BUILT THEN WRITE #
- BEGIN #THE RECORD TO FILE AND SET POINTERS TO #
- SYNTBLEPARCL = 0; #NEXT WORD AND PARCEL. #
- ITEMP = COUNTER; #CONVERT CODE LINE COUNTER TO OCTAL DIS-#
- BINTODISPOCT; #PLAY CODE AND STORE IN COMMENT LINE. #
- B<24,30>INSTRUCTCOM[0] = B<30,30>OCTAL[1];
- SYNTBLW(INSTRCOMMENT,SYNTBLEWORD);#WRITE OUT COMMENT LINE. #
- SYNTBLEWORD = SYNTBLEWORD + 6;
- SYNTBLW(PRESETCODE,SYNTBLEWORD);
- COUNTER = COUNTER + 1;#INCREMENT CODE LINE COUNTER. #
- SECTIONWORD = SECTIONWORD + 1;
- SYNTBLEWORD = SYNTBLEWORD + 6;
- IF TFLAG NQ 0 THEN #WRITE OUT RECORD TO TRACEM FILE. #
- TRACEW;
- GOTO SYNSCAN; #GET NEXT INPUT ELEMENT. #
- END
- SYNTBLEPARCL = SYNTBLEPARCL + 1;#SET POINTER TO NEXT PARCEL. #
- GOTO SYNSCAN; #GET NEXT INPUT ELEMENT. #
- #**********************************************************************#
- LABELS:
- IF NAME[0] EQ CURRENTLABEL[0] AND #IF "NEW" LABEL IS SAME AS THE#
- NAME[1] EQ CURRENTLABEL[1] AND #CURRENT LABEL, IT IS OPTIONAL#
- NAME[2] EQ CURRENTLABEL[2] THEN #BOOKKEEPING DEVICE, SO IT IS #
- GOTO SYNSCAN; #IGNORED AND NEXT INPUT ELEMENT REQUESTD#
- IF TFLAG NQ 0 THEN #IF TRACEM BEING BUILT THEN SET FLAG TO #
- BEGIN #INDICATE NEW SYNTBLE SECTION BEING #
- IF SYNTBLEPARCL NQ 0 THEN #STARTED. #
- BEGIN
- FOR I=SYNTBLEPARCL+1 STEP 1 UNTIL 4 DO #FILL OUT TRACEM #
- TRACEWSAWD[I] = """NO CODE"",";#RECORD WITH THAT WHICH #
- TRACEW; #SHOULD NEVER SHOW UP ON A TRACE. #
- END
- FIRSTSUBLABL = -1; #FLAG FOR START OF NEW LABELLED SECTION.#
- C<1,1>TRACESKEL = ":"; # ADD : TO A LABEL AND STORE IT #
- B<12,36>TRACESKEL = B<0,36>DISPLAYINSTR;# INTO A TRACEM ENTRY#
- TRACEWSAWD[1] = TRACESKEL; #TRACEM ENTRY. #
- END
- IF SYNTBLEPARCL EQ 0 THEN #IF NOT ALREADY POSITIONED AT INSTRUC- #
- GOTO WRITELABLCOM; #TION WORD BOUNDARY, THEN FILL OUT CUR- #
- FOR I=SYNTBLEPARCL+1 STEP 1 UNTIL 4 DO #RENT SYNTBLE WORD AND #
- BEGIN #WRITE OUT COMMENT AND CODE PRESET #
- PRESET[I] = "00000"; #RECORDS. #
- INSTRUCTCOM[I] = " ";
- END
- ITEMP = COUNTER; #CONVERT CODE LINE NUMBER TO DISPLAY- #
- BINTODISPOCT; #CODED OCTAL AND STORE IN COMMENT LINE. #
- B<24,30>INSTRUCTCOM[0] = B<30,30>OCTAL[1];
- SYNTBLW(INSTRCOMMENT,SYNTBLEWORD);
- SYNTBLEWORD = SYNTBLEWORD + 6;
- SYNTBLW(PRESETCODE,SYNTBLEWORD);
- SYNTBLEWORD = SYNTBLEWORD + 6;#INCREMENT POINTERS. #
- SYNTBLEPARCL = 0;
- COUNTER = COUNTER + 1;
- WRITELABLCOM: #BUILD COMMENT CARD FOR NEW LABEL. #
- B<24,36>LABELCOMWORD[0] = B<0,36>NAME[0];
- B<24,36>LABELCOMWORD[1] = B<0,36>NAME[1];
- B<24,36>LABELCOMWORD[2] = B<0,36>NAME[2];
- B<0,24>LABELCOMWORD[1] = B<36,24>NAME[0];
- B<0,24>LABELCOMWORD[2] = B<36,24>NAME[1];
- B<0,24>LABELCOMWORD[3] = B<36,24>NAME[2];
- SYNTBLW(LABELCOMMENT,SYNTBLEWORD);#WRITE OUT LABEL COMMENT LINE. #
- SYNTBLEWORD = SYNTBLEWORD + 6;
- P<LABELENTRY> = SYNALLOCATE(6);#ALLOCATE ANOTHER ENTRY IN THE #
- #LABELPTRS TABLE. #
- LABELCOUNTER = LABELCOUNTER + 1;#INCREMENT LABEL TALLY. #
- SYMBOLVALUE = LABELCOUNTER;#ENTRY POSITION IN LABELPTRS TABLE IS #
- #THE DEFINED VALUE OF THE SYMBOL. #
- SECTIONWORD = 0; #1ST WORD OF NEW LABELLED SECTION. #
- LABELNAME[1] = NAME[0]; #STORE LABEL IN COMMENT PORTION OF THE #
- LABELNAME[2] = NAME[1]; #LABELPTRS ARRAY ENTRY. #
- LABELNAME[3] = NAME[2];
- ITEMP = COUNTER; #CONVERT RELATIVE WORD POSITION IN THE #
- BINTODISPDEC; #SYNTBLE TO DISPLAY CODE AND STORE INTO #
- LABELPRESET[0] = CTEMP; #THE PRESET PORTION OF THE LABELPTRS #
- #ARRAY ENTRY. #
- LABELNAME[0] = " # ";#STORE COMMENT SYMBOLS INTO THE #
- LABELNAME[4] = " #, ";#LABELPTRS ARRAY ENTRY. #
- SYMBOLTYPE = "L";
- INS$EXT = S"INSERT";
- SYNHASH; #ENTER SYMBOL DEFINITION IN SYMBOL TABLE#
- K = ITEMP; #SAVE PTR TO CHAIN OF REFERENCES. #
- ITEMP = O"24000" + LABELCOUNTER;#BUILD INSTRUCTION CALLING NEWLY-#
- BINTODISPOCT; #DEFINED LABEL. #
- SYNSTRUCTION = (B<30,30>OCTAL[1]*2**15)*2**15 + O"5555555555";
- IF ERRORFLAG EQ 3 THEN #IF LABEL PREVIOUSLY UNDEFINED, REPLACE #
- WALKCHAIN; #CHAIN ENTRIES WITH LABEL CALL. #
- ELSE IF ERRORFLAG EQ 2 THEN #IF LABEL IS A DUPLICATE, STORE LABEL#
- BEGIN #IN MESSAGE AND CALL SYNPRNT TO PRINT IT#
- DUPELABEL[1] = NAME[0];#ON THE SYSTEM OUTPUT FILE. #
- DUPELABEL[2] = NAME[1];
- DUPELABEL[3] = NAME[2];
- DUPELABEL[4] = " DOUBLY";
- SCALL CHKLINO;
- SYNORL = 77;
- SYNPRNT(DUPELABELMSG);
- CHKERRCNT;
- END
- FOR I=0 STEP 1 UNTIL 99 DO #REINITIALIZE SUBLABELPTRS TO ZERO, #
- BEGIN #CHECKING FOR UNDEFINED SUBLABEL REFER- #
- IF SUBLABELPTR[I] NQ 0 AND #ENCES. PUT OUT DIAGNOSTIC IF UN- #
- SUBLABELPTR[I] GR 0 THEN #DEFINED SUBLABEL FOUND. #
- BEGIN
- UNDEFMESS[1] = CURRENTLABEL[0];
- UNDEFMESS[2] = CURRENTLABEL[1];
- UNDEFMESS[3] = CURRENTLABEL[2];
- ITEMP = I;
- BINTODISPDEC;
- B<0,6>UNDEFMESS[4] = ":";
- B<6,12>UNDEFMESS[4] = B<18,12>CTEMP;
- UNDEFMESS[5] = "NED SUBLAB";
- UNDEFMESS[6] = "EL. ";
- SCALL CHKLINO;
- SYNORL = 65;
- SYNPRNT(UNDEFMESSAGE);
- CHKERRCNT;
- UNDEFMESS[4] = " UNDEFI";#RESTORE BLANKS. #
- K = SUBLABELPTR[I];#REPLACE CHAIN OF REFERENCE PTRS #
- SYNSTRUCTION = "03777 ";
- WALKCHAIN;
- END
- SUBLABELPTR[I] = 0;
- END
- IF LFLAG NQ 0 THEN #IF THE LFLAG IS SET THEN CROSS REFER- #
- BEGIN #ENCE INFORMATION MUST BE KEPT. #
- CURNTLABLPTR = P<SYMBOLTABLE>;#KEEP PTR TO SYMBOL TABLE ENTRY#
- END #FOR THE CURRENT LABEL. #
- CURRENTLABEL[0] = NAME[0];#SAVE LABEL OF SYNTBLE SECTION THAT IS #
- CURRENTLABEL[1] = NAME[1];#CURRENTLY BEING CONSTRUCTED. #
- CURRENTLABEL[2] = NAME[2];
- IF LASTRANSFER NQ 0 THEN #STORE A CALL TO THE NEW LABEL AT THE #
- BEGIN #LAST / OR :SUBLABEL. #
- SYNTBLR(SCRATCH,LASTRANSFER);#FETCH THE WORD FROM SYNTBLE. #
- SCRATCHWD[0] = "00000 "; #STORE A NO-OP AT LASTRANSFER. #
- SYNTBLW(SCRATCH,LASTRANSFER);#STORE UPDATED WORD BACK. #
- LASTRANSFER = 0; #INITIALIZE TO ZERO FOR A NEW LABELLED #
- END #SECTION. #
- GOTO SYNSCAN; #GET NEXT SOURCE ELEMENT. #
- #**********************************************************************#
- SUBLABELS:
- IF TFLAG NQ 0 THEN #IF TRACEM REQUESTED THEN SET FLAG TO #
- BEGIN #INDICATE WHETHER THIS IS 1ST SUBLABEL #
- IF FIRSTSUBLABL LS 0 THEN #IN THE CURRENT LABELLED SECTION. #
- FIRSTSUBLABL = 0;
- END
- IF B<0,1>SUBLABELPTR[SUBLABEL] EQ 1 THEN #IF THE SIGN-BIT IN THE #
- BEGIN #ENTRY IS ALREADY SET THEN THIS SUBLABEL#
- DUPELABEL[1] = CURRENTLABEL[0];#IS DOUBLY-DEFINED. #
- DUPELABEL[2] = CURRENTLABEL[1];
- DUPELABEL[3] = CURRENTLABEL[2];
- ITEMP = SUBLABEL;
- BINTODISPDEC;
- C<0,1>DUPELABEL[4] = ":";
- B<6,12>DUPELABEL[4] = B<18,12>CTEMP;
- SCALL CHKLINO;
- SYNORL = 77;
- SYNPRNT(DUPELABELMSG);
- CHKERRCNT;
- DUPELABEL[4] = " DOUBLY";
- END
- ELSE
- IF SUBLABELPTR[SUBLABEL] GR 0 THEN #IF THE VALUE IS POSITIVE, #
- BEGIN #IT REPRESENTS A PTR TO THE HEAD OF A #
- K = SUBLABELPTR[SUBLABEL];#CHAIN OF REFERENCES TO BE SATIS-#
- ITEMP = O"40000" + SYNTBLEPARCL*2**11 + SECTIONWORD;#FIED. #
- BINTODISPOCT;
- SYNSTRUCTION = (B<30,30>OCTAL[1]*2**15)*2**15 +
- O"5555555555";
- WALKCHAIN;
- END
- SUBLABELPTR[SUBLABEL] = -(SYNTBLEPARCL*2**11 + SECTIONWORD);
- CURNTSUBLABL = C<1,2>DISPLAYINSTR;
- #**********************************************************************#
- SLASH:
- IF LASTRANSFER NQ 0 THEN
- BEGIN
- ITEMP = O"60000" + SECTIONWORD + SYNTBLEPARCL*2**11;
- BINTODISPOCT;
- ITEMP = SYNTBLEWORD + SYNTBLEPARCL + 7;
- I = (B<30,30>OCTAL[1]*2**15)*2**15 + O"5555555555";
- IF ITEMP-LASTRANSFER LS 4 THEN #IF THE LAST TRANSFER POINT IS#
- BEGIN #IN THE CURRENT RECORD OF THE SYNTBLE #
- PRESETI[LASTRANSFER-SYNTBLEWORD-6] = I;#FILE, THEN DON"T #
- GOTO UPDATETRANSF;#GET THE RECORD, SIMPLY STORE IN THE #
- END #WSA CURRENTLY BEING FILLED. #
- SYNTBLR(SCRATCH,LASTRANSFER);#ELSE GET THE WORD FROM THE FILE#
- B<0,60>SCRATCHWD[0] = I;
- SYNTBLW(SCRATCH,LASTRANSFER);
- END
- UPDATETRANSF:
- LASTRANSFER = SYNTBLEWORD + SYNTBLEPARCL + 7;#UPDATE LAST TRANS- #
- #FER POINTER. #
- SYNSTRUCTION = 0; #STORE A ZERO IN THE CURRENT PARCEL OF #
- GOTO STORECODE; #SYNTBLE, TEMPORARILY. #
- #**********************************************************************#
- LABELCALL:
- INS$EXT = S"EXTRACT"; #SET UP CALL TO SYNHASH REQUESTING LABEL#
- SYMBOLTYPE = "L"; #POSTION IN LABELPTRS TABLE. #
- SYNHASH;
- IF LFLAG NQ 0 THEN #LFLAG MEANS CROSS REFERENCE INFO IS #
- BEGIN #REQUIRED. CROSS REFERENCE RECORD HAS #
- LXREFWSA = P<SYMBOLTABLE>;#PTR TO SYMBOLTABLE ENTRY FOR LABEL#
- B<12,12>LXREFWSA = " ";#NO SUBLABEL FOR LABEL DEFINITION. #
- COMPLETEXREF:
- B<0,12>LXREFWSA = CURNTSUBLABL; #REFENCED,POINTER TO ENTRY OF#
- B<24,18>LXREFWSA = CURNTLABLPTR;#CURRENT LABEL, AND DISPLAY- #
- LXREFW; #CODED SUBLABEL THAT IS CURRENT. #
- END
- STORECALL:
- IF ERRORFLAG EQ 0 THEN #FLAG MEANING CALLED LABEL IS DEFINED SO#
- BEGIN #INSTRUCTION CAN BE BUILT. #
- SYNSTRUCTION = SYNSTRUCTION + SYMBOLVALUE;
- GOTO ENCODE;
- END
- SYNSTRUCTION = SYMBOLVALUE;#ELSE PUT OUT A POINTER TO LAST PRE- #
- GOTO STORECODE; #VIOUS REFERENCEE TO LABEL. #
- #**********************************************************************#
- SUBLABELCALL:
- SYMBOLVALUE = SUBLABELPTR[SUBLABEL];#EITHER VALUE OR POINTER. #
- IF B<0,1>SYMBOLVALUE EQ 1 THEN #LS 0 MEANS SUBLABEL HAS BEEN #
- BEGIN # DEFINED ALREADY. #
- ERRORFLAG = 0;
- SYMBOLVALUE = -SYMBOLVALUE;
- END
- ELSE #GQ 0 MEANS SUBLABEL IS UNDEFINED. #
- BEGIN
- ERRORFLAG = 1;
- IF SYMBOLVALUE EQ 0 THEN #EQ 0 MEANS SUBLABEL NOT PREVIOUSLY #
- SYMBOLVALUE = -1; #REFERENCED, SO -1 FLAGS END OF CHAIN OF#
- SUBLABELPTR[SUBLABEL] = SYNTBLEWORD + SYNTBLEPARCL + 7;
- END #REFERENCES. SAVE WORD ADDRESS OF LAST #
- #REFERENCE IN SUBLABELPTRS TABLE ENTRY. #
- IF LFLAG NQ 0 THEN #CROSS REFERENCE INFO IS REQUIRED, CON- #
- BEGIN #TAINING PTR TO CURRENT LABEL ENTRY IN #
- LXREFWSA = CURNTLABLPTR;#SYMBOL TABLE, SUBLABEL CALLED, ETC. #
- B<12,12>LXREFWSA = B<0,12>DISPLAYINSTR;
- GOTO COMPLETEXREF;
- END
- GOTO STORECALL;
- #**********************************************************************#
- SUBROUTINE:
- INS$EXT = S"EXTRACT"; #SET UP CALL TO SYNHASH REQUESTING SUB- #
- SYMBOLTYPE = "S"; #ROUTINE"S SWITCH VECTOR POSITION. #
- SYNHASH;
- IF LFLAG NQ 0 THEN #CROSS REFERENCE INFO REQUIRED INCLUDES #
- BEGIN #PTRS TO SYMBOL TABLE ENTRIES FOR SUB- #
- SXREFWSA = P<SYMBOLTABLE>;#ROUTINE AND CURRENT LABEL AND DIS-#
- B<0,12>SXREFWSA = CURNTSUBLABL;#PLAY-CODED SUBLABEL. #
- B<24,18>SXREFWSA = CURNTLABLPTR;
- SXREFW; #WRITE OUT XREF INFO. #
- END
- IF ERRORFLAG NQ 0 THEN #SUBROUTINE WAS NOT DEFINED BY USER TO #
- BEGIN #SUBRBUILD. #
- UNDEFMESS[1] = NAME[0];
- UNDEFMESS[2] = NAME[1];
- UNDEFMESS[3] = NAME[2];
- C<4,6>UNDEFMESS[5] = "SUBROU";
- UNDEFMESS[6] = "TINE.";
- SCALL CHKLINO;
- SYNORL = 65;
- SYNPRNT(UNDEFMESSAGE);
- CHKERRCNT;
- SYNSTRUCTION = SYNSTRUCTION + O"3777";#TO GENERATE A MODE 1 #
- END #ERROR BY STD IF EXECUTED. #
- ELSE SYNSTRUCTION = SYNSTRUCTION + SYMBOLVALUE;
- GOTO ENCODE;
- #**********************************************************************#
- DIAGNOSTIC:
- IF LFLAG NQ 0 THEN #CROSS REFERENCE INFO INCLUDES DISPLAY- #
- BEGIN #CODED DIAGNOSTIC AND SUBLABEL AND PTR #
- B<0,10>DXREFWSA = B<50,10>SYNSTRUCTION; # TO THE CURRENT #
- B<12,18>DXREFWSA = B<6,18>DISPLAYINSTR; # SYNTBLE LABEL"S #
- B<42,18>DXREFWSA = CURNTLABLPTR;#ENTRY IN SYMBOL TABLE. #
- B<30,12>DXREFWSA = B<0,12>CURNTSUBLABL;
- DXREFW; #WRITE OUT XREF INFO #
- END
- GOTO ENCODE;
- #**********************************************************************#
- INPUTEOF: #ALL USER SPECS HAVE BEEN READ FROM FILE#
- ENDINP; # FIX UP LISTING AND REWIND XREF FILES #
- IF UNDEFSYMBOLS NQ 0 OR #FOR EACH UNDEFINED LABEL AND SEMANTIC #
- LFLAG NQ 0 THEN #SUBROUTINE NAME IN THE SOURCE, PRINT #
- BEGIN #OUT DIAGNOSTICS AND REPLACE SYNTBLE #
- SYNSTRUCTION = "03777 ";#CODE REFERENCING THEM WITH AN #
- FOR ITEMP=0 STEP 1 UNTIL 3 DO #INSTRUCTION DESIGNED TO GENER-#
- BEGIN #ATE A MODE 1 ERROR IF STD ATTEMPTS TO #
- J = ITEMP * 15; #EXECUTE IT. #
- FOR I=0 STEP 1 UNTIL 127 DO
- BEGIN
- P<SYMBOLTABLE> = B<J,15>HASHENTRY[I];
- CHKCHAINEND: IF P<SYMBOLTABLE> EQ 0 THEN
- TEST I;
- N = SLENGTH[0] - 1;
- IF NOT SDEFINEBIT[0] THEN #UNDEFINED SYMBOL ENTRY. #
- BEGIN
- IF STYPE[0] EQ O"23" THEN #IF UNDEFINED SUBRTN, #
- GOTO DECUNDEFCNT;#IT HAS ALREADY BEEN TAKEN #
- # CARE OF. #
- UNDEFMESS[1] = SNAME[0];
- IF N GR 0 THEN
- BEGIN
- UNDEFMESS[2] = SNAME[1];
- IF N GR 1 THEN
- UNDEFMESS[3] = SNAME[2];
- ELSE UNDEFMESS[3] = " ";
- END
- ELSE UNDEFMESS[2] = " ";
- UNDEFMESS[5] = "NED LABEL.";
- SCALL CHKLINO;
- SYNORL = 60;
- SYNPRNT(UNDEFMESSAGE);#PRINT OUT DIAGNOSTIC. #
- CHKERRCNT;
- K = SVALUE[0];
- WALKCHAIN;#REPLACE CALLS TO UNDEFINED SYMBOL. #
- DECUNDEFCNT: UNDEFSYMBOLS = UNDEFSYMBOLS - 1;
- IF UNDEFSYMBOLS EQ 0 AND LFLAG EQ 0 THEN
- GOTO PUTLABELPTRS;
- END
- IF LFLAG NQ 0 THEN
- FOR M=54 STEP -6 WHILE
- B<M,6>SNAME[N] EQ O"55" DO
- B<M,6>SNAME[N] = 0;
- P<SYMBOLTABLE> = NEXTPTR[0];#NEXT ENTRY IN CHAIN OF #
- GOTO CHKCHAINEND; #SYNONYMS. #
- END
- END
- END
- PUTLABELPTRS:
- FOR I=0 STEP 1 UNTIL 99 DO #CHECK ANY UNDEFINED SUBLABELS IN THE #
- BEGIN #LAST LABELLED SECTION OF THE TABLE. #
- IF SUBLABELPTR[I] GR 0 THEN
- BEGIN
- UNDEFMESS[1] = CURRENTLABEL[0];
- UNDEFMESS[2] = CURRENTLABEL[1];
- UNDEFMESS[3] = CURRENTLABEL[2];
- ITEMP = I;
- BINTODISPDEC;
- C<0,1>UNDEFMESS[4] = ":";
- B<6,12>UNDEFMESS[4] = B<18,12>CTEMP;
- UNDEFMESS[5] = "NED SUBLAB";
- UNDEFMESS[6] = "EL. ";
- SCALL CHKLINO;
- SYNORL = 65;
- SYNPRNT(UNDEFMESSAGE);
- CHKERRCNT;
- UNDEFMESS[4] = " UNDEFI";#RESTORE BLANKS. #
- K = SUBLABELPTR[I];
- SYNSTRUCTION = "03777 ";
- WALKCHAIN;
- END
- END
- SYNCOM(PROCNAME);
- SYNCOM(" BEGIN
- ");
- IF NOT PTC THEN
- SYNCOM(" XDEF BEGIN
- ");
- ITEMP = LABELCOUNTER; #WRITE OUT LABELPTRS ARRAY AS PRESET, #
- BINTODISPDEC; #WITH ARRAY DECLARATION INFO IN FIRST 2 #
- B<0,30>LABELPTRHDR[2] = B<0,30>CTEMP; #RECORDS. #
- SYNCOM(LABELPTRHEDR);
- SYNCOM(LABELPTRITEM);
- FOR I=1 STEP 1 UNTIL LABELCOUNTER DO #WRITE OUT LBLPTRS ARRAY BY #
- BEGIN #LOOPING. #
- SYNCOM(LABELPTRS);
- P<LABELPTRS> = P<LABELPTRS> + 6;
- END
- SYNCOM(LABELPTRTAIL); #WRITE OUT ARRAY TERMINATION CHARS. #
- IF LASTRANSFER NQ 0 THEN #STORE AN INSTRUCTION IN THE LAST / OF #
- BEGIN #OF THE TABLE WHICH WILL BE A NO-OP. #
- IF SYNTBLEWORD+SYNTBLEPARCL+7-LASTRANSFER LS 4 THEN
- B<0,60>PRESETI[LASTRANSFER-SYNTBLEWORD-6] = "00000 ";
- ELSE
- BEGIN
- SYNTBLR(SCRATCH,LASTRANSFER);
- SCRATCHWD[0] = "00000 ";
- SYNTBLW(SCRATCH,LASTRANSFER);
- END
- END
- ITEMP = COUNTER;
- IF SYNTBLEPARCL NQ 0 THEN #WRITE OUT REMAINING PART-WORD OF CODE,#
- BEGIN #IF ANY. #
- FOR I=SYNTBLEPARCL+1 STEP 1 UNTIL 4 DO
- BEGIN
- PRESET[I] = "00000";
- INSTRUCTCOM[I] = " ";
- END
- BINTODISPOCT; #WORD COUNT IN OCTAL GOES INTO COMMENT. #
- B<24,30>INSTRUCTCOM[0] = B<30,30>OCTAL[1];
- SYNTBLW(INSTRCOMMENT,SYNTBLEWORD);
- SYNTBLEWORD = SYNTBLEWORD + 6;
- SYNTBLW(PRESETCODE,SYNTBLEWORD);
- SYNTBLEWORD = SYNTBLEWORD + 6;
- END
- SYNTBLW(LABELPTRTAIL,SYNTBLEWORD);#WRITE OUT SYNTBLE ARRAY TERM. #
- SYNTBLEWORD = SYNTBLEWORD + 6;
- BINTODISPDEC; #STORE ARRAY SIZE IN ARRAY PRESET #
- SYNTBLR(SCRATCH,1); #DECLARATION. #
- B<30,30>SCRATCHWD[1] = B<0,30>CTEMP;
- SYNTBLW(SCRATCH,1); #WRITE OUT WORD CONTAINING ARRAY SIZE. #
- IF TFLAG NQ 0 THEN #IF TRACEM REQUESTED, WRITE OUT ARRAY #
- BEGIN #TERMINATOR AND STORE ARRAY SIZE INTO #
- IF SYNTBLEPARCL NQ 0 THEN #ARRAY DECLARATION AND SAVE IN THE #
- BEGIN #WSA FOR THE INPUT FILE. #
- FOR I=SYNTBLEPARCL+1 STEP 1 UNTIL 4 DO
- TRACEWSAWD[I] = """NO CODE"",";
- TRACEW;
- END
- FOR I=0 STEP 1 UNTIL 5 DO
- TRACEWSAWD[I] = TRACEMTAILWD[I];
- TRACEW;
- ITEMP = COUNTER*4 + 3;
- BINTODISPDEC;
- B<30,30>TRACEMHDRWD[1] = B<0,30>CTEMP;
- FOR I=0 STEP 1 UNTIL 6 DO
- INWORD[I] = TRACEMHDRWD[I];
- END
- RETURN; #RETURN CONTROL TO SYNCTRL. #
- CONTROL EJECT;
- SWITCH SYNTAXSWCH # #
- SCOLON, #:# # #
- LET, #A# # #
- LET, #B# # #
- LET, #C# # #
- SD, #D# # #
- SE, #E# # #
- LET, #F# # #
- LET, #G# # #
- LET, #H# # #
- LET, #I# # #
- LET, #J# # #
- LET, #K# # #
- LET, #L# # #
- LET, #M# # #
- SN, #N# # #
- SO, #O# # #
- LET, #P# # #
- LET, #Q# # #
- LET, #R# # #
- SS, #S# # #
- LET, #T# # #
- LET, #U# # #
- LET, #V# # #
- LET, #W# # #
- LET, #X# # #
- SY, #Y# # #
- LET, #Z# # #
- DGT, #0# # #
- DGT, #1# # #
- DGT, #2# # #
- DGT, #3# # #
- DGT, #4# # #
- DGT, #5# # #
- DGT, #6# # #
- DGT, #7# # #
- DGT, #8# # #
- DGT, #9# # #
- SPLUS, #+# # #
- SMINUS, #-# # #
- SASK, #*# # #
- SSLASH, #/# # #
- SSPC, #(# # #
- SSPC, #)# # #
- SDSIGN, #$# # #
- SSPC, #=# # #
- SDELIM, # # # #
- SCOMMA, #,# # #003940
- SSPC, #.# # #
- SCOMMENT, #EQUIV# # #
- SSPC, #[# # #
- SSPC, #]# # #
- SCOLON, #:# # #
- SSPC, #"# # #
- SSPC, #_# # #
- SSPC, #!# # #
- SSPC, #&# # #
- SSPC, #'# # #
- SSPC, #?# # #
- SSPC, #<# # #
- SSPC, #># # #
- SSPC, #@# # #
- SSPC, #\# # #
- SSPC, #^# # #
- SSPC; #SEMI-COLON# # #
- SWITCH STTRANSWTCH SYN1ERR,COLON,SYNLBL,SYNSLBL,LBLCALL,LBLSLASH,
- SUBLBLCALL,SUBLBLSLASH,SYNSUBR,SUBR,SUBRSLASH,
- SYNKEY,SYNKEYWRD,SYNKEYWORD,KEYSLASH,SYNDRIVER,
- SYND,SYNDIAG,DIAGSLASH,SYNY,SYNE,SYNS,SYNYES,
- YESSLASH,SYNN,SYNO,SYNNO,NOSLASH,SYNLETTER,
- SYNLETR,SYNCHAR,SYNDIGIT,SUBLLBLCALL,SUBRL,
- SYNLKEYWRD,SYNLDIAG,LBLLCALL,SYNLYES,SYNLNO,
- SYNLREQUEST,SYNREQ,DRIVERSLSH,HYPHENCHECK,
- HYPHEN;
- CONTROL EJECT;
- #**********************************************************************#
- # #
- # LEXICONSCAN #
- # #
- # #
- FUNC LEXICONSCAN B;
- BEGIN
- LEXPTR = B<0,6>NAME[0]; # 1ST CHAR IN WORD IS INDEX. #
- ITEMP = N * 18;
- IF LEXPTR GR O"32" THEN # CHECK FOR SPECIAL CHAR AS 1ST #
- BEGIN
- WRDPTR = B<ITEMP+6,12>LOCWRD[0];#PTR TO 1ST ENTRY IN SPEC CHR#
- ENTRIES = B<ITEMP,6>LOCWRD[0];#NR ENTRIES IN SPEC CHAR SET. #
- GOTO SCNLEXWRD;
- END
- WRDPTR = B<ITEMP+6,12>LOCWRD[LEXPTR];#PTR TO 1ST ENTRY IN CHAR ST#
- ENTRIES = B<ITEMP,6>LOCWRD[LEXPTR];#NR ENTRIES IN THIS CHAR SET. #
- SCNLEXWRD:
- FOR I=1 STEP 1 UNTIL ENTRIES DO # SEARCH CHAR SET FOR MATCH WITH#
- BEGIN # THE SOURCE WORD IN NAME. #
- IF LEXWRD[WRDPTR] EQ NAME[0] THEN
- BEGIN
- IF N LS 1 THEN
- GOTO SCANEXIT;
- IF LEXWRD[WRDPTR + 1] EQ NAME[1] THEN
- BEGIN
- IF N LS 2 THEN
- GOTO SCANEXIT;
- IF LEXWRD[WRDPTR + 2] EQ NAME[2] THEN
- BEGIN
- SCANEXIT:
- LEXICONSCAN = TRUE;
- RETURN;
- END
- END
- END
- WRDPTR = WRDPTR + 2 + N; # INCREMENT PTR TO NEXT ENTRY. #
- END
- LEXICONSCAN = FALSE;
- RETURN;
- END
- #**********************************************************************#
- SYNSCAN: #............................................................#
- IF CHRPTR LS LASTCHAR THEN # CHECK FOR NEED TO READ A NEW #
- GOTO STARTSTATE; # SOURCE RECORD. IF NOT GOTO THE#
- # SYNTAX CRACKER. #
- CHRPTR = 0; # #
- READSYNTAX: # #
- SYNREAD; # READ A NEW SOURCE RECORD. #
- IF SYNEOF GR 0 THEN # IF EOF REACHED GOTO WRAP-UP. #
- GOTO INPUTEOF; # #
- IF FIRSTCHAR GR 0 THEN # IF COMMENT FROM PREVIOUS #
- BEGIN # RECORD NOT ENDED, THEN SEARCH #
- BP = -6; # FOR ENDING DELIMITER. #
- I = -1; # #
- WRDPTR = 0; # #
- GOTO CNTCMNT; # #
- END # #
- FOR WRDPTR=0 STEP 1 UNTIL 6 DO # SKIP ANY CARDS WITH 72 LEADING#
- IF INWORD[WRDPTR] NQ " " THEN # BLANKS. #
- GOTO BREAKUP;
- IF C<0,2>INWORD[7] NQ " " THEN
- GOTO BREAKUP;
- GOTO READSYNTAX; # GET NEXT SOURCE RECORD. #
- BREAKUP:
- IF INWORD[0] EQ "END " THEN GOTO INPUTEOF;
- IF INWORD[0] EQ "+ " THEN
- BEGIN
- PTC = TRUE;
- GOTO INPUTEOF;
- END
- FOR BP=0 STEP 6 DO # LOCATE 1ST NON-BLANK CHARACTER#
- IF B<BP,6>INWORD[WRDPTR] NQ O"55" THEN #IN THE INPUT RECORD. #
- GOTO GETFIRSTCHAR;
- GETFIRSTCHAR:
- FOR I=BP/6+WRDPTR*10 STEP 1 UNTIL 71 DO #1ST 72 CHARS OF RECORD #
- BEGIN # ARE SCANNED. #
- ITEMP = B<BP,6>INWORD[WRDPTR];# #
- GOTO SYNTAXSWCH[ITEMP]; # DISPLAY VALUE IS INDEX. #
- STORECHAR: # #
- FIRSTCHAR = 0; # #
- CHAR[CHRPTR] = ITEMP; # STORE CHAR IN SYNCHARS. #
- CHRPTR = CHRPTR + 1; # #
- NEXTCHAR: # #
- IF BP GR 53 THEN # INCREMENT PTRS TO NEXT SOURCE #
- BEGIN # CHARACTER. #
- BP = 0; # #
- WRDPTR = WRDPTR + 1; # #
- END # #
- ELSE BP = BP + 6; # #
- END # #
- LASTOFRECORD: # #
- LASTCHAR = CHRPTR; # PTR TO LAST SOURCE CHAR IN #
- # SYNCHARS. #
- IF CHRPTR EQ 0 THEN # IF NO SIGNIFICANT CHARS ON #
- GOTO READSYNTAX; # CARD, GO GET NEXT RECORD. #
- CHRPTR = 0; # #
- STATLIST[LASTCHAR] = S"COMA"; # LAST CHAR ALWAYS A DELIMITER. #
- GOTO STARTSTATE; # GOTO SYNTAX CRACKER. #
- SCOMMA: # #003960
- IF CHRPTR GQ 2 # A COMMA CAN BE EITHER A # DL3A018
- AND (CHAR[CHRPTR-2] EQ " " OR # KEYWORD OR A DELIMITER. # DL3A018
- CHAR[CHRPTR-2] EQ "/" OR
- CHAR[CHRPTR-2] EQ ":" OR
- CHAR[CHRPTR-2] EQ "," ) # TEST PRIOR 2 CHARS FOR KEYWORD# DL3A018
- AND (CHAR[CHRPTR-1] EQ "$" OR # CONSTRUCTS, I.E. A DELIMITER # DL3A018
- CHAR[CHRPTR-1] EQ "-" ) # FOLLOWED BY $ OR -. IF FOUND, # DL3A018
- THEN GOTO SSPC; # TREAT AS KEYWORD SPECIAL CHAR.# DL3A018
- # (SIMILAR TEST IS AT SCOMMENT) # DL3A018
- IF CHRPTR EQ 1
- AND (CHAR[CHRPTR-1] EQ "$" OR #JUST REST FOR $ OR -, AS ABOVE#
- CHAR[CHRPTR-1] EQ "-" )
- THEN GOTO SSPC;
- GOTO SDELIM; # ELSE, COMMA IS A SYNGEN DELIM.#004000
- SSPC: # #
- STATLIST[CHRPTR] = S"SPC"; # STORE STATUS VALUE. #
- GOTO STORECHAR; # #
- DGT: # #
- STATLIST[CHRPTR] = S"DIGIT"; # #
- GOTO STORECHAR; # #
- SCOLON: # #
- IF CHRPTR GQ 2 # A COLON CAN BE EITHER A #
- AND (CHAR[CHRPTR-2] EQ " " OR # KEYWORD OR A DELIMITER. #
- CHAR[CHRPTR-2] EQ "/" OR # #
- CHAR[CHRPTR-2] EQ ":" OR # #
- CHAR[CHRPTR-2] EQ "," ) # TEST PRIOR 2 CHARS FOR KEYWORD#
- AND (CHAR[CHRPTR-1] EQ "$" OR # CONSTRUCTS, I.E. A DELIMITER #
- CHAR[CHRPTR-1] EQ "-" ) # FOLLOWED BY $ OR -. IF FOUND, #
- THEN GOTO SSPC; # TREAT AS KEYWORD SPECIAL CHAR.#
- # (SIMILAR TEST IS AT SCOMMENT) #
- IF CHRPTR EQ 1 # IF ONLY 1 PRIOR CHAR, #
- AND (CHAR[CHRPTR-1] EQ "$" OR # JUST TEST FOR $ OR -, AS ABOVE#
- CHAR[CHRPTR-1] EQ "-" ) # #
- THEN GOTO SSPC; # #
- IF STATLIST[CHRPTR-1] EQ S"COMA" THEN #COLON IS A DELIMITER, SO #
- CHRPTR = CHRPTR - 1; # PRECEDING BLANK OR COMMA IS #
- # OVERLAID. #
- STATLIST[CHRPTR] = S"COLN"; # #
- GOTO STORECHAR; # #
- SASK: # #
- STATLIST[CHRPTR] = S"ASK"; # #
- GOTO STORECHAR; # #
- SSLASH: # #
- STATLIST[CHRPTR] = S"SLSH"; # #
- IF CHRPTR GR 0 AND # / CAN BE A KEYWORD TOO. #
- STATLIST[CHRPTR-1] GR S"ASK" AND
- STATLIST[CHRPTR-1] LS S"PLUS" THEN
- BEGIN
- IF CHRPTR GR 1 AND
- STATLIST[CHRPTR-2] GQ S"ASK" THEN
- GOTO STORECHAR;
- STATLIST[CHRPTR] = S"LETTER";
- END
- GOTO STORECHAR; # #
- SDSIGN: # #
- STATLIST[CHRPTR] = S"DSGN"; # #
- GOTO STORECHAR; # #
- SMINUS: # #
- STATLIST[CHRPTR] =S"MINUS"; # #
- GOTO STORECHAR; # #
- SPLUS: # #
- STATLIST[CHRPTR] = S"PLUS"; # #
- GOTO STORECHAR; # #
- SD: # #
- STATLIST[CHRPTR] = S"D"; # #
- GOTO STORECHAR; # #
- SY: # #
- STATLIST[CHRPTR] = S"Y"; # #
- GOTO STORECHAR; # #
- SE: # #
- STATLIST[CHRPTR] = S"E"; # #
- GOTO STORECHAR; # #
- SS: # #
- STATLIST[CHRPTR] = S"S"; # #
- GOTO STORECHAR; # #
- SN: # #
- STATLIST[CHRPTR] = S"N"; # #
- GOTO STORECHAR; # #
- SO: # #
- STATLIST[CHRPTR] = S"O"; # #
- GOTO STORECHAR; # #
- LET: # #
- STATLIST[CHRPTR] = S"LETTER"; # #
- GOTO STORECHAR; # #
- SDELIM: # #
- IF FIRSTCHAR LS 0 THEN # IF DELIMITER PRECEDED THEN #
- GOTO NEXTCHAR; # SKIP THIS ONE. #
- IF CHRPTR EQ 0 THEN # IF COMMENT STARTED THIS CARD, #
- GOTO NEXTCHAR; # SKIP BLANKS AFTER COMMENT. #
- IF STATLIST[CHRPTR-1] LS S"ASK" THEN #/ AND : ARE DELIMITERS TOO,#
- GOTO SLASHDELIM; # IGNORE FOLLOWING BLANKS AND #
- # COMMAS. #
- CHAR[CHRPTR] = ","; # STORE A COMMA. ALL DELIMITERS #
- # ARE CONVERTED TO COMMAS. #
- STATLIST[CHRPTR] = S"COMA"; # STORE STATUS VALUE OF CORRESP #
- # ONDING ENTRY IN SYNCHARS. #
- CHRPTR = CHRPTR + 1; # SET INDEX TO NEXT ARRAY ENTRY.#
- SLASHDELIM:
- FIRSTCHAR = -1; # INDICATES PRECEDING CHAR WAS A#
- GOTO NEXTCHAR; # DELIMITER. #
- SCOMMENT: # #
- IF CHAR[CHRPTR-1] EQ "$" OR # CHECK IF THE PREVIOUS CHAR #
- CHAR[CHRPTR-1] EQ "-" THEN # INDICATES A KEYWORD. IF KEYWRD#
- GOTO EQUIV; # STORE CHARACTER. OTHERWISE A #
- CNTCMNT: # COMMENT IS INDICATED. SCAN IN-#
- FOR I=I+1 STEP 1 UNTIL 71 DO # PUT UNTIL TERMINATING COMMENT #
- BEGIN # DELIMITER FOUND. #
- IF BP GR 53 THEN # INCREMENT PTRS TO NEXT SOURCE #
- BEGIN # CHARACTER. #
- BP = 0; # #
- WRDPTR = WRDPTR + 1; # #
- END # #
- ELSE BP = BP + 6; # #
- ITEMP = B<BP,6>INWORD[WRDPTR];# #
- IF ITEMP EQ O"60" THEN # IF SOURCE CHAR IS ENDING DE- #
- BEGIN # LIMITER THEN TURN OFF COMMENT #
- FIRSTCHAR = 0; # FLAG AND CONTINUE SCAN. #
- GOTO NEXTCHAR; # #
- END # #
- END # #
- FIRSTCHAR = 1; # FLAG INDICATING THAT COMMENT #
- # SPANS RECORD BOUNDARY. #
- GOTO LASTOFRECORD; # #
- EQUIV: # #
- STATLIST[CHRPTR] = S"LETTER"; # #
- GOTO STORECHAR; # #
- STARTSTATE: # #
- IF STATE EQ 13 THEN # CHECK ENDING SLASH LAST TIME. #
- BEGIN # #
- SLASHOP:
- SYNSTRUCTION = O"60000"; # SET THE OPERATOR FIELD. #
- DISPLAYINSTR = "/"; # STORE A SLASH. #
- IF STATLIST[CHRPTR] LS S"ASK" THEN
- BEGIN
- IF STATLIST[CHRPTR] EQ S"COLN" THEN
- STATE = 1;
- ELSE STATE = 2;
- CHRPTR = CHRPTR + 1;
- GOTO SLASH;
- END
- STATE = 2;
- GOTO SLASH; # GOTO SLASH PROCESSING SECTION #
- # OF SYNGEN. #
- END # #
- NAME[0] = " "; # BLANK FILL NAME. #
- NAME[1] = " "; # BLANK FILL NAME. #
- NAME[2] = " "; # BLANK FILL NAME. #
- NAME[3] = " "; # BLANK FILL NAME. #
- CHARIND = 0; # ZERO OUT CHAR/NUM INDICATOR. #
- M = -6; # INITIALIZE BIT POINTER. #
- N = 0; # SET WORD PTR TO 0. #
- GOTO STTRANSWTCH[SWITCHVALUE[STATLIST[CHRPTR],STATE]];
- SYNLBL: # #
- CHRPTR = CHRPTR + 1; # INCREMENT PTR TO NEXT CHAR. #
- IF CHARIND GR 0 AND CHARIND # CHECK IF THE LABEL HAS AN #
- NQ 2 THEN # ALPHA CHARACTER. #
- BEGIN # #
- IF LEXICONSCAN THEN # CHECK IF LABEL HAS THE SAME NAME #
- # AS A KEYWORD. #
- BEGIN
- WRDPTR = WRDPTR + N + 1; # SET PTR TO LEXSYNSECT. #
- IF LEXSYNSECT[WRDPTR] EQ -1 THEN
- LEXSYNSECT[WRDPTR] = LABELCOUNTER + 1;
- END
- SYMBOLLENGTH = N + 1; # STORE THE LENGTH OF LABEL IN #
- DISPLAYINSTR = NAME[0]; # STORE FIRST 7 CHARS OF LABEL #
- GOTO LABELS; # WORDS. PASS CONTROL. #
- END # #
- GOTO SYN1ERR; # UNRECONIZABLE STATEMENT. #
- SYNSLBL: # #
- CHRPTR = CHRPTR + 1; # INCREMENT PTR TO NEXT CHAR. #
- STATE = 2;
- IF CHARIND EQ 2 THEN # CHECK IF SUBLABEL IS ALL DIGIT#
- IF M LS 7 AND N EQ 0 THEN # CHECK IF SUBLABEL IS LESS THAN#
- BEGIN # 3 CHARACTERS. #
- CTEMP = NAME[0]; # ENTRY CONDITION FOR DISPLAY- #
- # TOBIN #
- DISPLAYTOBIN; # CONVERT THE VALUE IN CTEMP TO #
- # BINARY INTEGER. #
- SYNSTRUCTION = O"60000"; # SET OPERATOR CODE TO 6. #
- SUBLABEL = ITEMP; # STORE THE BINARY INTEGER VALUE#
- B<0,6>DISPLAYINSTR = ":"; # STORE : AND THE SUBLABEL NAME.#
- C<1,6>DISPLAYINSTR = NAME[0];
- GOTO SUBLABELS; # PASS CONTROL BACK TO SYNBUILD.#
- END # #
- GOTO SYN1ERR; # UNRECONIZABLE STATEMENT. #
- LBLSLASH: # #
- STATE = 13; # STATE FOR SLASH TERMINATOR. #
- GOTO LBL1CALL; # #
- LBLLCALL:
- STATE = 1; # COLON WAS ENDING DELIMITER. #
- GOTO LBL1CALL;
- LBLCALL: # #
- STATE = 2; # #
- LBL1CALL: # #
- SYMBOLLENGTH = N + 1; # STORE LENGTH OF LABEL IN WORDS#
- SYNSTRUCTION = O"24000"; # SET THE OPERATOR FIELD TO 5. #
- CHRPTR = CHRPTR + 1; # INCREMENT PTR TO NEXT CHAR. #
- DISPLAYINSTR = NAME[0]; # STORE THE NAME OF THE LABEL. #
- GOTO LABELCALL; # #
- NOSLASH: # #
- STATE = 13; # STATE FOR SLASH TERMINATOR. #
- GOTO SYN1NO; # #
- SYNLNO:
- STATE = 1; # COLON WAS ENDING DELIMITER. #
- GOTO SYN1NO;
- SYNNO: # #
- STATE = 2; # #
- SYN1NO: # #
- SYNSTRUCTION = 2; # SET OPERAND FIELD TO 2. #
- CHRPTR = CHRPTR + 1; # INCREMENT PTR TO NEXT CHAR. #
- DISPLAYINSTR = NAME[0]; # STORE NO. #
- GOTO DRIVERREQ; # PASS CONTROL. #
- YESSLASH: # #
- STATE = 13; # STATE FOR SLASH TERMINATOR. #
- GOTO SYN1YES; # #
- SYNLYES:
- STATE = 1; # COLON WAS WNDING DELIMITER. #
- GOTO SYN1YES;
- SYNYES: # #
- STATE = 2; # #
- SYN1YES: # #
- SYNSTRUCTION = 1; # SET OPERAND FIELD TO 1. #
- CHRPTR = CHRPTR + 1; # INCREMENT PTR TO NEXT CHAR. #
- DISPLAYINSTR = NAME[0]; # STORE YES. #
- GOTO DRIVERREQ; # PASS CONTROL. #
- SUBLLBLCALL:
- STATE = 1; # COLON WAS ENDING DELIMITER. #
- GOTO SUBLBLCALL;
- SUBLBLSLASH: # #
- STATE = 13; # STATE FOR SLASH TERMINATOR. #
- IF M LS 0 THEN
- GOTO SLASHOP;
- SUBLBLCALL: # #
- IF M LS 0 THEN # IGNORE CONTIGUOUS DELIMITERS. #
- GOTO SYN1CHAR; # #
- IF M GR 6 OR N GR 0 THEN # IF SUBLABEL EXCEEDS 2 CHARS - #
- GOTO SYN1ERR; # UNRECONIZABLE STATEMENT. #
- CHRPTR = CHRPTR + 1; # INCREMENT PTR TO NEXT CHAR. #
- CTEMP = NAME[0]; # ENTRY CONDITION FOR DISPLAYTO-#
- # BIN. #
- DISPLAYTOBIN; # CONVERT THE VALUE IN CTEMP TO #
- # BINARY INTEGER. #
- SUBLABEL = ITEMP; # STORE THE BINARY VALUE OF THE #
- # SUBLBL NAME. #
- SYNSTRUCTION = O"40000"; # SET THE HIGH ORDER BIT OF THE #
- # THE OPERATOR FIELD. #
- DISPLAYINSTR = NAME[0]; # STORE SUBLABEL NAME. #
- GOTO SUBLABELCALL; # PASS CONTROL. #
- DIAGSLASH: # #
- STATE = 13; # STATE FOR SLASH TERMINATOR. #
- GOTO SYN1DIAG; # #
- SYNLDIAG:
- STATE = 1; # COLON WAS ENDING DELIMITER. #
- GOTO SYN1DIAG;
- SYNDIAG: # #
- STATE = 2; # RESET STATE. #
- SYN1DIAG: # #
- CHRPTR = CHRPTR + 1; # INCREMENT PTR TO NEXT CHAR. #
- IF M GR 18 OR N GR 0 THEN # IF THE DIAG NUMBER EXCEEDS #
- GOTO SYN1ERR; # THAN 3 NUMBERS, ISSUE ERROR. #
- CTEMP = " ";
- B<0,M>CTEMP = B<6,M>NAME[0]; # ENTRY CONDITION FOR #
- # DISPLAYTOBIN. #
- DISPLAYTOBIN; # CONVERT THE VALUE IN CTEMP TO #
- # BINARY INTEGER. #
- SYNSTRUCTION = ITEMP LOR O"4000";# STORE A 2 IN THE OPERATOR #
- # FIELD AND THE BINARY VALUE OF #
- # THE DIAGNOSTIC NUMBER IN THE #
- # OPERAND FIELD. #
- DISPLAYINSTR = NAME[0]; # STORE DIAGNOSTIC. #
- GOTO DIAGNOSTIC; # PASS CONTROL. #
- SUBRSLASH: # #
- STATE = 13; # STATE FOR SLASH TERMINATOR. #
- GOTO SUBR1; # #
- SUBRL:
- STATE = 1; # COLON WAS ENDING DELIMITER. #
- GOTO SUBR1;
- SUBR: # #
- STATE = 2; # RESET STATE. #
- SUBR1: # #
- CHRPTR = CHRPTR + 1; # INCREMENT PTR TO NEXT CHAR. #
- IF N*60+M GR 66 OR # CHECK FOR SUBROUTINE NAME > 12#
- M LS 0 THEN # CHARS OR < 1 CHAR IN LENGTH. #
- GOTO SYN1ERR; # #
- SYMBOLLENGTH = N + 1; # STORE LENGTH OF SUBROUTINE IN #
- # WORDS. #
- SYNSTRUCTION = O"10000"; # SET OPERATOR TO 2. #
- B<0,6>DISPLAYINSTR = O"47"; # STORE AN ASK. #
- C<1,6>DISPLAYINSTR = NAME[0]; # 1ST 6 CHARS OF SUBROUTINE NAME#
- GOTO SUBROUTINE; # PASS CONTROL. #
- COLON: # #
- STATE = 1; # RESET STATE. #
- GOTO SYN1CHAR; # CHECK NEXT CHARACTER. #
- SYNY: # #
- STATE = 12; # #
- GOTO SYNCHAR; # #
- SYNE: # #
- STATE = 8; # #
- GOTO SYNCHAR; # #
- SYNS: # #
- STATE = 9; # #
- GOTO SYNCHAR; # #
- SYNN: # #
- STATE = 10; # #
- GOTO SYNCHAR; # #
- SYNO: # #
- STATE = 11; # #
- GOTO SYNCHAR; # #
- SYNKEY: # #
- SYNSTRUCTION = O"14000"; # SET THE OPERATOR FIELD TO 3. #
- GOTO KEYCOMMON;
- SYNKEYWRD: # #
- SYNSTRUCTION = O"20000"; # SET THE OPERATOR FIELD TO 4. #
- KEYCOMMON: # CODE COMMON TO BOTH $ AND - #
- STATE = 4; # KEYWORDS. #
- B<0,6>DISPLAYINSTR = B<0,6>CHAR[CHRPTR];# SAVE $ OR - . #
- GOTO SYN1CHAR; # #
- HYPHENCHECK:
- IF M LS 0 THEN # LABELS MAY NOT HAVE A HYPHEN #
- GOTO SYN1ERR; # AS THE FIRST CHARACTER NOR AS #
- IF STATLIST[CHRPTR+1] EQ S"COLN" THEN #THE LAST CHARACTER. #
- GOTO SYN1ERR;
- SYNLETTER: # #
- CHARIND = CHARIND LOR 1; # LOGICAL OR TO INDICATE ALPHA. #
- SYNCHAR: # #
- IF M EQ 54 THEN # SET WORD AND BIT POINTERS (N #
- BEGIN # AND M) TO THE NEXT CHARACTER #
- M = 0; # IN THE STRING BEING STORED IN #
- N = N + 1; # "NAME". #
- END # #
- ELSE M = M + 6; # #
- IF N GR 2 THEN # CHECK FOR A NAME EXCEEDING 30 #
- GOTO SYN1ERR; # CHARACTERS. #
- B<M,6>NAME[N] = B<0,6>CHAR[CHRPTR];# STORE CHARACTER IN NAME. #
- SYN1CHAR: # #
- CHRPTR = CHRPTR + 1; # INCREMENT PTR TO NEXT CHAR. #
- GOTO STTRANSWTCH[SWITCHVALUE[STATLIST[CHRPTR],STATE]];
- HYPHEN:
- IF STATLIST[CHRPTR+1] LQ S"SLSH" THEN #LABELS MAY CONTAIN HYPHENS#
- GOTO SYN1ERR; # THO NOT AS 1ST OR LAST CHARS. #
- SYNLETR: # #
- STATE = 7; # #
- GOTO SYNCHAR; # #
- SYNDIGIT: # #
- CHARIND = CHARIND LOR 2; # LOGICAL OR TO INDICATE NUMERIC#
- GOTO SYNCHAR; # #
- # #
- SYND: # #
- STATE = 6; # #
- GOTO SYNCHAR; # #
- SYNSUBR: # #
- STATE = 3; # #
- IF STATLIST[CHRPTR+1] EQ S"DIGIT" THEN # 1ST CHAR IN A ROUTINE #
- GOTO SYN1ERR; # NAME MUST BE ALPHABETIC. #
- GOTO SYN1CHAR; # #
- SYN1ERR:
- P<SERR> = LOC(USTATE);
- GOTO ERROREXIT;
- SYN4ERR:
- P<SERR> = LOC(UKEY);
- GOTO ERROREXIT;
- SYN5ERR:
- P<SERR> = LOC(UACT);
- ERROREXIT:
- FOR CHRPTR=CHRPTR STEP 1 UNTIL LASTCHAR DO
- BEGIN
- I = STATLIST[CHRPTR];
- IF I LS 1 THEN
- BEGIN
- STATE = 1;
- GOTO PRINTDMSG;
- END
- IF I LS 2 THEN
- BEGIN
- STATE = 2;
- GOTO PRINTDMSG;
- END
- IF I LS 3 THEN
- BEGIN
- STATE = 13;
- GOTO PRINTDMSG;
- END
- IF M EQ 54 THEN
- BEGIN
- N = N + 1;
- M = 0;
- END
- ELSE M = M + 6;
- B<M,6>NAME[N] = B<0,6>CHAR[CHRPTR];
- END
- STATE = 2;
- PRINTDMSG:
- CHRPTR = CHRPTR + 1;
- SYNERROR[4] = NAME[0];
- SYNERROR[5] = NAME[1];
- SYNERROR[6] = NAME[2];
- SYNERROR[7] = NAME[3];
- IF LFLAG EQ 0 THEN
- BEGIN
- SCALL CHKLINO;
- SYNORL = SYNIRL;
- SYNPRNT(SYNIWSA);
- END
- SCALL CHKLINO;
- SYNORL = 80;
- SYNPRNT(SERR);
- CHKERRCNT;
- GOTO SYNSCAN; # TRY TO FIND A LEGAL SOURCE WD.#
- SYNLKEYWRD:
- STATE = 1;
- GOTO SYN1KEYWRD;
- KEYSLASH: # #
- STATE = 13; # STATE FOR SLASH TERMINATOR. #
- GOTO SYN1KEYWRD;
- SYNKEYWORD: # #
- STATE = 2;
- SYN1KEYWRD:
- IF NOT LEXICONSCAN THEN # IF NAME IS NOT A KEY WORD THEN#
- GOTO SYN4ERR;
- CHRPTR = CHRPTR + 1; # INCREMENT PTR TO NEXT CHAR. #
- SYNSTRUCTION = SYNSTRUCTION + B<4,11>LEXWRD[WRDPTR+N+1];
- N = NAME[0];
- IF NAME[0] EQ ";" THEN # SPELL OUT SPECIAL CHARS THAT #
- N = "SEMICOLON "; # WILL CLOBBER SYMPL COMPILATION#
- ELSE IF NAME[0] EQ """" THEN
- N = "NOTEQUAL ";
- ELSE IF NAME[0] EQ "#" THEN
- N = "EQUIVALENC";
- B<6,36>DISPLAYINSTR = B<0,36>N;
- GOTO DRIVERREQ; # GOTO DRIVERREQ IN SYNBUILD. #
- SYNDRIVER:
- STATE = 5; # SET STATE FOR DRIVER REQUEST. #
- GOTO SYN1CHAR;
- SYNREQ:
- STATE = 2;
- SYN1REQUEST:
- FOR I=0 STEP 2 UNTIL 40 DO # SCAN PRESET ARRAY CONTAINING #004020
- BEGIN # DRIVER REQUESTS FOR A MATCH. #
- IF NAME[0] EQ SYNR[I] THEN # EACH WRD FOLLOWING THE DRIVER #
- BEGIN # REQUEST CONTAINS THE CORRESPON#
- SYNSTRUCTION = REQSTRUCTION[I]; # DING OPERATOR AND #
- CHRPTR = CHRPTR + 1; # OPERAND WHEN A MATCH IS FOUND #
- B<0,6>DISPLAYINSTR = O"45";#STORE + AND DRIVER REQUEST IN#
- B<6,36>DISPLAYINSTR = B<0,36>NAME[0];# DISPLAYINSTR. #
- GOTO DRIVERREQ; # STORE THE OPERATOR AND OPERAND#
- END
- END
- GOTO SYN5ERR; # DRIVER REQ WAS NOT FOUND. #
- DRIVERSLSH:
- STATE = 13; # STATE FOR SLASH TERMINATOR. #
- GOTO SYN1REQUEST;
- SYNLREQUEST:
- STATE = 1;
- GOTO SYN1REQUEST;
- END
- CONTROL EJECT;
- #**********************************************************************#
- # #
- # SYNXREF #
- # #
- #ROUTINE WHICH SORTS THE CROSS REFERENCE LISTS, FORMATS THEM AND WRITES#
- #THEM ON THE SYSTEM OUTPUT FILE. #
- # #
- #ENTRY CONDITIONS: #
- # THE THREE CROSS REFERENCE FILES - LXREF, DXREF, AND SXREF - MUST BE #
- # POSITIONED TO BOI. #
- #EXTERNAL REFERENCES: #
- # LXREFR, DXREFR, AND SXREFR ARE COMPASS ROUTINES WHICH READ RECORDS #
- # FROM THE LXREF, DXREF, AND SXREF FILES. #
- # #
- #EXIT CONDITIONS: #
- # THE THREE SORTED CROSS REFERENCE LISTS WILL BE WRITTEN ON THE SYSTEM#
- # OUTPUT FILE. #
- # #
- #ERROR CONDITIONS: #
- # NONE #
- # #
- PROC SYNXREF;
- BEGIN
- P<SORT> = NEXTAVAIL[51]; #BASE OF SORTING SPACE IS FIRST AVAIL- #
- #ABLE WORD IN THE FIELD LENGTH. #
- SORTFL = LASTAVAIL - P<SORT>; #FL AVAILABLE FOR SORTING #
- SYNEOF = 0; #TURN OFF EOF FLAG. #
- FOR N=0 STEP 1 UNTIL SORTFL DO #READ ENTIRE FILE INTO CORE. IT #
- BEGIN #MUST ALL FIT INTO CORE ELSE PUNT. #
- DXREFR(LOC(SORTWORD[N]));
- IF SYNEOF NQ 0 THEN #SYNEOF SET TO 1 WHEN EOF READ. #
- GOTO SORTDXREF;
- END
- IF SYNEOF EQ 0 THEN #ABORT IF DIAGNOSTICS FILE CANNOT ALL BE#
- SYNABT(0); #READ INTO CORE. #
- SORTDXREF:
- # SORT USING SHELL SORT ALGORITHM. #
- N = N - 1;
- M = N;
- NEXTINTERVAL:
- M = M/2;
- IF M EQ 0 THEN
- GOTO PRTDXREF;
- K = N - M;
- FOR J=0 STEP 1 UNTIL K DO
- BEGIN
- I = J;
- BACKTRACK:
- L = I + M;
- IF B<0,10>SORTWORD[I] LQ B<0,10>SORTWORD[L] THEN
- TEST J;
- LABELCOUNTER = SORTWORD[I];#SWAP LIST ELEMENTS, PUTTING THE #
- SORTWORD[I] = SORTWORD[L];#SMALLER FIRST IN THE LIST. #
- SORTWORD[L] = LABELCOUNTER;
- IF I GQ M THEN #SWAP REQUIRES BACKTRACKING. #
- BEGIN
- I = I - M;
- GOTO BACKTRACK;
- END
- END
- GOTO NEXTINTERVAL; #IF THRU WITH THIS SEGMENT, SORT NEW #
- # SEGMENT. #
- PRTDXREF:
- HDRTITLE[0] = "DIAGNOSTIC CROSS REFERENCE ";
- SCALL PRNTHDR;
- SYNORL = 38; #ERENCE LISTING. #
- SYNPRNT(DXREFHEADER2);
- SYNORL = 8;
- SYNPRNT(SKIPLINE);
- LINENO = 2; #COMPENSATE FOR EXTRA HEADER #
- FOR I=0 STEP 1 UNTIL 3 DO #BLANK OUT SCRATCH STORAGE FOR USE AS #
- SCRATCHWD[I] = " "; #A PRINT LINE STORAGE AREA. #
- IF N LS 0 THEN #IF NO DIAGNOSTICS THEN PRINT THE WORD #
- BEGIN # NONE. #
- SYNORL = 26;
- SCRATCHWD[0] = " NONE";
- SCRATCHWD[2] = "NONE";
- SYNPRNT(SCRATCH);
- GOTO READLXREF;
- END
- FOR I=0 STEP 1 UNTIL N DO #A LINE IS PRINTED FOR EACH DIAGNOSTIC #
- BEGIN #REFERENCE. #
- SCRATCHWD[4] = " "; #BLANK OUT SCRATCH WORDS WHICH MIGHT NOT#
- SCRATCHWD[5] = " "; #BE USED. #
- B<6,24>SCRATCHWD[0] = O"04000000" + B<12,18>SORTWORD[I];
- # ADD A "D" IN FRONT OF DIAG NUMBER. #
- P<SYMBOLTABLE> = B<42,18>SORTWORD[I];#SYMBOL TABLE ENTRY HAS #
- J = SLENGTH[0]; #NAME AND LENGTH OF NAME OF LABELLED #
- SCRATCHWD[2] = SNAME[0];#SECTION WITH DIAGNOSTIC REFERENCE. #
- IF J GR 1 THEN #MOVE ALL OF LABEL TO SCRATCH WSA. #
- BEGIN
- SCRATCHWD[3] = SNAME[1];
- IF J GR 2 THEN
- SCRATCHWD[4] = SNAME[2];
- END
- FOR L=54 STEP -6 WHILE B<L,6>SCRATCHWD[J+1] EQ 0 DO
- B<L,6>SCRATCHWD[J+1] = " ";
- B<0,6>SCRATCHWD[J + 2] = ":";#STORE : AND SUBLABEL IN WSA. #
- B<6,12>SCRATCHWD[J + 2] = B<30,12>SORTWORD[I];
- SCALL CHKLINO;
- SYNORL = 58;
- SYNPRNT(SCRATCH); #PRINT LINE OF CROSS REFERENCE LIST. #
- END
- READLXREF:
- SYNEOF = 0; #TURN OFF EOF FLAG. #
- FOR N=0 STEP 1 UNTIL SORTFL DO #READ ENTIRE LXREF INTO CORE. #
- BEGIN
- LXREFR(LOC(SORTWORD[N]));
- IF SYNEOF NQ 0 THEN
- GOTO SORTLXREF;
- END
- IF SYNEOF EQ 0 THEN #ABORT IF FILE WOULDN"T FIT IN CORE. #
- SYNABT(0);
- SORTLXREF:
- N = N - 1;
- SORTER; #CALL SORTING ROUTINE. #
- HDRTITLE[0] = "LABEL CROSS REFERENCE ";
- SCALL PRNTHDR;
- SYNORL = 58;
- SYNPRNT(LXREFHEADER2); #ERENCE LISTING. #
- SYNORL = 8;
- SYNPRNT(SKIPLINE);
- LINENO = 2; #COMPENSATE FOR EXTRA HEADER #
- SYNORL1 = 73;
- PRINTER; #CALL PRINTING PROCEDURE. #
- SYNEOF = 0; #TURN OFF EOF FLAG. #
- FOR N=0 STEP 1 UNTIL SORTFL DO #READ ENTIRE SXREF INTO CORE. #
- BEGIN
- SXREFR(LOC(SORTWORD[N]));
- IF SYNEOF NQ 0 THEN
- GOTO SORTSXREF;
- END
- IF SYNEOF EQ 0 THEN
- SYNABT(0);
- SORTSXREF:
- N = N - 1;
- SORTER;
- HDRTITLE[0] = "SUBROUTINE CROSS REFERENCE ";
- SCALL PRNTHDR;
- SYNORL = 58;
- SYNPRNT(SXREFHEADER2); #REFERENCE LISTING. #
- SYNORL = 38;
- SYNPRNT(SXREFHEADER3);
- LINENO = 2; #COMPENSATE FOR EXTRA HEADER #
- SYNORL1 = 78;
- PRINTER; #CALL PRINT FORMATTING ROUTINE. #
- RETURN;
- END
- CONTROL EJECT;
- #**********************************************************************#
- PROC SORTER;
- BEGIN
- M = N;
- NEXTINTERVAL:
- M = M/2;
- IF M EQ 0 THEN
- RETURN;
- K = N - M;
- FOR J=0 STEP 1 UNTIL K DO
- BEGIN
- I = J;
- BACKTRACK: L = I + M;
- P<SYMBOLTABLE> = B<42,18>SORTWORD[I];
- P<SYMBOLTABLE2> = B<42,18>SORTWORD[L];
- IF SNAME[0] GR SNAME2[0] THEN
- GOTO SWAPUM;
- IF SNAME[0] EQ SNAME2[0] THEN
- BEGIN
- IF SLENGTH[0] GR SLENGTH2[0] THEN
- GOTO SWAPUM;
- IF SLENGTH[0] EQ SLENGTH2[0] AND
- SLENGTH[0] GR 1 THEN
- BEGIN
- IF SNAME[1] GR SNAME2[1] THEN
- GOTO SWAPUM;
- IF SNAME[1] EQ SNAME2[1] AND
- SLENGTH[0] GR 2 AND
- SNAME[2] GR SNAME2[2] THEN
- BEGIN #SWAP IF OUT OF ORDER. #
- SWAPUM: LABELCOUNTER = SORTWORD[I];
- SORTWORD[I] = SORTWORD[L];
- SORTWORD[L] = LABELCOUNTER;
- IF I GQ M THEN
- BEGIN
- I = I - M;
- GOTO BACKTRACK;
- END
- END
- END
- END
- END
- GOTO NEXTINTERVAL;
- END
- CONTROL EJECT;
- #**********************************************************************#
- PROC PRINTER;
- BEGIN
- IF N LS 0 THEN #IF NO REFERENCES IN A CATEGORY, THEN #
- BEGIN # THE WORD NONE IS PRINTED. #
- SCRATCHWD[0] = " NONE";
- SCRATCHWD[1] = " ";
- SCRATCHWD[2] = " ";
- SCRATCHWD[3] = " ";
- SCRATCHWD[4] = "NONE";
- SYNORL = 48;
- SYNPRNT(SCRATCH);
- RETURN;
- END
- FOR I=0 STEP 1 UNTIL N DO #PRINT A LINE FOR EACH CROSS REF. #
- BEGIN
- FOR J=0 STEP 2 UNTIL 6 DO #BLANK OUT WSA TO ERASE LAST #
- BEGIN #RECORD THAT WAS WRITTEN. #
- SCRATCHWD[J] = " ";
- SCRATCHWD[J+1] = " ";
- END
- P<SYMBOLTABLE> = B<42,18>SORTWORD[I];#REFERENCED SYMBOL. #
- P<SYMBOLTABLE2> = B<24,18>SORTWORD[I];#SYMBOL DOING REF. #
- B<6,54>SCRATCHWD[0] = B<0,54>SNAME[0];#MOVE NAME OF SYMBL#
- B<0,6>SCRATCHWD[1] = B<54,6>SNAME[0];#BEING REFERENCED. #
- K = SLENGTH[0];
- IF K GR 1 THEN
- BEGIN
- B<6,54>SCRATCHWD[1] = B<0,54>SNAME[1];
- B<0,6>SCRATCHWD[2] = B<54,6>SNAME[1];
- IF K GR 2 THEN
- BEGIN
- B<6,54>SCRATCHWD[2] = B<0,54>SNAME[2];
- B<0,6>SCRATCHWD[3] = B<54,6>SNAME[2];
- END
- END
- FOR J=0 STEP -6 WHILE B<J,6>SCRATCHWD[K] EQ 0 DO
- BEGIN #REPLACE TRAILING ZEROS WITH BLANKS. #
- B<J,6>SCRATCHWD[K] = " ";
- IF J EQ 0 THEN
- BEGIN
- J = 60;
- K = K- 1;
- END
- END
- IF STYPE[0] EQ "L" THEN #IF LABEL CROSS REFERENCE BEING #
- BEGIN #PRINTED, THEN PRINT SUBLABEL REFERENCE.#
- IF B<12,12>SORTWORD[I] NQ O"5555" THEN
- BEGIN
- K = K + 1;
- B<0,6>SCRATCHWD[K] = ":";
- B<6,12>SCRATCHWD[K] = B<12,12>SORTWORD[I];
- END
- END
- ELSE #IF SUBROUTINE CROSS REFERENCE BEING #
- BEGIN #PRINTED, LIST THE SWITCH POSITION ALSO,#
- ITEMP = SVALUE[0];#IN BOTH DECIMAL AND OCTAL. #
- BINTODISPOCT;
- FOR M=30 STEP 6 UNTIL 48 DO
- BEGIN
- IF B<M,6>OCTAL[1] NQ O"33" THEN
- GOTO STOREOCTPOS;
- B<M,6>OCTAL[1] = O"55";
- END
- STOREOCTPOS:
- B<30,30>SCRATCHWD[2] = B<30,30>OCTAL[1];
- BINTODISPDEC;
- B<30,30>SCRATCHWD[1] = B<0,30>CTEMP;
- END
- IF P<SYMBOLTABLE2> NQ P<SYMBOLTABLE> THEN #REFERENCING #
- BEGIN #SYMBOL PRINTED ONLY IF DIFFERENT FROM #
- SCRATCHWD[4] = SNAME2[0];#REFERENCED SYMBOL. #
- K = SLENGTH2[0];
- IF K GR 1 THEN
- BEGIN
- SCRATCHWD[5] = SNAME2[1];
- IF K GR 2 THEN
- SCRATCHWD[6] = SNAME[2];
- END
- K = K + 3;
- FOR L=54 STEP -6 WHILE B<L,6>SCRATCHWD[K] EQ 0 DO
- B<L,6>SCRATCHWD[K] = " ";#REPLACE ZEROS = BLANKS. #
- K = K + 1;
- END
- ELSE K = 4;
- B<0,6>SCRATCHWD[K] = ":";
- B<6,12>SCRATCHWD[K] = B<0,12>SORTWORD[I];
- SCALL CHKLINO;
- SYNORL = SYNORL1;
- SYNPRNT(SCRATCH);
- END
- RETURN;
- END
- CONTROL EJECT;
- #**********************************************************************#
- # #
- # BINTODISPDEC #
- # #
- #ROUTINE WHICH CONVERTS BINARY INTEGERS INTO DISPLAY-CODED DECIMAL #
- #INTEGERS. #
- # #
- #ENTRY CONDITIONS: #
- # ITEMP CONTAINS AN UNSIGNED BINARY INTEGER TO BE CONVERTED. #
- # #
- #EXIT CONDITIONS: #
- # CTEMP CONTAINS THE DECIMAL RESULT IN DISPLAY CODE, TRUNCATED TO FIVE#
- # DIGITS IF NECESSARY, IN THE LEFTMOST FIVE CHARACTERS. #
- # #
- #ERROR CONDITIONS: NONE #
- # #
- PROC BINTODISPDEC;
- ITEM I;
- BEGIN
- CTEMP = " 0"; #INITIALIZE CTEMP. #
- FOR I=24 STEP -6 WHILE ITEMP GR 0 DO #CONVERT BY POWERS OF 10. #
- BEGIN
- J = ITEMP/10;
- B<I,6>CTEMP = ITEMP - J*10 + O"33";#ADD DISPLAY CODE BIAS. #
- ITEMP = J;
- END
- RETURN;
- END
- CONTROL EJECT;
- #**********************************************************************#
- # #
- # DISPLAYTOBIN #
- # #
- #ROUTINE TO CONVERT DISPLAY-CODED DECIMAL INTEGERS INTO BINARY. #
- # #
- #ENTRY CONDITIONS: #
- # CTEMP CONTAINS A DISPLAY-CODED, UNSIGNED, DECIMAL INTEGER, LEFT-JUS-#
- # TIFIED. #
- #EXIT CONDITIONS: #
- # ITEMP CONTAINS THE BINARY VALUE OF CTEMP #
- # #
- PROC DISPLAYTOBIN;
- BEGIN
- ITEMP = 0; #INITIALIZE RESULT TO ZERO. #
- FOR I=0 STEP 6 UNTIL 54 DO
- BEGIN
- J = B<I,6>CTEMP;
- IF J EQ O"55" AND # SKIP LEADING BUT NOT TRAILING #
- ITEMP NQ 0 THEN # BLANKS. #
- RETURN;
- IF J GR O"44" OR
- J LS O"33" THEN
- BEGIN
- BADDIGIT[1] = CTEMP;
- SCALL CHKLINO;
- SYNORL = 43;
- SYNPRNT(BADDIGITMSG);
- CHKERRCNT;
- END
- ITEMP = ITEMP*10 + J-O"33";
- END
- END
- CONTROL EJECT;
- #**********************************************************************#
- # #
- # BINTODISPOCT #
- # #
- #ROUTINE TO CONVERT BINARY INTEGERS INTO DISPLAY CODED OCTAL INTEGERS. #
- # #
- #ENTRY CONDITIONS: #
- # ITEMP CONTAINS A BINARY VALUE TO BE CONVERTED. #
- # #
- #EXIT CONDITIONS: #
- # OCTAL CONTAINS THE TWENTY DISPLAY-CODED CHARACTERS WHICH ARE THE #
- # RESULT. #
- # #
- PROC BINTODISPOCT;
- ITEM I;
- BEGIN
- IF B<0,30>ITEMP NQ 0 THEN #TAKE A SHORT CUT IF LESS THAN 31 SIG- #
- FOR I=0 STEP 3 UNTIL 27 DO #NIFICANT BITS, ELSE GRIND IT OUT. #
- B<I*2,6>OCTAL[0] = B<I,3>ITEMP + O"33";
- ELSE OCTAL[0] = O"33333333333333333333";
- FOR I=30 STEP 3 UNTIL 57 DO
- B<(I-30)*2,6>OCTAL[1] = B<I,3>ITEMP + O"33";
- RETURN;
- END
- CONTROL EJECT;
- #**********************************************************************#
- # #
- # WALKCHAIN #
- # #
- #ROUTINE TO WALK DOWN CHAIN OF REFERENCES AND REPLACE POINTERS WITH THE#
- #DISPLAY-CODED INSTRUCTION IN "SYNSTRUCTION". #
- #THE CHAIN IS TERMINATED BY A NEGATIVE POINTER VALUE. #
- # #
- # ENTRY CONDITIONS: #
- # K CONTAINS THE SYNTBLE WORD ADDRESS OF THE 1ST ENTRY IN THE CHAIN. #
- # SYNSTRUCTION CONTAINS THE DISPLAY-CODED INSTRUCTION TO BE STORED. #
- # SYNTBLEWORD CONTAINS THE INDEX OF THE LWA+1 OF SYNTBLE. #
- # #
- #EXTERNAL REFERENCES: #
- # SYNTBLR AND SYNTBLW ARE COMPASS ROUTINES WHICH READ AND WRITE THE #
- # SYNTBLE FILE. #
- # #
- #EXIT CONDITIONS: #
- # THE CHAIN POINTERS WILL BE REPLACED BY THE CONTENTS OF SYNSTRUCTION.#
- # #
- #ERROR CONDITIONS: #
- # A ZERO POINTER VALUE IS AN ERROR, AND IS DIAGNOSED WITH A DAYFILE #
- # MESSAGE AND AN ABORT OF SYNGEN. #
- # #
- PROC WALKCHAIN;
- ITEM ITEMP;
- BEGIN
- NEXTENTRY:
- IF K GR SYNTBLEWORD THEN #IF THE ADDRESS IS IN THE WSA CURRENTLY #
- BEGIN #BEING BUILT, THEN 1ST CHAIN ENTRY IS IN#
- ITEMP = K - (SYNTBLEWORD+6);#THE ARRAY "PRESETCODE" AND NOT #
- L = PRESETI[ITEMP]; #IN THE FILE. #
- PRESETI[ITEMP] = SYNSTRUCTION;
- GOTO CKENDOFCHAIN;
- END
- IF K EQ 0 THEN SYNABT(4); # IF A ZERO VALUE FOR LINK POINTER #
- SYNTBLR(SCRATCH,K); #FETCH WORD OF SYNTBLE CONTAINING NEXT #
- #IN CHAIN OF REFERENCES. #
- L = SCRATCHWD[0]; #SAVE PTR TO NEXT CHAIN ENTRY. #
- B<0,60>SCRATCHWD[0] = SYNSTRUCTION;#STORE INSTRUCTION. #
- SYNTBLW(SCRATCH,K); #STORE UPDATED SYNTBLE WORD BACK. #
- CKENDOFCHAIN:
- IF L LS 0 THEN RETURN; #RETURN IF END OF CHAIN REACHED. #
- K = L;
- GOTO NEXTENTRY;
- END
- END
- TERM
- *CWEOR,0
- IDENT SYNIO
- ENTRY SYNOPEN
- ENTRY SYNCLSE
- ENTRY SYNREAD
- ENTRY SYNPRNT
- ENTRY SXREFWS
- ENTRY DXREFWS
- ENTRY LXREFWS
- ENTRY SYNTWSA
- ENTRY SYNABT
- ENTRY TRACEW
- ENTRY LXREFW
- ENTRY DXREFW
- ENTRY SXREFW
- ENTRY SYNCOPY
- ENTRY LXREFR
- ENTRY DXREFR
- ENTRY SXREFR
- ENTRY SYNCOM
- ENTRY SYNIWSA INPUT WORKING STORAGE AREA
- ENTRY SYNEOF INDICATES END OF FILE (1=EOF)
- ENTRY LFLAG LFLAG=1 NO OUTPUT LISTINGS
- ENTRY REWIND REWIND=1 REWIND PRESET FILE AT EOJ.
- ENTRY SYNIRL LENGTH OF THE INPUT RECORD
- ENTRY SYNORL LENGTH OF THE OUTPUT RECORD
- ENTRY TFLAG
- ENTRY OUTLEN RECORD LENGTH FOR COMPILE FILE
- ENTRY REALEOF
- ENTRY SKIPFLG FLAG FOR CONDITIONAL SKIPPING
- ENTRY DIRFLAG FLAG FOR COND. SKIP DIRECTIVE
- EXT HDRDATE
- EXT HDRTIME
- ENTRY SYNTIDA
- SST
- ************************************************************************
- * * S Y N O P E N * *
- * *
- * ENTRY CONDITIONS: *
- * THE FIRST WORD OF SYNIWSA CONTAINS THE INPUT FILE LFN. *
- * THE SECOND WORD OF SYNIWSA CONTAINS THE PRESET FILE LFN. *
- * THE THIRD WORD OF SYNIWSA CONTAINS A RECORD TYPE FLAG. *
- * 0=C (DEFAULT) (FILES INPUT, OUTPUT AND PRESET) *
- * 1=W *
- * THE FOURTH WORD OF SYNIWSA CONTAINS A BLOCKING TYPE FLAG. *
- * 0=Z (DEFAULT) (FILES INPUT, OUTPUT AND PRESET) *
- * 1=I *
- * LFLAG IS SET TO INDICATE IF LISTINGS ARE ON OR OFF. *
- * LFLAG = 1 ON *
- * LFLAG = 0 OFF *
- * TFLAG IS SET TO INDICATE IF THE TRACEM PRESET IS TO BE CREATED. *
- * TFLAG = 1 ON *
- * TFLAG = 0 OFF *
- * EXIT CONDITIONS: *
- * FILES INPUT, OUTPUT, PRSET, SYNTBLE ARE OPEN. TRACEM FILE IS OPEN *
- * IF TFLAG = 1. FILES LXREF,DXREF, SXREF ARE OPEN IF LFLAG = 1. *
- * THE FIRST WORD OF SYNIWSA CONTAINS THE NUMBER OF WORDS IN SYNGEN"S*
- * FIELD LENGTH. THE HEADERS: *
- * PROC SYN *
- * TAXTABLE; *
- * BEGIN *
- * XDEF *
- * BEGIN *
- * ARE WRITTEN ON THE PRESET FILE. *
- * EXTERNAL REFERENCE: *
- * 6RM MACROS OPENM, STORE, FETCH. SCOPE MACRO MEMORY. *
- * DESCRIPTION: *
- * THE BUFFERS FOR THE SYNTBLE AND TRACEM FILES ARE ALLOCATED AT EXE-*
- * CUTION TIME. LFLAG IS CHECKED TO DETERMINE IF THE CROSS-REFERENCE *
- * FILES ARE TO BE OPENED. TFLAG IS CHECKED TO SEE IF THE TRACEM FILE*
- * IS TO BE OPENED. THE MEMORY MACRO IS USED TO GET THE NUMBER OF *
- * WORDS IN SYNGEN"S FIELD LENGTH. CONTROL IS RETURNED TO SYNCNTRL. *
- ************************************************************************
- SYNOPEN DATA 0
- SA1 INFILE GET INPUT FILE LFN PASSED BY SYNGEN.
- SA2 OUTFILE GET PRESET LFN PASSED BY SYNGEN.
- BX7 X1 OVERLAY THE LFN IN THE INPUT AND COMPILE
- BX6 X2 FITS WITH THE LFNS IN INFILE AND OUTFILE.
- SA7 INPUT
- SA6 COMPILE
- SA1 LSTFILE INSERT ALTERNATE NAME FOR LISTING FILE.
- BX6 X1
- SA6 OUTPUT
- SA3 65B GET PTR TO LWA+1 OF LOADED CODE.
- SX2 260 BUFFER FOR TRACEM
- SX4 X3 ISOLATE ADDRESS OF NEXT AVAILABLE WORD.
- IX6 X2+X3 INCREMENT PTR TO NEXT AVAILABLE WORD.
- SA6 65B STORE NEW PTR, ALLOCATING THE 2 BUFFERS.
- STORE TRACEM,FWB=X4 ASSIGN BUFFER FOR TRACEM.
- OPENM INPUT,INPUT,N INPUT TO SYNGEN
- OPENM OUTPUT,OUTPUT,N SYNGENS OUTPUT FILE
- OPENM COMPILE,I-O,N SYNGENS PRESET FILE
- SA1 LFLAG GET OUTPUT FLAG.
- ZR X1,CKTRACE IF LFLAG=0 THEN THERE IS NO NEED TO OPEN
- THE CROSS-REFERENCE FILES.
- OPENM LXREF,I-O,N FILE THAT THE LABEL CROSS-REFERENCE LISTING
- IS BUILT ON.
- OPENM DXREF,I-O,N FILE THAT THE DIAGNOSTIC CROSS-REFERENCE
- LISTING IS BUILT ON.
- OPENM SXREF,I-O,N FILE THAT THE SUBROUTINE CROSS-REFERENCE
- LISTING IS BUILT ON.
- CKTRACE SA1 TFLAG GET TRACE FLAG
- ZR X1,OPENEND IF TFLAG=0 THERE IS NO NEED TO OPEN THE
- TRACE FILE.
- OPENM TRACEM,I-O,N FILE THAT THE TRACE PRESET IS BUILT ON.
- OPENEND MEMORY CM,SYNMEM,R GET FIELD LENGTH.
- SA1 SYNMEM STORE FIELD LENGTH.
- AX1 30 SHIFT TO THE RIGHT THE NUMBER OF CM WORDS.
- BX7 X1
- SA7 SYNIWSA PASS THE NUMBER OF CM WORDS BACK TO SYNCTRL
- IN THE 1ST WORD OF THE INPUT WSA.
- EQ SYNOPEN RETURN TO SYNCTRL.
- ************************************************************************
- *
- * * SYNTIDA *
- *
- * USE SYSTEM MACROS TO INSERT TIME AND DATE IN HEADER LINE
- *
- SYNTIDA DATA 0
- DATE HDRDATE
- CLOCK HDRTIME
- EQ SYNTIDA
- ************************************************************************
- * * S Y N R E A D * *
- * *
- * ENTRY CONDITIONS: *
- * LFLAG IS SET TO INDICATE IF THE OUTPUT LISTINGS ARE ON OR OFF. *
- * EXIT CONDITIONS: *
- * THE INPUT RECORD IS STORED IN WORKING STORAGE AREA "SYNIWSA". THE *
- * LENGTH OF THE INPUT RECORD IS STORED IN SYNIRL. SYNEOF IS SET TO *
- * 1 IF AN END OF FILE CONDITION IS FOUND IN THE INPUT FILE. *
- * EXTERNAL REFERENCES: *
- * 6RM MACROS GET, PUT AND FETCH. *
- * DESCRIPTION: *
- * SYNREAD READS A RECORD FROM SYNGEN"S INPUT FILE AND STORES IT IN *
- * THE WORKING STORAGE AREA SYNIWSA. IF LFLAG IS ON, THE ADDRESS OF *
- * SYNIWSA IS PASSED TO THE PUT MACRO AND THE INPUT RECORD IS WRITTEN*
- * ONTO THE OUTPUT FILE. THE LENGTH OF THE INPUT RECORD, IN CHARACT- *
- * ERS, IS STORED SYNIRL BY MEANS OF THE FETCH MACRO. *
- * *
- * CHKSKIP IS CALLED TO RECOGNIZE SPECIAL COMPILER DIRECTIVES. TWO *
- * FLAGS, DIRFLAG AND SKIPFLG, WILL BE SET BY CHKSKIP TO INDICATE *
- * WHETHER OR NOT THE INPUT LINE IS TO BE PROCESSED BY THE COMPILER. *
- * SYNREAD PERFORMS SPECIAL PROCESSING FOR THE FLAG VALUES: *
- * *
- * DIRFLAG = 1, THE INPUT LINE WAS A COMPILER DIRECTIVE, AND IS *
- * NOT TO BE PROCESSED BY THE COMPILER. THE VALUE *
- * OF SKIPFLG IS IRRELEVANT. *
- * *
- * DIRFLAG = 0, THE INPUT LINE WAS NOT A COMPILER DIRECTIVE, AND *
- * THE VALUE OF SKIPFLG CONTROLS WHETHER OR NOT THE *
- * LINE WILL BE PROCESSED BY THE COMPILER. *
- * *
- * SKIPFLG = 0, THE INPUT LINE IS NOT UNDER THE CONTROL OF *
- * CONDITIONAL COMPILATION DIRECTIVES, AND SHOULD *
- * BE PROCESSED BY THE COMPILER. *
- * *
- * SKIPFLG = 1, THE INPUT LINE IS BEING SKIPPED BY CONDITIONAL *
- * COMPILATION DIRECTIVES, AND SHOULD NOT BE *
- * PROCESSED BY THE COMPILER. *
- * *
- * SKIPFLG = -1, THE INPUT LINE IS BEING INCLUDED BY CONDITIONAL *
- * COMPILATION DIRECTIVES, AND SHOULD BE PROCESSED *
- * BY THE COMPILER. *
- * *
- ************************************************************************
- SYNREAD JP *+400000B ENTRY/EXIT
- SYNRD1 GET INPUT,SYNIWSA,90 MOVE 90 CHAR INPUT RECORD TO SYNIWSA
- RJ =XCHKSKIP CHK IF COMPILER DIRECTIVE OR SKIPPING
- FETCH INPUT,RL,X7 FETCH RECORD LENGTH FROM FIT INTO X7
- SA7 SYNIRL SAVE IT FOR FUTURE USE
- SA3 LFLAG LISTING FLAG. SHOULD WE WRITE OUTPUT
- ZR X3,SYNRD5 IF NO LISTING...JUST CHECK FLAGS
- SA3 =10H NULL NOTATION...LEADING BLANKS
- SA4 DIRFLAG CHECK FOR A DIRECTIVE
- ZR X4,SYNRD2 IF NOT A DIRECTIVE
- SA3 =10H - NOTATION FOR A DIRECTIVE
- EQ SYNRD4
- SYNRD2 SA4 SKIPFLG CHECK THE SKIPPING FLAG
- ZR X4,SYNRD4 IF NO SPECIAL SKIPPING
- MI X4,SYNRD3 IF NOT SKIPPING ON AN -IFEQ-
- SA3 =10H - NOTATION FOR SKIPPING
- EQ SYNRD4
- SYNRD3 SA3 =10H + NOTATION FOR IFEQ INCLUSION
- SYNRD4 BX6 X3 (X3) HAS FIRST WORD FOR OUTPUT LINE
- SA6 SYNWS STORE AS FIRST WORD OF LINE
- SX7 X7+10 RECORD LENGTH + LEADING WORD
- PUT OUTPUT,SYNWS,X7 PUT THE RECORD ON THE LISTING FILE
- SYNRD5 SA3 SKIPFLG CHECK THE SKIPPING FLAG
- SX3 X3-1 JUST WANT TO CHECK FOR SKIPFLG = 1
- PL X3,SYNRD1 IF SKIPPING, GET NEXT RECORD
- SA3 DIRFLAG CHECK DIRECTIVE FLAG
- NZ X3,SYNRD1 IF SKIPPING, GET NEXT RECORD
- EQ SYNREAD RETURN TO CALLER
- ************************************************************************
- * * S Y N P R N T * *
- * *
- * ENTRY CONDITION: *
- * THE ADDRESS OF THE WORKING STORAGE AREA THAT CONTAINS THE RECORD *
- * THAT IS TO BE WRITTEN ON THE OUTPUT FILE IS PASSED IN THE PARA- *
- * METER LIST. THE LENGTH OF THE RECORD TO BE PRINTED IS PASSED IN *
- * SYNORL *
- * EXIT CONDITION: *
- * RECORD IN THE WORKING STORAGE AREA PASSED TO SYNPRNT IS WRITTEN *
- * ONTO THE OUTPUT FILE. *
- * EXTERNAL REFERENCE: *
- * 6RM MACRO PUT. *
- * DESCRIPTION: *
- * WRITES A RECORD CONTAINED IN A WORKING STORAGE AREA ON TO THE *
- * OUTPUT FILE. *
- ************************************************************************
- SYNPRNT DATA 0
- SA3 SYNORL LENGTH OF THE OUTPUT RECORD.
- PUT OUTPUT,X1,X3 MOVE RECORD FROM WROKING STORAGE AREA,
- * PASSED IN X1, TO THE OUTPUT FILE.
- EQ SYNPRNT RETURN TO CALLER.
- ************************************************************************
- * * TRACEW * *
- * *
- * ENTRY CONDITION: *
- * NONE. *
- * EXIT CONDITION: *
- * RECORD CONTAINED IN THE WORKING STORAGE AREA "SYTWSA" IS WRITTEN *
- * TO THE TRACEM FILE. *
- * EXTERNAL REFERENCE: *
- * 6RM MACRO PUT. *
- * DESCRIPTION: *
- * WRITES THE RECORD CONTAINED IN THE WORKING STORAGE AREA "SYNTWSA" *
- * ONTO THE TRACEM FILE. *
- ************************************************************************
- TRACEW DATA 0
- PUT TRACEM,SYNTWSA,60 MOVE TRACE RECORD INTO THE TRACEM
- * FILE.
- EQ TRACEW RETURN TO CALLER.
- ************************************************************************
- * * LXREFW * *
- * *
- * ENTRY CONDITION: *
- * NONE. *
- * EXIT CONDITION: *
- * RECORD CONTAINED IN THE WORKING STORAGE AREA "LXREFWS" IS WRITTEN *
- * TO THE LXREF FILE. *
- * EXTERNAL REFERENCE: *
- * 6RM MACRO PUT. *
- * *
- * DESCRIPTION: *
- * WRITES THE RECORD CONTAINED IN THE WORKING STORAGE AREA "LXREFWS" *
- * ONTO THE LXREF FILE. *
- ************************************************************************
- LXREFW DATA 0
- PUT LXREF,LXREFWS,10 MOVE LABEL CROSS-REFERENCE RECORD
- * INTO THE LXREF FILE.
- EQ LXREFW RETURN TO CALLER
- ************************************************************************
- * * DXREFW * *
- * *
- * ENTRY CONDITION: *
- * NONE. *
- * EXIT CONDITION: *
- * RECORD CONTAINED IN THE WORKING STORAGE AREA "DXREFWS" IS WRITTEN *
- * TO THE DXREF FILE. *
- * EXTERNAL REFERENCE: *
- * 6RM MACRO PUT. *
- * DESCRIPTION: *
- * WRITES THE RECORD CONTAINED IN THE WORKING STORAGE AREA "DXREFWS" *
- * ONTO THE DXREF FILE. *
- ************************************************************************
- DXREFW DATA 0
- PUT DXREF,DXREFWS,10 MOVE DIAGNOSTIC CROSS-REFERENCE
- * RECORD INTO THE DXREF FILE.
- EQ DXREFW RETURN TO CALLER.
- ************************************************************************
- * * SXREFW * *
- * *
- * ENTRY CONDITION: *
- * NONE. *
- * EXIT CONDITION: *
- * RECORD CONTAINED IN THE WORKING STORAGE AREA "SXREFWS" IS WRITTEN *
- * TO THE SXREF FILE. *
- * EXTERNAL REFERENCE: *
- * 6RM MACRO PUT. *
- * DESCRIPTION: *
- * WRITES THE RECORD CONTAINED IN THE WORKING STORAGE AREA "SXREFWS" *
- * ONTO THE SXREF FILE. *
- ************************************************************************
- SXREFW DATA 0
- PUT SXREF,SXREFWS,10 MOVE SUBROUTINE CROSS-REFERENCE
- * RECORD INTO THE SXREF FILE.
- EQ SXREFW RETURN TO CALLER.
- ************************************************************************
- * * SYNCOPY * *
- * *
- * ENTRY CONDITIONS: *
- * LFLAG INDICATES IF THE OUTPUT LISTINGS ARE ON OR OFF. THE HEADER *
- * OF THE TRACEM ARRAY IS STORED IN THE WORKING STORAGE AREA SYNIWSA.*
- * EXIT CONDITIONS: *
- * THE FILES "SYNTBLE" AND "TRACEM" ARE WRITTEN TO THE PRESET FILE *
- * AND IF LFLAG = 1, THEY ARE WRITTEN TO THE OUTPUT FILE. RA + 65 IS *
- * SET TO THE FIRST WORD OF THE SYNTBLE BUFFER (SYNBUF). *
- * EXTERNAL REFERENCE: *
- * 6RM MACROS GET,PUT,REWIND AND CLOSEM. *
- * SYNIO ROUTINES SYNPRNT AND SYNCOM. *
- * DESCRIPTION: *
- * REWINDS THE FILES "SYNTBLE" AND "TRACEM". COPIES THE FILES TO THE *
- * PRESET FILE, AND IF LFLAG = 1 COPIES THEM TO THE OUTPUT FILE. *
- * AFTER THE FILES ARE COPIED, THE FILES ARE CLOSED. IN ORDER TO FREE*
- * ENOUGH BUFFER SPACE FOR THE CROSS-REFERENCE SORTS BY SYNBUILD, THE*
- * ADDRESS OF THE FIRST WORD OF THE SYNTBLE BUFFER IS STORED IN *
- * RA + 65. *
- ************************************************************************
- SYNCOPY DATA 0
- SA1 X1
- SX6 X1-1
- SA6 SYNORL SAVE NUMBER OF WORDS IN SYNTBLE.
- SX6 -5 INITIALIZE WORD ADDRESS OF LAST RECORD READ
- SA6 SYNIRL FROM SYNTBLE FILE AND SAVE IN SCRATCH WORD.
- COPYTWO SA2 SYNIRL GET ADDRESS OF LAST RECORD READ.
- SX3 6
- IX6 X3+X2 INCREMENT TO GET WORD ADDRESS OF NEXT
- SA6 A2 RECORD AND SAVE.
- SA1 SCPARM
- RJ =XSYNTBLR GO READ A RECORD FROM SYNBOL TABLE
- SX1 SYNCWSA CKTFLAG.
- RJ SYNCOM WRITE OUT THE RECORD.
- SA1 SYNORL CHECK FOR EOF.
- SX6 X1-6
- ZR X6,CKTFLAG
- SA6 A1
- EQ COPYTWO COPY NEXT RECORD.
- CKTFLAG SA3 TFLAG GET TRACE FLAG.
- ZR X3,RA65 IF TFLAG IS OFF THERE IS NO TRACE TABLE,
- * GOTO SET RA + 65 ROUTINE. IF TFLAG IS ON
- REWINDM TRACEM COPY THE TRACEM FILE TO THE PRESET FILE.
- REWTRAC SX1 SYNIWSA WRITE TRACEM HEADER OUT.
- RJ SYNCOM
- COPY2 GET TRACEM,SYNTWSA,60 COPY UNTILL END-OF-DATA, THEN GOTO
- SX1 SYNTWSA DATA EXIT IN FILE MACRO.
- RJ SYNCOM WRITE OUT THE RECORD.
- EQ COPY2 COPY NEXT RECORD.
- RA65 FETCH TRACEM,FWB,X6
- SA3 65B
- MX0 42
- BX4 X3*X0
- IX7 X6+X4
- SA7 A3 STORE TRACEM BUFFER ADDRESS INTO RA+65.
- SA3 TFLAG GET TRACE FLAG.
- ZR X3,SYNCOPY IF TLFAG = 0 TRACEM FILE WAS NEVER OPENED,
- REWINDM TRACEM
- * FILE
- EQ SYNCOPY RETURN TO CALLER.
- SCPARM VFD 60/SYNCWSA
- VFD 60/SYNIRL
- ************************************************************************
- * * LXREWR * *
- * *
- * ENTRY CONDITION: *
- * ADDRESS OF THE WORKING STORAGE WHERE THE RECORD IS TO BE STORED *
- * IS PASSED IN THE PARAMETER LIST. *
- * EXIT CONDITION: *
- * RECORD IS STORED IN THE WORKING STORAGE AREA PASSED TO LXREWR. *
- * SYNEOF IS SET TO 1 WHEN END-OF-FILE OCCURS. *
- * EXTERNAL REFERENCE: *
- * 6RM MACROS GET AND FETCH. *
- * DESCRIPTION: *
- * GETS A RECORD FROM THE FILE LXREF AND STORES IT IN THE WORKING *
- * STORAGE AREA PASSED TO LXREFR. A CHECK IS MADE TO DETERMINE IF AN *
- * END-OF-SECTION OR END-OF-FILE HAS OCCURED. IF END-OF-SECTION READ *
- * NEXT RECORD, IF END-OF-FILE SET SYNEOF TO 1. *
- ************************************************************************
- LXREFR DATA 0
- SA1 X1
- BX7 X1
- SA7 SYNMEM SAVE ADDRESS.
- LXRD SA1 SYNMEM
- GET LXREF,X1,10 MOVE RECORD TO THE WORKING
- STORAGE AREA PASSED TO LXREFR.
- EQ LXREFR RETURN TO CALLER
- ************************************************************************
- * * DXREFR * *
- * *
- * ENTRY CONDITION: *
- * ADDRESS OF THE WORKING STORAGE AREA WHERE THE RECORD IS TO BE *
- * STORED IS PASSED IN THE PARAMETER LIST. *
- * EXIT CONDITION: *
- * RECORD IS STORE IN THE WORKING STORAGE AREA PASSED TO DXREFR. *
- * SYNEOF IS SET TO 1 WHEN END-OF-FILE OCCURS. *
- * EXTERNAL REFERENCE: *
- * 6RM MACROS GET AND FETCH. *
- * DESCRIPTION: *
- * GETS A RECORD FROM THE DXREF FILE AND STORES IT IN THE WORKING *
- * STORAGE AREA PASSED TO DXREFR. A CHECK IS MADE TO DETERMINE IF AN *
- * END-OF-SECTION OR END-OF-FILE HAS OCCURED. IF END-OF-SECTION, READ*
- * NEXT RECORD, IF END-OF-FILE SET SYNEOF TO 1. *
- ************************************************************************
- DXREFR DATA 0
- SA1 X1
- BX7 X1
- SA7 SYNMEM SAVE ADDRESS.
- DXRD SA1 SYNMEM
- GET DXREF,X1,10 MOVE RECORD TO THE WORKING
- * STORAGE AREA PASSED TO DXREFR. JUMPS TO
- * ROUTINE SPECIFIED IN THE FILE MACRO WHEN
- * END-OF-SECTION/END-OF-FILE OCCURS.
- EQ DXREFR RETURN TO CALLER.
- ************************************************************************
- * * SXREFR * *
- * *
- * ENTRY CONDITION: *
- * ADDRESS OF THE WORKING STORAGE AREA WHERE THE RECORD IS TO BE *
- * STORED IS PASSED IN THE PARAMETER LIST. *
- * EXIT CONDITION: *
- * RECORED IS STORED IN THE WORKING STORAGE AREA PASSED TO SXREFR. *
- * SYNEOF IS SET TO 1 WHEN END-OF-FILE OCCURS. *
- * EXTERNAL REFERENCE: *
- * 6RM MACROS GET AND FETCH. *
- * DESCRIPTION: *
- * GETS A RECORD FROM THE SXREF FILE AND STORES IT IN THE WORKING *
- * STORAGE AREA PASSED TO SXREFR. A CHECK IS MADE TO DETERMINE IF AN *
- * END-OF-SECTION OR END-OF-FILE HAS OCCURED. IF END-OF-SECTION, READ*
- * NEXT RECORD, IF END-OF-FILE, SET SYNEOF TO 1. *
- ************************************************************************
- SXREFR DATA 0
- SA1 X1
- BX7 X1
- SA7 SYNMEM SAVE ADDRESS.
- SXRD SA1 SYNMEM
- GET SXREF,X1,10 MOVE RECORD TO THE WORKING
- * STORAGE AREA PASSED TO SXREFR. JUMPS TO
- * ROUTINE SPECIFIED IN THE FILE MACRO WHEN
- * END-OF-SECTION/END-OF-FILE OCCURS.
- EQ SXREFR RETURN TO CALLER.
- ************************************************************************
- * * SYNCOM * *
- * *
- * ENTRY CONDITIONS: *
- * LFLAG INDICATES IF THE OUTPUT LISTINGS ARE ON OR OFF. THE ADDRESS *
- * OF THE WORKING STORAGE AREA IS PASSED IN THE PARAMETER LIST. *
- * EXIT CONDITIONS: *
- * RECORD CONTAINED IN THE WORKING STORAGE AREA PASSED TO SYNCON IS *
- * WRITTEN TO THE PRESET FILE AND IF LFLAG = 1 IT IS WRITTEN TO THE *
- * OUTPUT FILE. *
- * EXTERNAL REFERENCE: *
- * 6RM MACRO PUT. *
- * DESCRIPTION: *
- * GETS A RECORD FROM THE WORKING STORAGE AREA PASSED TO SYNCON AND *
- * STORES IT IN THE PRESET FILE, AND IF LFLAG = 1 STORES IT IN THE *
- * OUTPUT FILE. *
- ************************************************************************
- SYNCOM DATA 0
- SA2 OUTLEN FETCH RECORD LENGTH TO WRITE
- SYNCON1 PUT COMPILE,X1,X2 WRITE RECORD FROM WORKING STORAGE
- * AREA PASSED IN THE PARAMETER LIST TO THE
- * COMPILE FILE
- EQ SYNCOM RETURN TO CALLER.
- ************************************************************************
- * * SYNABT * *
- * *
- * ENTRY CONDITION: *
- * MESSAGE INDICATOR IS PASSED IN THE PARAMETER LIST: *
- * 0 = INSUFFICIENT FIELD LENGTH *
- * 1 = CONTROL CARD ERROR. *
- * 2 = UNEXPECTED END OF FILE ON INPUT *
- * 3 = ERROR LIMIT(100) EXCEEDED *
- * 4 = INTERNAL ERROR (WALKCHAIN) *
- * 5 = SOURCE ERRORS -- ABORT REQUESTED *
- * EXIT CONDITION: *
- * ABORTIVE MESSAGE WRITTEN TO THE DAYFILE AND ALL FILES THAT WERE *
- * OPENED ARE CLOSED. *
- * EXTERNAL REFERENCE: SCOPE MARCO MESSAGE. *
- * DESCRIPTION: *
- * CHECKS PARAMETER PASSED TO DETERMINE WHICH DIAGNOSTIC IS TO BE *
- * WRITTEN TO THE DAYFILE. WRITES THE MESSAGE AND JUMPS TO SYNCLSE TO*
- * CLOSE THE FILES THAT ARE OPEN. *
- ************************************************************************
- SYNABT DATA 0
- SA1 X1 GET PARAMETER LIST ADDRESS.
- ZR X1,SYNMSG2 CHECK MESSAGE INDICATOR.
- SX2 3
- IX2 X1-X2
- ZR X2,SYNMSG5 CHECK MESSAGE INDICATOR
- SX2 X1-4
- ZR X2,SYNMSG6 IF ABORT CODE IS 4 (WALKCHAIN INTERNAL ERR)
- SX2 X1-5
- ZR X2,SYNMSG7 IF ABORT CODE IS 5 (SOURCE ERRORS ABORT)
- LX1 58
- NG X1,SYNMSG4
- MESSAGE MSG1
- ABORT
- SYNMSG2 MESSAGE MSG2
- CLOSEM OUTPUT,N CLOSE THE SYSTEM OUTPUT FILE TO FLUSH THE
- BUFFER.
- ABORT
- SYNMSG4 MESSAGE MSG4
- EQ SYNMSG2+2
- SYNMSG5 MESSAGE MSG5
- EQ SYNMSG2+2
- SYNMSG6 MESSAGE MSG6
- EQ SYNMSG2+2
- SYNMSG7 MESSAGE MSG7
- ABORT
- ************************************************************************
- * * SYNCLSE * *
- * *
- * ENTRY CONDITION: *
- * LFLAG INDICATES IF THE OUTPUT LISTING IS ON OR OFF. REWIND IS SET *
- * TO INDICATE HOW THE PRESET FILE IS TO BE CLOSED: 0 = NO REWIND *
- * *
- * *
- * EXIT CONDITIONS: *
- * ALL OF SYNGENS FILES ARE CLOSED. THE PRESET FILE MAY OR MAY NOT BE*
- * REWOUND. *
- * EXTERNAL REFERENCE: *
- * 6RM MARCO: CLOSEM. *
- * DESCRIPTION: *
- * LFLAG IS CHECKED TO SEE IF THE LISTINGS ARE ON. IF IT IS ON, TERM-*
- * INATING HEADERS ARE WRITTEN TO THE PRESET AND OUTPUT FILES, IF ITS*
- * OFF THE HEADERS ARE WRITTEN TO THE PRESET FILE ONLY. IF LFLAG IS *
- * ON THE CROSS REFERENCE FILES ARE CLOSED WITH THE INPUT AND OUTPUT *
- * FILES. REWIND IS CHECKED TO INDICATE HOW THE PRESET FILE IS TO BE *
- * CLOSED: 0 = NO REWIND, 1 = REWIND. *
- ************************************************************************
- SYNCLSE DATA 0
- SA2 A1+1
- SA3 X1 1ST PARAMETER IS DISPLAY-CODED DIAGNOSTIC
- SA1 X2 COUNT AND 2ND PARAMETER IS DISPLAY-CODED
- MX0 30 OCTAL VALUE OF CORE SIZE REQUIRED FOR THE
- LX6 X3 CURRENT COMPILATION.
- BX7 -X0*X1
- SA2 MSG3+3
- LX7 6
- SX4 2
- SA5 LFLAG
- IX7 X4+X7
- SA6 MSG3+5
- BX7 X2+X7
- SA7 A2
- ZR X5,PUTLAST IF THE LISTING FLAG IS TURNED ON, THEN
- CLOSEM SXREF,U CLOSE-UNLOAD CROSS REFERENCE FILES.
- CLOSEM LXREF,U
- CLOSEM DXREF,U
- PUTLAST BSS 0
- CLOSEM INPUT,N CLOSE THE INPUT FILE, NO REWIND.
- CLOSEM OUTPUT,N CLOSE THE OUTPUT FILE. NO REWIND.
- SA3 TFLAG
- ZR X3,SYNCLS1
- CLOSEM TRACEM,U
- SYNCLS1 BSS 0
- MESSAGE MSG3,,RECALL
- SA2 REWIND GET THE ADDRESS OF THE REWIND INDICATOR.
- ZR X2,REWPRST IF THEREWIND INDICATOR IS OFF, CLOSE THE
- * PRESET FILE WITH NO REWIND, OTHERWISE CLOSE
- * THE PRESET FILE WITH A REWIND.
- CLOSEM COMPILE,R CLOSE WITH REWIND.
- EQ SYNCLSE RETURN TO CALLER.
- REWPRST CLOSEM COMPILE,N CLOSE, NO REWIND.
- EQ SYNCLSE RETURN TO CALLER.
- LXCK DATA 0
- SX1 LXREF GET FIT ADDRESS.
- RJ CKEOF CHECK FOR END-OF-FILE.
- SA1 SYNEOF GET THE END-OF-FILE FLAG.
- ZR X1,LXRD CHECK IF FLAG IS ON OR OFF.
- EQ LXREFR RETURN TO CALLER. END-OF-FILE.
- DXCK DATA 0
- SX1 DXREF GET FIT ADDRESS.
- RJ CKEOF CHECK FOR END-OF-FILE.
- SA1 SYNEOF GET THE END-OF-FILE FLAG.
- ZR X1,DXRD CHECK IF FLAG IS ON OR OFF.
- EQ DXREFR RETURN TO CALLER. END-OF-FILE.
- SXCK DATA 0
- SX1 SXREF GET FIT ADDRESS.
- RJ CKEOF CHECK FOR END-OF-FILE.
- SA1 SYNEOF GET THE END-OF-FILE FLAG.
- ZR X1,SXRD CHECK IF FLAG IS ON OR OFF.
- EQ SXREFR END-OF-FILE, RETURN TO CALLER.
- TRACECK DATA 0
- SX1 TRACEM GET FIT ADDRESS.
- RJ CKEOF CHECK FOR END-OF-FILE.
- SA1 SYNEOF GET THE END-OF-FILE FLAG.
- ZR X1,COPY2 CHECK IF FLAG IS ON.
- SX7 0
- SA7 SYNEOF RESET END-OF-FILE FLAG TO ZERO.
- EQ RA65 RETURN TO SYNCOPY
- CKEOF DATA 0
- FETCH X1,FP,X2 FETCH STATUS OF THE FILE POSITION FIELD.
- SB1 X2
- SB2 64 END-OF-INFORMATION STATUS.
- EQ B1,B2,SETEOF IF FP STATUS EQUALS END-OF-INFORMATION,
- SET END-OF-FILE FLAG.
- EQ CKEOF RETURN TO CALLER.
- SETEOF SX7 1
- SA7 SYNEOF SET END-OF-FILE FLAG ON.
- EQ CKEOF RETURN TO CALLER.
- INCK DATA 0 CHECK FOR END OF SYNGEN INPUT.
- SX1 INPUT GET FIT ADDRESS.
- RJ CKEOF
- SA1 SYNEOF CHECK IF END-OF-FILE FLAG IS ON.
- NZ X1,ENDIN EOF REACHED ON SYNGEN INPUT FILE.
- INLFN SB2 8 END-OF-SECTION STATUS (7/8/9).
- NE B1,B2,SYNRD2 NOT END OF SECTION SO READ ANOTHER CARD.
- SX7 1
- SA7 REALEOF
- SA7 SYNEOF SET EOF FLAG.
- ENDIN RJ ENDINP
- EQ SYNREAD
- ENTRY ENDINP
- ENDINP DATA 0
- SA1 LFLAG CHECK FOR LISTING REQUEST
- ZR X1,ENDINP RETURN IF NO LISTING REQUESTED
- REWINDM DXREF
- REWINDM SXREF
- REWINDM LXREF
- EQ ENDINP RETURN TO CALLER
- *THE BUFFERS FOR INPUT, OUTPUT, AND COMPILE ARE EXTRA-BIG IN CASE THEY *
- *SHOULD BE REDEFINED AS I,W FILES BY THE USER. *
- FILE LFN=INPUT,BFS=520,FWB=INBUF,WSA=SYNIWSA,DX=INCK,LT=UL,E
- ,RL=1,BT=C,RT=Z,FL=90
- FILE LFN=OUTPUT,BFS=520,FWB=OUTBUF,WSA=SYNOWSA,LT=UL,ERL=1,B
- ,T=C,RT=Z,FL=137
- FILE LFN=COMPILE,BFS=520,FWB=COMBUF,WSA=SYNCWSA,LT=UL,ERL=1,
- ,BT=C,RT=Z,FL=90
- FILE LFN=LXREF,BFS=260,FWB=LBUF,WSA=LXREFWS,LT=UL,RT=F,BT=C,
- ,FL=10,DX=LXCK
- FILE LFN=DXREF,BFS=260,FWB=DBUF,WSA=DXREFWS,LT=UL,RT=F,BT=C,
- ,FL=10,DX=DXCK
- FILE LFN=SXREF,BFS=260,FWB=SBUF,WSA=SXREFWS,LT=UL,RT=F,BT=C,
- ,FL=10,DX=SXCK
- FILE LFN=TRACEM,BFS=260,WSA=SYNTWSA,LT=UL,RT=F,BT=C,FL=60,DX
- ,=TRACECK,FWB=TBUF
- SQ STLD.RM USERT=(Z,F),USEBT=(C),USE=(OPENM,CLOSEM,GET,PUT,REWIND
- ,M,FETCH,STORE),OMIT=CMM
- SYNWS DATA 10H
- SYNIWSA BSS 9 INPUT WORKING STORAGE AREA.
- SYNOWSA DATA 40H
- DATA 40H
- SYNCWSA DATA 10H PRESET WORKING STORAGE AREA.
- DATA 50H
- LXREFWS BSSZ 1 LABEL CROSS-REFERENCE WORKING STORAGE AREA.
- DXREFWS BSSZ 1 DIAG CROSS-REFERENCE WORKING STORAGE AREA.
- SXREFWS BSSZ 1 SUBR CROSS-REFERENCE WORKING STORAGE AREA.
- SYNTWSA BSSZ 6 TRACE CROSS-REFERENCE WORKING STORAGE AREA.
- SYNIN BSSZ 10 INPUT FET.
- SYNOUT BSSZ 10 OUTPUT FET.
- SYNPRE BSSZ 10 PRESET FET.
- SYNL BSSZ 10 LABEL CROSS-REF FET.
- SYND BSSZ 10 IDAGNOSTIC CROSS-REF FET.
- SYNS BSSZ 10 SUBROUTINE CROSS-REF FET.
- SYNT BSSZ 10 TRACEM FET.
- SYNIRL BSSZ 1 CONTAINS INPUT RECORD LENGTH.
- LFLAG BSS 1 0=NO LISTING 1=LISTING (SYSTEM OUTPUT).
- SKIPFLG BSSZ 1 FLAG FOR CONDITIONAL SKIPPING
- DIRFLAG BSSZ 1 CONDITIONAL SKIP DIRECTIVE ON INPUT
- TFLAG BSS 1
- REWIND BSS 1 0=NO REWIND 1=REWIND (PRESET OUTPUT).
- SYNORL BSSZ 1 CONTAINS OUTPUT RECORD LENGTH.
- SYNEOF BSSZ 1 FLAG TO INDICATE END-OF-FILE.
- SYNMEM BSSZ 1 CONTAINS FIELD LENGTH, RESULT FROM THE
- OUTLEN BSSZ 1 LENGTH OF COMPILE RECORDS
- REALEOF BSSZ 1 TRUE IF REALLY AT EOF ON *INPUT*
- INBUF BSSZ 520 INPUT BUFFER.
- OUTBUF BSSZ 520 OUTPUT BUFFER.
- COMBUF BSSZ 520 PRESET OUTPUT BUFFER.
- LBUF BSSZ 260 LABEL CROSS-REF BUFFER.
- DBUF BSSZ 260 DIAGNOSTIC CROSS-REF BUFFER.
- SBUF BSSZ 260 SUBROUTINE CROSS-REF BUFFER.
- TBUF BSS 1 TRACEM BUFFER - BUFFER ACTUALLY ALLOCATED
- * - EXECUTION TIME.
- MSG3 DIS ,* SYNGEN COMPLETE. SCM USED = *
- DIS ,* DIAGNOSTICS*
- MSG1 DATA 28LCONTROL CARD ERROR *****
- MSG2 DATA C* INSUFFICIENT FIELD LENGTH*
- MSG4 DATA 28LUNEXPECTED EOF ON INPUT ****
- MSG5 DATA 32LERROR LIMIT(100) EXCEEDED *****
- MSG6 DATA C* INTERNAL ERROR (WALKCHAIN)*
- MSG7 DATA C* SOURCE ERRORS -- ABORT REQUESTED*
- CKLFNI DATA 5LINPUT
- INFILE EQU SYNIWSA CONTAINS THE INPUT LFN.
- OUTFILE EQU SYNIWSA+1 CONTAINS THE OUTPUT LFN.
- LSTFILE EQU SYNIWSA+2 CONTAINS THE FILENAME FOR LISTINGS
- END
cdc/nos2.source/nam5871/syngen.txt ยท Last modified: 2023/08/05 17:23 by Site Administrator