1*12065Sbaden (setq SCCS-codeGen.l "@(#)codeGen.l 1.1 04/27/83") 2*12065Sbaden ; FP interpreter/compiler 3*12065Sbaden ; Copyright (c) 1982 Scott B. Baden 4*12065Sbaden ; Berkeley, California 5*12065Sbaden 6*12065Sbaden ; Main Routine to do code generation 7*12065Sbaden 8*12065Sbaden (include specials.l) 9*12065Sbaden (declare 10*12065Sbaden (localf build_constr mName condit$fp alpha$fp insert$fp ti$fp while$fp) 11*12065Sbaden ) 12*12065Sbaden 13*12065Sbaden (defmacro getFform (xx) 14*12065Sbaden `(implode (nreverse `(p f ,@(cdr (nreverse (explodec (cxr 0 ,xx)))))))) 15*12065Sbaden 16*12065Sbaden (defun mName (name) 17*12065Sbaden (cond ((atom name) `',name) 18*12065Sbaden (t `',(getFform name)))) 19*12065Sbaden 20*12065Sbaden (defun mNameI (name) 21*12065Sbaden (cond ((atom name) name) 22*12065Sbaden (t (getFform name)))) 23*12065Sbaden 24*12065Sbaden (defun codeGen (ptree) 25*12065Sbaden (cond ((atom ptree) `',ptree) ; primitive or 26*12065Sbaden ; user defined 27*12065Sbaden 28*12065Sbaden ((eq (cxr 0 ptree) 'alpha$$) ; apply to all 29*12065Sbaden (alpha$fp (cxr 1 ptree))) 30*12065Sbaden 31*12065Sbaden ((eq (cxr 0 ptree) 'insert$$) ; insert 32*12065Sbaden (insert$fp (cxr 1 ptree))) 33*12065Sbaden 34*12065Sbaden ((eq (cxr 0 ptree) 'ti$$) ; tree insert 35*12065Sbaden (ti$fp (cxr 1 ptree))) 36*12065Sbaden 37*12065Sbaden ((eq (cxr 0 ptree) 'select$$) ; selector 38*12065Sbaden (let ((sel (cxr 1 ptree))) 39*12065Sbaden 40*12065Sbaden (If (zerop sel) ; No stats for errors 41*12065Sbaden then `#'(lambda (x) (bottom)) 42*12065Sbaden 43*12065Sbaden else 44*12065Sbaden 45*12065Sbaden `#'(lambda (x) 46*12065Sbaden (cond ((not (listp x)) (bottom))) 47*12065Sbaden (cond (DynTraceFlg (measSel ,sel x))) 48*12065Sbaden ,(cond ((plusp sel) 49*12065Sbaden `(If (greaterp ,sel (length x)) 50*12065Sbaden then (bottom) 51*12065Sbaden else (nthelem ,sel x))) 52*12065Sbaden 53*12065Sbaden 54*12065Sbaden ((minusp sel) 55*12065Sbaden `(let ((len (length x))) 56*12065Sbaden (If (greaterp ,(absval sel) len) 57*12065Sbaden then (bottom) 58*12065Sbaden else (nthelem (plus len ,(1+ sel)) x))))))))) 59*12065Sbaden 60*12065Sbaden 61*12065Sbaden 62*12065Sbaden ((eq (cxr 0 ptree) 'constant$$) ; constant 63*12065Sbaden (let ((const (cxr 1 ptree))) 64*12065Sbaden (If (eq const '?) 65*12065Sbaden then `#'(lambda (x) (bottom)) 66*12065Sbaden 67*12065Sbaden else 68*12065Sbaden 69*12065Sbaden `#'(lambda (x) 70*12065Sbaden (cond (DynTraceFlg (measCons ,const x))) 71*12065Sbaden ,const)))) 72*12065Sbaden 73*12065Sbaden 74*12065Sbaden 75*12065Sbaden ((eq (cxr 0 ptree) 'condit$$) ; conditional 76*12065Sbaden (condit$fp (cxr 1 ptree) (cxr 2 ptree) (cxr 3 ptree))) 77*12065Sbaden 78*12065Sbaden ((eq (cxr 0 ptree) 'while$$) ; while 79*12065Sbaden (while$fp (cxr 1 ptree) (cxr 2 ptree))) 80*12065Sbaden 81*12065Sbaden 82*12065Sbaden ((eq (cxr 0 ptree) 'compos$$) ; composition 83*12065Sbaden (let ((cm1 (cxr 1 ptree)) 84*12065Sbaden (cm2 (cxr 2 ptree))) 85*12065Sbaden `#'(lambda (x) 86*12065Sbaden (cond (DynTraceFlg 87*12065Sbaden (measComp ,(mName cm1) ,(mName cm2) x))) 88*12065Sbaden (funcall ,(codeGen cm1) 89*12065Sbaden (funcall ,(codeGen cm2) 90*12065Sbaden x))))) 91*12065Sbaden 92*12065Sbaden 93*12065Sbaden ((eq (cxr 0 ptree) 'constr$$) 94*12065Sbaden (build_constr ptree)) ; construction 95*12065Sbaden 96*12065Sbaden (t 'error))) ; error, sb '? 97*12065Sbaden 98*12065Sbaden 99*12065Sbaden ; build up the list of arguments for a construction 100*12065Sbaden 101*12065Sbaden (defun build_constr (pt) 102*12065Sbaden (cond ((and (eq 2 (hunksize pt)) (null (cxr 1 pt))) 103*12065Sbaden `#'(lambda (x) (cond (DynTraceFlg (measCons nil x))) nil)) 104*12065Sbaden (t 105*12065Sbaden (do ((i 2 (1+ i)) 106*12065Sbaden (stat (list `,(mNameI (cxr 1 pt)))) 107*12065Sbaden (con (list (codeGen (cxr 1 pt))))) 108*12065Sbaden ((greaterp i (1- (hunksize pt))) 109*12065Sbaden (return 110*12065Sbaden (funcall 'constr$fp con stat))) 111*12065Sbaden (setq stat (append stat (list `,(mNameI (cxr i pt))))) 112*12065Sbaden (setq con (append con (list (codeGen (cxr i pt))))))))) 113*12065Sbaden 114*12065Sbaden 115*12065Sbaden ; generate a lisp function definition from an FP parse tree 116*12065Sbaden 117*12065Sbaden (defun put_fn (fn_name p_tree) 118*12065Sbaden (untraceDel (extName fn_name)) 119*12065Sbaden (putd fn_name 120*12065Sbaden `(lambda (x) 121*12065Sbaden (cond (DynTraceFlg (IncrUDF ',fn_name x))) 122*12065Sbaden (funcall ,(codeGen p_tree) x)))) 123*12065Sbaden 124*12065Sbaden 125*12065Sbaden ; The Functional forms 126*12065Sbaden ; 127*12065Sbaden 128*12065Sbaden 129*12065Sbaden ; fp conditional 130*12065Sbaden 131*12065Sbaden (def condit$fp 132*12065Sbaden (lambda (Pptree Tptree Fptree) 133*12065Sbaden (let ((test (codeGen Pptree)) 134*12065Sbaden (true (codeGen Tptree)) 135*12065Sbaden (false (codeGen Fptree))) 136*12065Sbaden 137*12065Sbaden (let ((q 138*12065Sbaden `(lambda (x) 139*12065Sbaden (cond (DynTraceFlg 140*12065Sbaden (measCond 141*12065Sbaden ,(mName Pptree) 142*12065Sbaden ,(mName Tptree) 143*12065Sbaden ,(mName Fptree) x))) 144*12065Sbaden 145*12065Sbaden (let ((z (funcall ,test x))) 146*12065Sbaden (cond 147*12065Sbaden ((eq 'T z) (funcall ,true x)) 148*12065Sbaden ((eq 'F z) (funcall ,false x)) 149*12065Sbaden (t (bottom))))))) 150*12065Sbaden `(function ,q))))) 151*12065Sbaden 152*12065Sbaden 153*12065Sbaden 154*12065Sbaden ; construction 155*12065Sbaden 156*12065Sbaden (def constr$fp 157*12065Sbaden (lexpr (v) 158*12065Sbaden (let* ((vl (listify v)) 159*12065Sbaden (q 160*12065Sbaden `(lambda (x) 161*12065Sbaden (cond (DynTraceFlg 162*12065Sbaden (measConstr ',(cadr vl) x))) 163*12065Sbaden (let* ((savelevel level) 164*12065Sbaden (h 165*12065Sbaden (list 166*12065Sbaden ,@(mapcar 167*12065Sbaden #'(lambda 168*12065Sbaden (y) 169*12065Sbaden `(let ((r ,`(funcall ,y x))) 170*12065Sbaden (setq level savelevel) 171*12065Sbaden r)) 172*12065Sbaden (car vl))))) 173*12065Sbaden (setq level savelevel) 174*12065Sbaden h 175*12065Sbaden )))) 176*12065Sbaden `(function ,q)))) 177*12065Sbaden 178*12065Sbaden 179*12065Sbaden 180*12065Sbaden 181*12065Sbaden ; apply to all 182*12065Sbaden 183*12065Sbaden (def alpha$fp 184*12065Sbaden (lambda (ptree) 185*12065Sbaden (let* ((fn (codeGen ptree)) 186*12065Sbaden (q 187*12065Sbaden `(lambda (x) 188*12065Sbaden (cond (DynTraceFlg 189*12065Sbaden (measAlph ,(mName ptree) x))) 190*12065Sbaden (cond ((null x) nil) 191*12065Sbaden ((not (listp x)) (bottom)) 192*12065Sbaden (t 193*12065Sbaden (let* ((savelevel level) 194*12065Sbaden (h 195*12065Sbaden (mapcar 196*12065Sbaden '(lambda (y) 197*12065Sbaden (setq level savelevel) 198*12065Sbaden (funcall ,fn y)) 199*12065Sbaden x))) 200*12065Sbaden 201*12065Sbaden (setq level savelevel) 202*12065Sbaden h)))))) 203*12065Sbaden `(function ,q)))) 204*12065Sbaden 205*12065Sbaden 206*12065Sbaden ; insert 207*12065Sbaden 208*12065Sbaden (def insert$fp 209*12065Sbaden (lambda (ptree) 210*12065Sbaden (let* ((fn (codeGen ptree)) 211*12065Sbaden (q 212*12065Sbaden `(lambda (x) 213*12065Sbaden (cond (DynTraceFlg (measIns ,(mName ptree) x))) 214*12065Sbaden (cond ((not (listp x)) (bottom)) 215*12065Sbaden ((null x) 216*12065Sbaden (let ((ufn (get 'u-fnc ,fn))) 217*12065Sbaden (cond 218*12065Sbaden (ufn (funcall ufn)) 219*12065Sbaden (t (bottom))))) 220*12065Sbaden (t (let ((v (reverse x)) (z nil)) 221*12065Sbaden (setq z (car v)) 222*12065Sbaden (setq v (cdr v)) 223*12065Sbaden (mapc '(lambda (y) (setq z (funcall ,fn (list y z)))) v) 224*12065Sbaden z)))))) 225*12065Sbaden `(function ,q)))) 226*12065Sbaden 227*12065Sbaden 228*12065Sbaden 229*12065Sbaden 230*12065Sbaden (defun while$fp (pFn fFn) 231*12065Sbaden (let* ((fn_p (codeGen pFn)) 232*12065Sbaden (fn_f (codeGen fFn)) 233*12065Sbaden (q 234*12065Sbaden `(lambda (x) 235*12065Sbaden (cond (DynTraceFlg 236*12065Sbaden (measWhile ,(mName pFn) ,(mName fFn) x))) 237*12065Sbaden (do 238*12065Sbaden ((z (funcall ,fn_p x) (funcall ,fn_p rslt)) 239*12065Sbaden (rslt x)) 240*12065Sbaden ((eq 'F z) rslt) 241*12065Sbaden (cond ((undefp z) (bottom))) 242*12065Sbaden (setq rslt (funcall ,fn_f rslt)))))) 243*12065Sbaden `(function ,q))) 244*12065Sbaden 245*12065Sbaden 246*12065Sbaden 247*12065Sbaden 248*12065Sbaden ; Tree insert 249*12065Sbaden 250*12065Sbaden (def ti$fp 251*12065Sbaden (lambda (ptree) 252*12065Sbaden (let* ((fn (codeGen ptree)) 253*12065Sbaden (q 254*12065Sbaden `(lambda (x) 255*12065Sbaden (cond (DynTraceFlg (measAi ,(mName ptree) x))) 256*12065Sbaden (treeIns$fp ,fn x)))) 257*12065Sbaden `(function ,q)))) 258