diff options
author | Darren Bane <darren.bane@gmail.com> | 2020-05-11 01:15:06 +0100 |
---|---|---|
committer | Darren Bane <darren.bane@gmail.com> | 2020-05-11 01:15:06 +0100 |
commit | c066ab2a55a069802009568a051673b3505503d4 (patch) | |
tree | 3cf0613bb334461c1f39f55a78a4ff79d3fb971f /lex.lsp | |
parent | 5eba13b70414e1a40ef2418978082c6e4ac37c19 (diff) | |
download | lsp-c066ab2a55a069802009568a051673b3505503d4.tar.gz |
Lots of unfinished stuff
Diffstat (limited to 'lex.lsp')
-rw-r--r-- | lex.lsp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/lex.lsp b/lex.lsp new file mode 100644 index 0000000..52eb822 --- /dev/null +++ b/lex.lsp @@ -0,0 +1,41 @@ +(defclass <string-lexer> () ((string :initarg :s :accessor string) + (current :initform 0 :accessor current) + (size :accessor size))) + +(defmethod initialize-object :after ((self <string-lexer>) initargs) + (setf (size self) (length (str self)))) + +(defgeneric forward (cl &rest args)) +(defmethod forward ((cl <string-lexer>) &rest args) + (let ((incr (if (null args) + 1 + (car args)))) + (setf (curr cl) (+ (curr cl) incr)))) + +(defgeneric extract (pred cl)) +(defmethod extract (pred (cl <string-lexer>)) + (let* ((st (string cl)) + (pos (current cl)) + (ext (lambda (n) + (if (and (< n (size cl)) (pred (elt st n))) + (ext (+ n 1)) + n))) + (res (ext pos))) + (setf (current cl) res) + (subseq (string cl) pos (- res pos)))) + +(defgeneric extract-int (cl)) +(defmethod extract-int ((cl <string-lexer>)) + ;; TODO: flet? + (let ((is-int (lambda (x) + (and (char>= x #\0) (char<= x #\9))))) + (convert (extract is-int cl) <number>))) + +(defgeneric extract-ident (cl)) +(defmethod extract-ident ((cl <string-lexer>)) + (let ((is-alpha-num (lambda (x) + (or (and (char>= x #\a) (char<= x #\z)) + (and (char>= x #\A) (char<= x #\Z)) + (and (char>= x #\0) (char<= x #\9)) + (char= x #\_))))) + (extract is-alpha-num))) |