xref: /csrg-svn/old/lisp/fp/fp.vax/scanner.l (revision 21733)
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