// BTRN0.bcpl - BCPL Compiler -- Trans, Main Program.
// Copyright Xerox Corporation 1980
// Last modified on Wed 01 Nov 72 0021.59 by jec.
// Swinehart, 5-10-77: docase exp
// TranslateTree The main program to translate AE-Tree to OCODE.
// TRNreport Report errors in Trans.
get "btrnx"
static
[ Casetable = nil // Table of case entries.
CaseB = 0 // Base of case table for the current switch.
CaseP = 0 // Next free location in the case table.
FrameLevel = 0 // The level (0 - n) of the frame currently being compiled
RoutineBody = false // Is ""return"" legal?
ValofBlock = false // Is ""resultis"" legal?
SwitchBlock = false // Are ""case"" and ""default"" legal?
RepeatBlock = false // Are ""loop"" and ""break"" legal?
Breaklabel = nil // Label to hop to on ""break"".
Resultlabel = nil // ditto ""resultis"".
Defaultlabel = nil // ditto ""resultis"".
Endcaselabel = 0 // ditto ""endcase"" -- and set non-zero if ""endcase"" is OK.
Looplabel = nil // ditto ""loop"".
Docaselabel=nil // ditto ""docase"".
SSP = nil // The simulated stack pointer
VecSSP = nil // The stack pointer for vector space
MaxSSP = nil // The max value of SSP for a stack frame
MaxVecSSP = nil // ditto for VecSSP (vector space)
]
let TranslateTree() be
[ if SWDebug do WriteS("TRN*n")
let v = vec CaseT; Casetable = v
Curline = 0 // No line pointer as yet
SSP = 1; Out2(STACK, SSP)
VecSSP = 0
MaxSSP, MaxVecSSP = SSP, VecSSP
Trans(rv Tree) // DOTHEWORK
unless MaxSSP eq 1 & MaxVecSSP eq 0 do
TRNreport(1) // A local name at the top level is illegal
Out1(END)
]
and TRNreport(n) be
[ Ostream = ErrorStream
WW($*n)
WriteLine(Curline)
let m = selecton n into
[ default: 0
case 1: "DYNAMIC NAME DEFINED AT TOP LEVEL"
case 2: "TOO MANY DYNAMIC VARIABLES IN PROCEDURE"
case 3: "LEFT AND RIGHT SIDES OF = DO NOT MATCH"
case 4: "*"BREAK*" OR *"LOOP*" OUT OF CONTEXT"
case 5: "*"RETURN*" OR *"RESULTIS*" OUT OF CONTEXT"
case 6: "*"ENDCASE*" OR *"DOCASE*" OUT OF CONTEXT"
case 7: "*"CASE*" OR *"DEFAULT*" NOT IN A CASE BLOCK"
case 8: "TOO MANY CASES IN SWITCH"
case 9: "NO CASES IN SWITCH BLOCK"
case 10: "*"DEFAULT*" APPEARS TWICE IN SAME SWITCH BLOCK"
case 11: "THIS CASE APPEARS TWICE IN SAME SWITCH BLOCK"
case 12: "ILLEGAL CASE-TO RANGE"
case 13: "EXPRESSION MUST BE CONSTANT"
case 14: "ILLEGAL MEMORY REFERENCE EXPRESSION"
case 15: "MISSING EXPRESSION"
case 16: "FIELD IS LONGER THAN ONE WORD"
case 17: "ARG OF << MAY NOT BE A STRUCTURE REFERENCE ON LEFT SIDE OF = "
]
BCPLreport(n, m)
if SWHelp do Help("TRN REPORT")
if n le 0 goto Abort
Ostream = OutputStream
]
and CheckSSP() be //update max SSP value if necessary
[ if SSP gr MaxSSP do
[ MaxSSP = SSP
if MaxSSP gr 127 do TRNreport(2) //local space is too big
]
]
and CheckVecSSP() be //update max vector space vaaue if necessary
[ if VecSSP gr MaxVecSSP do
[ MaxVecSSP = VecSSP ]
]
and Complab(L) be
Out2P(LAB, L)
and Compentry(L, D) be
[ Out2P(ENTRY, L); OutL(D) ]
and Complentry(L, D) be
[ Out2P(LENTRY, L); OutL(D) ]
and Compjump(L) be
Out2P(JUMP, L)
and Out1(x) be
W(x)
and Out2(x,y) be
[ W(x)
Write4(y)
]
and Out2P(x,y) be
[ W(x)
Write2(y)
]
and Out3P(x,y,z) be
[ W(x)
Write4(y)
Write2(z)
]
and OutN(x) be
Write4(x)
and OutL(x) be
Write2(x)
and OutC(x) be
W(x)
// The following local routines do the actual storing.
and W(x) be
[ Writech(OcodeStream, x)
if SWOcode do [ WriteS("*n*t*******s"); WriteN(x) ]
]
and Write4(x) be
[ Writeword(OcodeStream, x)
if SWOcode do [ WW($*s); WriteO(x) ]
]
and Write2(x) be
[ Writeaddr(OcodeStream, x)
if SWOcode do [ WW($*s); WriteO(x) ]
]