Compiler/lexical analyzer: Difference between revisions
Content added Content deleted
m (minor edits) |
m (Fix a bug in make-this-or-that-handler and use lisp keywords instead of obscure symbols.) |
||
Line 1,677:
do (setf may-end (char= ch #\*))
finally (return (read stream t nil t))))
(t (make-token :name
(defun make-constant-handler (token-name)
Line 1,693:
(read-char stream nil nil t)
(make-token :name then :line line :column column))
(
(t
(lexer-error "Unrecognized character '~A'" next))))))
(defun identifier? (symbol)
Line 1,709 ⟶ 1,711:
(defun id->keyword (id line column)
(case id
(|if| (make-token :name
(|else| (make-token :name
(|while| (make-token :name
(|print| (make-token :name
(|putc| (make-token :name
(t nil)))
Line 1,725 ⟶ 1,727:
(if (identifier? obj)
(or (id->keyword obj line column)
(make-token :name
(lexer-error "Invalid identifier name: ~A" obj))))))
Line 1,736 ⟶ 1,738:
(let ((obj (read stream t nil t)))
(if (integerp obj)
(make-token :name
(lexer-error "Invalid integer: ~A" obj))))))
Line 1,754 ⟶ 1,756:
(t ch))))
(if (char= #\' (read-char stream t nil t))
(make-token :name
(lexer-error "Only one character is allowed in character literal"))))
Line 1,773 ⟶ 1,775:
(t ch)))
(vector-push-extend ch result)
finally (return (make-token :name
(defun make-lexer-readtable ()
Line 1,783 ⟶ 1,785:
;; operators
(set-macro-character #\* (make-constant-handler
(set-macro-character #\/ #'handle-divide-or-comment)
(set-macro-character #\% (make-constant-handler
(set-macro-character #\+ (make-constant-handler
(set-macro-character #\- (make-constant-handler
(set-macro-character #\< (make-this-or-that-handler #\=
(set-macro-character #\> (make-this-or-that-handler #\=
(set-macro-character #\= (make-this-or-that-handler #\=
(set-macro-character #\! (make-this-or-that-handler #\=
(set-macro-character #\& (make-this-or-that-handler #\&
(set-macro-character #\| (make-this-or-that-handler #\|
;; symbols
(set-macro-character #\( (make-constant-handler
(set-macro-character #\) (make-constant-handler
(set-macro-character #\{ (make-constant-handler
(set-macro-character #\} (make-constant-handler
(set-macro-character #\; (make-constant-handler
(set-macro-character #\, (make-constant-handler
;; identifiers & keywords
Line 1,830 ⟶ 1,832:
(token-line token) (token-column token) (token-name token) (token-value token))
finally (format t "~5D ~5D ~15A~%"
(line-of stream) (column-of stream)
(close stream))))
Line 1,845 ⟶ 1,847:
(if file
(lex file)
(error "File must be specified"))))</lang>
{{out|case=test case 3}}
<pre> 5 16
5 40
6 16
6 40
7 16
7 40
8 16
8 40
9 16
9 40
10 16
10 40
11 16
11 40
12 16
12 40
13 16
13 40
14 16
14 40
15 16
15 40
16 16
16 40
17 16
17 40
18 16
18 40
19 16
19 40
20 26
21 26
22 26
23 1
=={{header|Euphoria}}==
|