added character literals
This commit is contained in:
@@ -24,11 +24,22 @@
|
||||
(write-char #\Newline str))
|
||||
(t (write-char ch str))))))
|
||||
|
||||
(defun read-character (stream)
|
||||
(let ((ch? (read-char stream)))
|
||||
(if (not (char-equal ch? #\\))
|
||||
(if (char-equal #\' (peek-char nil stream))
|
||||
(progn (read-char stream) ch?)
|
||||
(error "Unterminated char."))
|
||||
(progn (case (read-char stream)
|
||||
(#\n (setf ch? #\Newline)))
|
||||
(if (char-equal #\' (peek-char nil stream))
|
||||
(progn (read-char stream) ch?)
|
||||
(error "Unterminated char."))))))
|
||||
|
||||
(defun lex-line (line &optional (line-num 0))
|
||||
(let ((*package* (find-package "KEYWORD")))
|
||||
(iter (with line-stream = (make-string-input-stream line))
|
||||
(with col = 0)
|
||||
(with has-err = nil)
|
||||
(for next-char = (peek-char nil line-stream nil nil))
|
||||
(until (null next-char))
|
||||
(let ((flag t))
|
||||
@@ -42,11 +53,16 @@
|
||||
((char= #\" next-char)
|
||||
(read-char line-stream)
|
||||
(collect (make-token (read-string line-stream)
|
||||
line-num col)
|
||||
line-num col :string)
|
||||
into tokens))
|
||||
((char= #\' next-char)
|
||||
(read-char line-stream)
|
||||
(collect (make-token (read-character line-stream)
|
||||
line-num col :char)
|
||||
into tokens))
|
||||
(t (setf flag nil)))
|
||||
(when flag
|
||||
(incf col)
|
||||
(incf col) ;; TODO: currently this is wrong for char and strings
|
||||
(next-iteration)))
|
||||
(for next-sym in-stream line-stream
|
||||
using #'read-preserving-whitespace)
|
||||
@@ -100,6 +116,9 @@
|
||||
(defmethod parse-token ((parser parser) (type (eql :number)))
|
||||
(add-op `(:push-int ,(car (read-token parser))) parser))
|
||||
|
||||
(defmethod parse-token ((parser parser) (type (eql :char)))
|
||||
(add-op `(:push-int ,(char-code (car (read-token parser)))) parser))
|
||||
|
||||
(defmethod parse-token ((parser parser) (type (eql :string)))
|
||||
(let ((token (read-token parser)))
|
||||
(add-op `(:push-str ,(length (car token))
|
||||
|
||||
Reference in New Issue
Block a user