// TRN0
GET "TRNHDR"
LET NEXTPARAM() = VALOF
$( PARAMNUMBER := PARAMNUMBER + 1
RESULTIS PARAMNUMBER $)
AND TRANSREPORT(N, X) BE
$( SELECTOUTPUT(SYSPRINT)
REPORTCOUNT := REPORTCOUNT + 1
IF REPORTCOUNT GE REPORTMAX DO
$( WRITES("*NCOMPILATION ABORTED*N")
STOP(8) $)
WRITES("*NREPORT: "); TRNMESSAGE(N)
WRITEF("*NCOMMANDS COMPILED %N*N", COMCOUNT)
PLIST(X, 0, 4); NEWLINE()
SELECTOUTPUT(OCODE) $)
AND TRNMESSAGE(N) BE
$( LET S = VALOF
SWITCHON N INTO
$( DEFAULT: WRITEF("COMPILER ERROR %N", N); RETURN
CASE 141: RESULTIS "TOO MANY CASES"
CASE 104: RESULTIS "ILLEGAL USE OF BREAK, LOOP OR RESULTIS"
CASE 101:
CASE 105: RESULTIS "ILLEGAL USE OF CASE OR DEFAULT"
CASE 106: RESULTIS "TWO CASES WITH SAME CONSTANT"
CASE 144: RESULTIS "TOO MANY GLOBALS"
CASE 142: RESULTIS "NAME DECLARED TWICE"
CASE 143: RESULTIS "TOO MANY NAMES DECLARED"
CASE 115: RESULTIS "NAME NOT DECLARED"
CASE 116: RESULTIS "DYNAMIC FREE VARIABLE USED"
CASE 117:CASE 118:CASE 119:
RESULTIS "ERROR IN CONSTANT EXPRESSION"
CASE 110:CASE 112:
RESULTIS "LHS AND RHS DO NOT MATCH"
CASE 109:CASE 113:
RESULTIS "LTYPE EXPRESSION EXPECTED"
$)
WRITES(S) $)
LET COMPILEAE(X) BE
$(1 LET A = VEC 5000
LET D = VEC 100
LET K = VEC 150
LET L = VEC 150
DVEC, DVECS, DVECE, DVECP, DVECT := A, 3, 3, 3, 5000
DVEC!0, DVEC!1, DVEC!2 := 0, 0, 0
GLOBDECL, GLOBDECLS, GLOBDECLT := D, 0, 100
CASEK, CASEL, CASEP, CASET, CASEB := K, L, 0, 150, -1
ENDCASELABEL, DEFAULTLABEL := 0, 0
RESULTLABEL, BREAKLABEL, LOOPLABEL := -1, -1, -1
COMCOUNT, CURRENTBRANCH := 0, X
OCOUNT := 0
PARAMNUMBER := 0
WHILE X~=0 LOGAND
(H1!X=S.SECTION LOGOR H1!X=S.NEEDS) DO
$( LET X1 = H2!X + 1
LET L = GETBYTE(X1, 0)
OUT1(H1!X)
OUTN1(L)
FOR I = 1 TO L DO OUTN1(GETBYTE(X1, I))
X := H3!X
$)
SSP := SAVESPACESIZE
OUT2(S.STACK, SSP)
DECLLABELS(X)
TRANS(X)
OUT2(S.GLOBAL, GLOBDECLS/2)
$( LET I = 0
UNTIL I=GLOBDECLS DO
$( OUTN(GLOBDECL!I)
OUTL(GLOBDECL!(I+1))
I := I + 2 $)
ENDOCODE() $)1
.