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