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