Annotation of 43BSD/ucb/fp/scanner.l, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.