Annotation of 42BSD/ucb/fp/scanner.l, revision 1.1

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)))

unix.superglobalmegacorp.com

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