112072Sbaden ; FP interpreter/compiler 212072Sbaden ; Copyright (c) 1982 Scott B. Baden 312072Sbaden ; Berkeley, California 4*21733Sdist ; 5*21733Sdist ; Copyright (c) 1982 Regents of the University of California. 6*21733Sdist ; All rights reserved. The Berkeley software License Agreement 7*21733Sdist ; specifies the terms and conditions for redistribution. 8*21733Sdist ; 9*21733Sdist (setq SCCS-scanner.l "@(#)scanner.l 5.1 (Berkeley) 05/31/85") 1012072Sbaden 1112072Sbaden ; Scanner code. 1212072Sbaden 1312072Sbaden ; get the next token: names, numbers, special symbols 1412072Sbaden ; this is the top-level scanner section. 1512072Sbaden 1612072Sbaden (include specials.l) 1712072Sbaden (declare (localf alpha$ numer$ get_num$ get_nam$ namtyp two_kind)) 1812072Sbaden 1912072Sbaden (defun get_tkn nil 2012072Sbaden (do ((char_num (Getc) (Getc)) 2112072Sbaden (scan_fn nil)) 2212072Sbaden 2312072Sbaden ((eq char_num -1) (*throw 'parse$err 'eof$$)) ; eof control D 2412072Sbaden 2512072Sbaden ; if the first character is a letter then the next token is a name 2612072Sbaden 2712072Sbaden (cond ((alpha$ char_num) (return (namtyp char_num))) 2812072Sbaden 2912072Sbaden ; if the first character is a number then next token is a number 3012072Sbaden 3112072Sbaden ((numer$ char_num) (return 3212072Sbaden (list 'select$$ 3312072Sbaden (get_num$ char_num)))) 3412072Sbaden 3512072Sbaden ((memq char_num #.whiteSpace)) 3612072Sbaden ((eq char_num 35) (clr_teol)) ; # is the comment char. 3712072Sbaden (t (setq scan_fn (get char_set (ascii char_num))) 3812072Sbaden (cond ((null scan_fn) 3912072Sbaden (*throw 'parse$err `(err$$ bad_char ,(ascii char_num)))) 4012072Sbaden (t (return (funcall scan_fn)))))))) 4112072Sbaden 4212072Sbaden ; these are the scanner action functions 4312072Sbaden 4412072Sbaden 4512072Sbaden (defun (scan$asc |[|) nil 4612072Sbaden 'lbrack$$) 4712072Sbaden 4812072Sbaden (defun (scan$asc |]|) nil 4912072Sbaden 'rbrack$$) 5012072Sbaden 5112072Sbaden (defun (scan$asc |{|) nil 5212072Sbaden 'lbrace$$) 5312072Sbaden 5412072Sbaden (defun (scan$asc |}|) nil 5512072Sbaden 'rbrace$$) 5612072Sbaden 5712072Sbaden (defun (scan$asc |(|) nil 5812072Sbaden 'lparen$$) 5912072Sbaden 6012072Sbaden (defun (scan$asc |)|) nil 6112072Sbaden 'rparen$$) 6212072Sbaden 6312072Sbaden (defun (scan$asc |@|) nil 6412072Sbaden 'compos$$) 6512072Sbaden 6612072Sbaden (defun (scan$asc |!|) nil 6712072Sbaden 'insert$$) 6812072Sbaden 6912072Sbaden (defun (scan$asc |\||) nil ; tree insert 7012072Sbaden 'ti$$) 7112072Sbaden 7212072Sbaden (defun (scan$asc |&|) nil 7312072Sbaden 'alpha$$) 7412072Sbaden 7512072Sbaden (defun (scan$asc |;|) nil 7612072Sbaden 'semi$$) 7712072Sbaden 7812072Sbaden (defun (scan$asc |:|) nil 7912072Sbaden 'colon$$) 8012072Sbaden 8112072Sbaden (defun (scan$asc |,|) nil 8212072Sbaden 'comma$$) 8312072Sbaden 8412072Sbaden 8512072Sbaden (defun (scan$asc |+|) nil ; plus or pos select 8612072Sbaden (cond ((numer$ (peekc)) (list 'select$$ (get_num$ #/0))) 8712072Sbaden (t '(builtin$$ plus)))) 8812072Sbaden 8912072Sbaden 9012072Sbaden (defun (scan$asc |*|) nil 9112072Sbaden '(builtin$$ times)) 9212072Sbaden 9312072Sbaden (defun (scan$asc |/|) nil 9412072Sbaden '(builtin$$ div)) 9512072Sbaden 9612072Sbaden (defun (scan$asc |=|) nil 9712072Sbaden '(builtin$$ eq)) 9812072Sbaden 9912072Sbaden 10012072Sbaden ; either a 1 or 2-char token 10112072Sbaden (defun (scan$asc |-|) nil 10212072Sbaden (cond ((numer$ (peekc)) ; subtract or neg select 10312072Sbaden (list 'select$$ (minus (get_num$ #/0)))) 10412072Sbaden (t (two_kind #/> 'arrow$$ '(builtin$$ sub))))) ; or arrow 10512072Sbaden 10612072Sbaden (defun (scan$asc |>|) nil ; > or >= 10712072Sbaden (two_kind #/= '(builtin$$ ge) '(builtin$$ gt))) 10812072Sbaden 10912072Sbaden (defun (scan$asc |<|) nil ; < or <= 11012072Sbaden (two_kind #/= '(builtin$$ le) '(builtin$$ lt))) 11112072Sbaden 11212072Sbaden (defun (scan$asc |~|) nil ; ~= or error 11312072Sbaden (two_kind #/= '(builtin$$ ne) 11412072Sbaden `(badtkn$$ ,(ascii char_num)))) 11512072Sbaden 11612072Sbaden 11712072Sbaden ; if a % then read in the next constant (object) 11812072Sbaden 11912072Sbaden (defun (scan$asc |%|) nil 12012072Sbaden (let ((v (get_obj nil))) 12112072Sbaden (list 'constant$$ (list 'quote v)))) 12212072Sbaden 12312072Sbaden 12412072Sbaden ; these are the support routines 12512072Sbaden 12612072Sbaden ; routine to tell if a character is a letter 12712072Sbaden 12812072Sbaden (defun alpha$ (x) 12912072Sbaden (or (and (greaterp x 96) (lessp x 123)) 13012072Sbaden (and (greaterp x 64) (lessp x 91)))) 13112072Sbaden 13212072Sbaden 13312072Sbaden ; routine to tell if character is a number 13412072Sbaden 13512072Sbaden (defun numer$ (x) 13612072Sbaden (and (greaterp x 47) (lessp x 58))) 13712072Sbaden 13812072Sbaden 13912072Sbaden ; routine to read in a number 14012072Sbaden 14112072Sbaden (defun get_num$ (first_c) 14212072Sbaden (do ((num$ (diff first_c 48 )) 14312072Sbaden (c (peekc) (peekc))) 14412072Sbaden ((memq c num_delim$) (return num$)) 14512072Sbaden (cond ((not (numer$ c)) (*throw 'parse$err '(err$$ badnum))) 14612072Sbaden (t (setq num$ (plus (times 10 num$) (diff (Getc) 48 ))))))) 14712072Sbaden 14812072Sbaden 14912072Sbaden 15012072Sbaden ; routine to read in a name 15112072Sbaden 15212072Sbaden (defun get_nam$ (first_c) 15312072Sbaden (do ((name$ (cons first_c nil)) 15412072Sbaden (c (peekc) (peekc))) 15512072Sbaden ((not (or (numer$ c) (alpha$ c) (eq #/_ c))) (implode (nreverse name$))) 15612072Sbaden (setq name$ (cons (Getc) name$)))) 15712072Sbaden 15812072Sbaden ; routine to determine whether the name represents a builtin 15912072Sbaden ; or not 16012072Sbaden 16112072Sbaden (defun namtyp (c) 16212072Sbaden (let ((x (get_nam$ c))) 16312072Sbaden (cond ((eq x 'while) 'while$$) 16412072Sbaden (t (list 16512072Sbaden (cond ((null (memq x builtins)) 'defined$$) 16612072Sbaden (t 'builtin$$)) x))))) 16712072Sbaden 16812072Sbaden 16912072Sbaden ; read in a lisp sequence 17012072Sbaden 17112072Sbaden (defun readit nil 17212072Sbaden (If (not (memq (car in_buf) '(< % :))) 17312072Sbaden then (setq in_buf (cons 32 in_buf))) 17412072Sbaden 17512072Sbaden (setq in_buf (cons #/< in_buf)) 17612072Sbaden (cond ((and ptport (null infile)) (patom '< ptport))) 17712072Sbaden (let ((readtable newreadtable)) 17812072Sbaden (do ((xx (*catch 'parse$err (get_obj t)) (*catch 'parse$err (get_obj t))) 17912072Sbaden (result nil)) 18012072Sbaden ((eq xx '>) (nreverse result)) 18112072Sbaden 18212072Sbaden (cond ((find 'err$$ xx) (*throw 'parse$err `(err$$ bad_obj ,xx)))) 18312072Sbaden (cond ((eq '\, xx)) 18412072Sbaden (t (setq result (cons xx result))))))) 18512072Sbaden 18612072Sbaden 18712072Sbaden ; peek ahead to see if the single character token in really 18812072Sbaden ; a double character token 18912072Sbaden 19012072Sbaden (defun two_kind (char2 dbl_nm sing_nm) 19112072Sbaden (cond ((eq (peekc) char2) 19212072Sbaden (prog (dummy) 19312072Sbaden (setq dummy (Getc)) (return dbl_nm))) 19412072Sbaden (t sing_nm))) 19512072Sbaden 19612072Sbaden ; check if any ? (bottom) in sequence 19712072Sbaden 19812072Sbaden (defun chk_bot$ (x) 19912072Sbaden (cond ((atom x) (eq x '?)) 20012072Sbaden (t (or (chk_bot$ (car x)) (chk_bot$ (cdr x)))))) 20112072Sbaden 20212072Sbaden ; get an object and check for bottom (?) or errors (reserved symbols) 20312072Sbaden 20412072Sbaden (defun get_obj (read_seq) 20512072Sbaden (let ((readtable newreadtable)) 20612072Sbaden (prog (x) 20712072Sbaden (setq x (read_inp)) 20812072Sbaden (cond ((chk_bot$ x) (return '?)) 20912072Sbaden ((boolp x) (return x)) 21012072Sbaden ((and (atom x) (memq x '(|,| |>|))) 21112072Sbaden (cond (read_seq (return x)) 21212072Sbaden (t (*throw 'parse$err '(err$$ bad_comma))))) 21312072Sbaden ((and (atom x) (memq x '(+ -))) 21412072Sbaden (cond ((numer$ (peekc)) 21512072Sbaden (let ((z (*catch 'parse$err (get_obj nil)))) 21612072Sbaden (cond ((find 'err$$ z) 21712072Sbaden (*throw 'parse$err `(err$$ bad_num ,z))) 21812072Sbaden ((not (numberp z)) 21912072Sbaden (*throw 'parse$err `(err$$ bad_num ,z))) 22012072Sbaden (t (cond ((eq x '+) (return z)) 22112072Sbaden (t (return (diff z)))))))) 22212072Sbaden (t (*throw 'parse$err `(err$$ bad_num ,x))))) 22312072Sbaden ((and (symbolp x) (numer$ (car (exploden x)))) 22412072Sbaden (*throw 'parse$err `(err$$ bad_num ,x))) 22512072Sbaden ((and (atom x) (memq x e_rsrvd)) (*throw 'parse$err `(err$$ bad_obj ,x))) 22612072Sbaden (t (return x)))))) 22712072Sbaden 22812072Sbaden 22912072Sbaden (defun read_inp nil 23012072Sbaden (let ((c 23112072Sbaden (let ((piport infile)) 23212072Sbaden (Read)))) 23312072Sbaden (If (not (listp c)) 23412072Sbaden then (let ((ob (exploden c))) 23512072Sbaden (let ((OB 23612072Sbaden (If (and (not (= (car in_buf) #/<)) 23712072Sbaden (not (= (car in_buf) #/>)) 23812072Sbaden (not (= c '>))) 23912072Sbaden then (cons 32 ob) 24012072Sbaden else ob))) 24112072Sbaden 24212072Sbaden (If (onep (length OB)) 24312072Sbaden then (setq in_buf (cons (car OB) in_buf)) 24412072Sbaden else (setq in_buf (append (reverse OB) in_buf)))))) 24512072Sbaden c)) 24612072Sbaden 24712072Sbaden 24812072Sbaden 24912072Sbaden (defun clr_teol nil 25012072Sbaden (let ((piport infile)) 25112072Sbaden (do ((c (Getc) (Getc))) 25212072Sbaden ((eq c #.CR) 25312072Sbaden (cond ((not in_def) (setq in_buf nil))) 25412072Sbaden (cond ((and (not infile) (not in_def)) 25512072Sbaden (patom " "))))))) 25612072Sbaden 25712072Sbaden (defun p_strng (s) 25812072Sbaden (patom (ascii s))) 259