@
.PROCEDURE BACKPLUG;
.INTEGER INSTADD;
.BEGIN
INSTADD := @;
.WHEN LA > '777
.THEN .GOTO IGNORE;
@ :=
INSTADD;
AGAIN:
INDEX := @ +
LSTART;
INSTADD :=
CODE[#];
CODE[#] := @
.AND '177000 +
LA;
@ :=
INSTADD .AND '777;
.WHEN @
.NE '777
.THEN .GOTO AGAIN;
IGNORE:
.END;
@
.CONDITIONAL .PROCEDURE BASIC;
.INTEGER COMPARE;
.BEGIN
COMPARE := @;
.WHEN BS =
COMPARE .THEN .EXITTRUE;
.END;
.CONDITIONAL .PROCEDURE BSCOMMA;
.BEGIN
.WHEN BASIC(
COMMASYMBOL)
.THEN .EXITTRUE;
.END;
@
.CONDITIONAL .PROCEDURE BSIS;
.BEGIN INDEX := @;
.WHEN LETTER .THEN .EXITFALSE;
MORE:
.WHEN .CLEFT OPTABLE[#] =
BS .THEN
.BEGIN %
STX,
ADDBS;
.EXITTRUE;
.END;
.WHEN @
.NZ .THEN
.BEGIN INDEX :=
.INC .ICLEFT OPTABLE[#] +
INDEX;
.GOTO MORE;
.END;
.END;
.PROCEDURE CELL;
.SWITCH STYPE =
LNOTDEC,
LCONST,
LCONST,
LARRAY,
LCOMPCONST,
LARRAY,
LLABEL,
LTABLE;
.BEGIN
ENTER;
.WHEN ID .LZ .THEN .GOTO OK;
.IF LETTER .THEN
.BEGIN IDENTIFIER;
OK:
INDEX :=
TYPE - 8;
.WHEN @
.LZ .THEN .GOTO STYPE[#];
FAIL(
CELLTYPE);
.GOTO FIN;
LNOTDEC:
FAIL(
IDNOTDEC);
.GOTO FIN;
LCONST:
VADD :=
ADD;
.GOTO FIN;
LARRAY: @ :=
ADD;
.GOTO ARRTAB;
LTABLE: @ :=
.INC ADD;
ARRTAB:
STACK(
.SSM @);
SUBSCRIPT;
VADD :=
UNSTACK;
.GOTO FIN;
LCOMPCONST:
VALUE :=
ADD;
EXPLICITCONST := -1;
.GOTO FIN;
LLABEL:
FAIL(
RHSLABEL);
FIN:
ID :=
.Z;
.END
.ELSE .IF BASIC(
STARSYMBOL)
.THEN
.BEGIN NBS;
IDENTIFIER;
.WHEN TYPE .NE INT .THEN FAIL (
PTRNOTINT);
VADD :=
ADD + '100000;
.END
.ELSE .IF BASIC(
CODEWORDSYMBOL)
.THEN
.BEGIN
NBS;
TYPEIDENT;
VADD :=
ADD;
.END
.ELSE .BEGIN CONSTANT;
EXPLICITCONST := -1;
.END;
LEAVE;
.END;
.PROCEDURE CLEARPOOL;
.INTEGER I;
.BEGIN .WHEN CPPT .Z .THEN .GOTO EXIT;
.FOR I :=
CPPT .DO
.BEGIN K :=
CPOOL[
I]; %
IRS,
I;
BACKPLUG(
CPOOL[
I]);
GENERATE(
K);
.END;
CPPT :=
.Z;
EXIT:
.END;
.PROCEDURE CODESTATEMENT;
.BEGIN NBS;
.IF LETTER .THEN
.BEGIN IDNBS;
.WHEN IDENT2 .Z .THEN
.FOR # :=
MCODESIZE .DO
.IF MCODE[#] =
IDENT1 .THEN .GOTO FOUND
.ELSE %
IRS,0;
FAIL(
INVMCODE);
FOUND: %
IRS,0;
INST :=
MCODE[#];
J := @
.SHDRL 14;
.IF .Z .SHDLL 4
.Z .THEN
.IF J .NE 1
.THEN GENERATE(
INST)
.ELSE .BEGIN FAILIFNOT(
COMMASYMBOL);
CONSTANT;
GENERATE(
.NEG VALUE .AND '77 +
INST);
.END
.ELSE .IF @ - '14
.Z .THEN
.BEGIN FAILIFNOT(
COMMASYMBOL);
CONSTANT;
GENERATE(
INST +
VALUE);
.END
.ELSE .BEGIN
.IF BASIC(
STARSYMBOL)
.THEN
.BEGIN NBS;
I := '100000;
.END .ELSE I :=
.Z;
.WHEN BASIC(
COLONSYMBOL)
.THEN
.BEGIN I :=
I + '40000;
NBS;
.END;
.WHEN I .Z .THEN FAILIFNOT(
COMMASYMBOL);
INST :=
INST +
I;
.IF BASIC(
STARSYMBOL)
.THEN
.BEGIN NBS;
.WHEN BASIC(
PLUSSYMBOL)
.THEN NBS;
NUMBER;
GENERATE(
INST +
LA + '1000 +
VALUE);
.END .ELSE
.IF NUMERICAL .THEN
.BEGIN NUMBER;
GENERATE(
INST+
VALUE);
.END .ELSE
.BEGIN TYPEIDENT;
GENERATE(
INST +
ADD);
.END;
.END
.END
.ELSE .IF NUMERICAL .THEN
.BEGIN
NUMBER;
GENERATE(
VALUE);
.END
.ELSE FAIL(
INVMCODE);
.END;
.PROCEDURE CLEARWORKSPACE;
.BEGIN
.WHEN MAXWORK .LZ .THEN
.FOR WORKING := @
.DO
.BEGIN BACKPLUG(
WORKSPACE[
WORKING]);
GENERATE(
.Z);
.END;
MAXWORK :=
.Z;
.END;
.ORIGIN 0;
.SET BASICS[
NOFBASICS]
(
INTSYMBOL,
DBLSYMBOL,
TABLESYMBOL,
TRIANGLE,
ARRAYSYMBOL,
CONSTSYMBOL,
CCONSTSYMBOL,
LABELSYMBOL,
ACSYMBOL,
CONDSYMBOL,
PROCSYMBOL,
FORWARDSYMBOL,
LISTSYMBOL,
SWITCHSYMBOL,
NEXTSECTORSYMBOL,
ORIGINSYMBOL,
STRINGSYMBOL,
GLOBALSYMBOL,
SETSYMBOL);
.ORIGIN 0;
.PROCEDURE COMPSTATEMENT;
.BEGIN
ENTER;
FAILIFNOT(
BEGINSYMBOL);
AGAIN :
STATEMENT;
.IF BASIC(
SEMICOLONSYMBOL)
.THEN
.BEGIN
NBS;
.GOTO AGAIN
.END
.ELSE .IF BS .NE ENDSYMBOL .THEN
.BEGIN
FAIL(
ENDMISSING);
NBS;
.GOTO AGAIN;
.END
.ELSE
NBS;
LEAVE;
.END;
.PROCEDURE CONDITION;
.BEGIN
ENTER;
CONSIMPLE;
ANOTHER:
.WHEN BASIC(
ANDSYMBOL)
.THEN
.BEGIN
.WHEN INVERT .NZ .THEN .GOTO ORDEMORGAN;
ANDDEMORGAN:
STACK(
FJADD);
NBS;
CONSIMPLE;
PLUGJUMP(
FJADD);
.GOTO ANOTHER;
.END;
.WHEN BASIC(
ORSYMBOL)
.THEN
.BEGIN
.WHEN INVERT .NZ .THEN .GOTO ANDDEMORGAN;
ORDEMORGAN:
STACK(
LA);
%
IRS,
LA;
INDEX :=
FJADD +
LSTART;
CODE[#] :=
JMPSO +
LA;
NBS;
CONSIMPLE;
PLUGJUMP(
LA);
.GOTO ANOTHER;
.END;
LEAVE;
.END;
.PROCEDURE CONSIMPLE;
.SWITCH REL =
LE,
LT,
GE,
GT,
NE,
EQ,
GT,
GE,
LT,
LE,
EQ,
NE;
.INTEGER RELOPCASE;
.BEGIN
ENTER;
.IF BSIS(
COND)
.THEN
.BEGIN NBS;
INDEX :=
.INC ADDBS;
GENERATE(
OPTABLE[#]
.NEV INVERT);
SETFJADD;
.END
.ELSE .IF LETTER .THEN
.BEGIN IDENTIFIER;
.IF TYPE .AND '177776 = '12
.THEN
.BEGIN
PROCCALL;
.WHEN INVERT .NZ .THEN GENERATE(
SKP);
SETFJADD;
.END .ELSE
.BEGIN ID := -1;
.GOTO EXPR;
.END;
.END .ELSE
.BEGIN
EXPR:
STACK(
INVERT);
EXPRESSION;
INVERT :=
UNSTACK;
.IF BSIS(
ACCOND)
.THEN
.BEGIN NBS;
INDEX :=
.INC ADDBS;
GENERATE(
OPTABLE[#]
.NEV INVERT);
SETFJADD;
.END .ELSE
.IF BSIS(
RELOP)
.THEN
.BEGIN INDEX :=
.INC ADDBS;
RELOPCASE :=
OPTABLE[#];
NBS;
CELL;
GENVADDINST(
CAS);
.WHEN INVERT .NZ .THEN RELOPCASE :=
RELOPCASE - 6;
.GOTO REL[
RELOPCASE];
GT:
GENERATE(
JMPSO +
LA + 3);
GENERATE(
NOP);
SETFJADD;
.GOTO EXIT;
GE:
GENERATE(
NOP);
GENERATE(
SKP);
SETFJADD;
.GOTO EXIT;
LT:
GENERATE(
NOP);
SETFJADD;
.GOTO EXIT;
LE:
SETFJADD;
GENERATE(
NOP);
.GOTO EXIT;
EQ:
GENERATE(
SKP);
GENERATE(
SKP);
SETFJADD;
.GOTO EXIT;
NE:
GENERATE(
SKP);
SETFJADD;
EXIT:
.END
.ELSE FAIL(
FCONDITION);
.END;
LEAVE;
.END;
.PROCEDURE CONSTEXPRESSION;
.INTEGER SUM,
SIGN;
.BEGIN
ENTER;
SUM :=
.Z;
MORE:
SIGN := @;
.IF BASIC(
GLOBALSYMBOL)
.THEN
.BEGIN
@ :=
GA;
GLORIG:
VALUE := @;
NBS;
.END .ELSE
.IF BASIC(
ORIGINSYMBOL)
.THEN
.BEGIN
@ :=
LOCAL;
.GOTO GLORIG;
.END
.ELSE CONSTANT;
@ :=
SIGN .SHSRL 1
.NEV VALUE;
%
SRC; %
TCA;
SUM := @ +
SUM;
.WHEN BASIC(
PLUSSYMBOL)
.THEN
.BEGIN
NBS;
@ :=
.Z;
.GOTO MORE;
.END;
.WHEN BASIC(
MINUSSYMBOL)
.THEN
.BEGIN
NBS;
@ := 1;
.GOTO MORE;
.END;
VALUE :=
SUM;
LEAVE;
.END;