1*12072Sbaden (setq SCCS-scanner.l "@(#)scanner.l 1.1 04/27/83") 2*12072Sbaden ; FP interpreter/compiler 3*12072Sbaden ; Copyright (c) 1982 Scott B. Baden 4*12072Sbaden ; Berkeley, California 5*12072Sbaden 6*12072Sbaden ; Scanner code. 7*12072Sbaden 8*12072Sbaden ; get the next token: names, numbers, special symbols 9*12072Sbaden ; this is the top-level scanner section. 10*12072Sbaden 11*12072Sbaden (include specials.l) 12*12072Sbaden (declare (localf alpha$ numer$ get_num$ get_nam$ namtyp two_kind)) 13*12072Sbaden 14*12072Sbaden (defun get_tkn nil 15*12072Sbaden (do ((char_num (Getc) (Getc)) 16*12072Sbaden (scan_fn nil)) 17*12072Sbaden 18*12072Sbaden ((eq char_num -1) (*throw 'parse$err 'eof$$)) ; eof control D 19*12072Sbaden 20*12072Sbaden ; if the first character is a letter then the next token is a name 21*12072Sbaden 22*12072Sbaden (cond ((alpha$ char_num) (return (namtyp char_num))) 23*12072Sbaden 24*12072Sbaden ; if the first character is a number then next token is a number 25*12072Sbaden 26*12072Sbaden ((numer$ char_num) (return 27*12072Sbaden (list 'select$$ 28*12072Sbaden (get_num$ char_num)))) 29*12072Sbaden 30*12072Sbaden ((memq char_num #.whiteSpace)) 31*12072Sbaden ((eq char_num 35) (clr_teol)) ; # is the comment char. 32*12072Sbaden (t (setq scan_fn (get char_set (ascii char_num))) 33*12072Sbaden (cond ((null scan_fn) 34*12072Sbaden (*throw 'parse$err `(err$$ bad_char ,(ascii char_num)))) 35*12072Sbaden (t (return (funcall scan_fn)))))))) 36*12072Sbaden 37*12072Sbaden ; these are the scanner action functions 38*12072Sbaden 39*12072Sbaden 40*12072Sbaden (defun (scan$asc |[|) nil 41*12072Sbaden 'lbrack$$) 42*12072Sbaden 43*12072Sbaden (defun (scan$asc |]|) nil 44*12072Sbaden 'rbrack$$) 45*12072Sbaden 46*12072Sbaden (defun (scan$asc |{|) nil 47*12072Sbaden 'lbrace$$) 48*12072Sbaden 49*12072Sbaden (defun (scan$asc |}|) nil 50*12072Sbaden 'rbrace$$) 51*12072Sbaden 52*12072Sbaden (defun (scan$asc |(|) nil 53*12072Sbaden 'lparen$$) 54*12072Sbaden 55*12072Sbaden (defun (scan$asc |)|) nil 56*12072Sbaden 'rparen$$) 57*12072Sbaden 58*12072Sbaden (defun (scan$asc |@|) nil 59*12072Sbaden 'compos$$) 60*12072Sbaden 61*12072Sbaden (defun (scan$asc |!|) nil 62*12072Sbaden 'insert$$) 63*12072Sbaden 64*12072Sbaden (defun (scan$asc |\||) nil ; tree insert 65*12072Sbaden 'ti$$) 66*12072Sbaden 67*12072Sbaden (defun (scan$asc |&|) nil 68*12072Sbaden 'alpha$$) 69*12072Sbaden 70*12072Sbaden (defun (scan$asc |;|) nil 71*12072Sbaden 'semi$$) 72*12072Sbaden 73*12072Sbaden (defun (scan$asc |:|) nil 74*12072Sbaden 'colon$$) 75*12072Sbaden 76*12072Sbaden (defun (scan$asc |,|) nil 77*12072Sbaden 'comma$$) 78*12072Sbaden 79*12072Sbaden 80*12072Sbaden (defun (scan$asc |+|) nil ; plus or pos select 81*12072Sbaden (cond ((numer$ (peekc)) (list 'select$$ (get_num$ #/0))) 82*12072Sbaden (t '(builtin$$ plus)))) 83*12072Sbaden 84*12072Sbaden 85*12072Sbaden (defun (scan$asc |*|) nil 86*12072Sbaden '(builtin$$ times)) 87*12072Sbaden 88*12072Sbaden (defun (scan$asc |/|) nil 89*12072Sbaden '(builtin$$ div)) 90*12072Sbaden 91*12072Sbaden (defun (scan$asc |=|) nil 92*12072Sbaden '(builtin$$ eq)) 93*12072Sbaden 94*12072Sbaden 95*12072Sbaden ; either a 1 or 2-char token 96*12072Sbaden (defun (scan$asc |-|) nil 97*12072Sbaden (cond ((numer$ (peekc)) ; subtract or neg select 98*12072Sbaden (list 'select$$ (minus (get_num$ #/0)))) 99*12072Sbaden (t (two_kind #/> 'arrow$$ '(builtin$$ sub))))) ; or arrow 100*12072Sbaden 101*12072Sbaden (defun (scan$asc |>|) nil ; > or >= 102*12072Sbaden (two_kind #/= '(builtin$$ ge) '(builtin$$ gt))) 103*12072Sbaden 104*12072Sbaden (defun (scan$asc |<|) nil ; < or <= 105*12072Sbaden (two_kind #/= '(builtin$$ le) '(builtin$$ lt))) 106*12072Sbaden 107*12072Sbaden (defun (scan$asc |~|) nil ; ~= or error 108*12072Sbaden (two_kind #/= '(builtin$$ ne) 109*12072Sbaden `(badtkn$$ ,(ascii char_num)))) 110*12072Sbaden 111*12072Sbaden 112*12072Sbaden ; if a % then read in the next constant (object) 113*12072Sbaden 114*12072Sbaden (defun (scan$asc |%|) nil 115*12072Sbaden (let ((v (get_obj nil))) 116*12072Sbaden (list 'constant$$ (list 'quote v)))) 117*12072Sbaden 118*12072Sbaden 119*12072Sbaden ; these are the support routines 120*12072Sbaden 121*12072Sbaden ; routine to tell if a character is a letter 122*12072Sbaden 123*12072Sbaden (defun alpha$ (x) 124*12072Sbaden (or (and (greaterp x 96) (lessp x 123)) 125*12072Sbaden (and (greaterp x 64) (lessp x 91)))) 126*12072Sbaden 127*12072Sbaden 128*12072Sbaden ; routine to tell if character is a number 129*12072Sbaden 130*12072Sbaden (defun numer$ (x) 131*12072Sbaden (and (greaterp x 47) (lessp x 58))) 132*12072Sbaden 133*12072Sbaden 134*12072Sbaden ; routine to read in a number 135*12072Sbaden 136*12072Sbaden (defun get_num$ (first_c) 137*12072Sbaden (do ((num$ (diff first_c 48 )) 138*12072Sbaden (c (peekc) (peekc))) 139*12072Sbaden ((memq c num_delim$) (return num$)) 140*12072Sbaden (cond ((not (numer$ c)) (*throw 'parse$err '(err$$ badnum))) 141*12072Sbaden (t (setq num$ (plus (times 10 num$) (diff (Getc) 48 ))))))) 142*12072Sbaden 143*12072Sbaden 144*12072Sbaden 145*12072Sbaden ; routine to read in a name 146*12072Sbaden 147*12072Sbaden (defun get_nam$ (first_c) 148*12072Sbaden (do ((name$ (cons first_c nil)) 149*12072Sbaden (c (peekc) (peekc))) 150*12072Sbaden ((not (or (numer$ c) (alpha$ c) (eq #/_ c))) (implode (nreverse name$))) 151*12072Sbaden (setq name$ (cons (Getc) name$)))) 152*12072Sbaden 153*12072Sbaden ; routine to determine whether the name represents a builtin 154*12072Sbaden ; or not 155*12072Sbaden 156*12072Sbaden (defun namtyp (c) 157*12072Sbaden (let ((x (get_nam$ c))) 158*12072Sbaden (cond ((eq x 'while) 'while$$) 159*12072Sbaden (t (list 160*12072Sbaden (cond ((null (memq x builtins)) 'defined$$) 161*12072Sbaden (t 'builtin$$)) x))))) 162*12072Sbaden 163*12072Sbaden 164*12072Sbaden ; read in a lisp sequence 165*12072Sbaden 166*12072Sbaden (defun readit nil 167*12072Sbaden (If (not (memq (car in_buf) '(< % :))) 168*12072Sbaden then (setq in_buf (cons 32 in_buf))) 169*12072Sbaden 170*12072Sbaden (setq in_buf (cons #/< in_buf)) 171*12072Sbaden (cond ((and ptport (null infile)) (patom '< ptport))) 172*12072Sbaden (let ((readtable newreadtable)) 173*12072Sbaden (do ((xx (*catch 'parse$err (get_obj t)) (*catch 'parse$err (get_obj t))) 174*12072Sbaden (result nil)) 175*12072Sbaden ((eq xx '>) (nreverse result)) 176*12072Sbaden 177*12072Sbaden (cond ((find 'err$$ xx) (*throw 'parse$err `(err$$ bad_obj ,xx)))) 178*12072Sbaden (cond ((eq '\, xx)) 179*12072Sbaden (t (setq result (cons xx result))))))) 180*12072Sbaden 181*12072Sbaden 182*12072Sbaden ; peek ahead to see if the single character token in really 183*12072Sbaden ; a double character token 184*12072Sbaden 185*12072Sbaden (defun two_kind (char2 dbl_nm sing_nm) 186*12072Sbaden (cond ((eq (peekc) char2) 187*12072Sbaden (prog (dummy) 188*12072Sbaden (setq dummy (Getc)) (return dbl_nm))) 189*12072Sbaden (t sing_nm))) 190*12072Sbaden 191*12072Sbaden ; check if any ? (bottom) in sequence 192*12072Sbaden 193*12072Sbaden (defun chk_bot$ (x) 194*12072Sbaden (cond ((atom x) (eq x '?)) 195*12072Sbaden (t (or (chk_bot$ (car x)) (chk_bot$ (cdr x)))))) 196*12072Sbaden 197*12072Sbaden ; get an object and check for bottom (?) or errors (reserved symbols) 198*12072Sbaden 199*12072Sbaden (defun get_obj (read_seq) 200*12072Sbaden (let ((readtable newreadtable)) 201*12072Sbaden (prog (x) 202*12072Sbaden (setq x (read_inp)) 203*12072Sbaden (cond ((chk_bot$ x) (return '?)) 204*12072Sbaden ((boolp x) (return x)) 205*12072Sbaden ((and (atom x) (memq x '(|,| |>|))) 206*12072Sbaden (cond (read_seq (return x)) 207*12072Sbaden (t (*throw 'parse$err '(err$$ bad_comma))))) 208*12072Sbaden ((and (atom x) (memq x '(+ -))) 209*12072Sbaden (cond ((numer$ (peekc)) 210*12072Sbaden (let ((z (*catch 'parse$err (get_obj nil)))) 211*12072Sbaden (cond ((find 'err$$ z) 212*12072Sbaden (*throw 'parse$err `(err$$ bad_num ,z))) 213*12072Sbaden ((not (numberp z)) 214*12072Sbaden (*throw 'parse$err `(err$$ bad_num ,z))) 215*12072Sbaden (t (cond ((eq x '+) (return z)) 216*12072Sbaden (t (return (diff z)))))))) 217*12072Sbaden (t (*throw 'parse$err `(err$$ bad_num ,x))))) 218*12072Sbaden ((and (symbolp x) (numer$ (car (exploden x)))) 219*12072Sbaden (*throw 'parse$err `(err$$ bad_num ,x))) 220*12072Sbaden ((and (atom x) (memq x e_rsrvd)) (*throw 'parse$err `(err$$ bad_obj ,x))) 221*12072Sbaden (t (return x)))))) 222*12072Sbaden 223*12072Sbaden 224*12072Sbaden (defun read_inp nil 225*12072Sbaden (let ((c 226*12072Sbaden (let ((piport infile)) 227*12072Sbaden (Read)))) 228*12072Sbaden (If (not (listp c)) 229*12072Sbaden then (let ((ob (exploden c))) 230*12072Sbaden (let ((OB 231*12072Sbaden (If (and (not (= (car in_buf) #/<)) 232*12072Sbaden (not (= (car in_buf) #/>)) 233*12072Sbaden (not (= c '>))) 234*12072Sbaden then (cons 32 ob) 235*12072Sbaden else ob))) 236*12072Sbaden 237*12072Sbaden (If (onep (length OB)) 238*12072Sbaden then (setq in_buf (cons (car OB) in_buf)) 239*12072Sbaden else (setq in_buf (append (reverse OB) in_buf)))))) 240*12072Sbaden c)) 241*12072Sbaden 242*12072Sbaden 243*12072Sbaden 244*12072Sbaden (defun clr_teol nil 245*12072Sbaden (let ((piport infile)) 246*12072Sbaden (do ((c (Getc) (Getc))) 247*12072Sbaden ((eq c #.CR) 248*12072Sbaden (cond ((not in_def) (setq in_buf nil))) 249*12072Sbaden (cond ((and (not infile) (not in_def)) 250*12072Sbaden (patom " "))))))) 251*12072Sbaden 252*12072Sbaden (defun p_strng (s) 253*12072Sbaden (patom (ascii s))) 254