diff options
author | Darren Bane <darren.bane@emdalo.com> | 2020-12-04 21:02:35 +0000 |
---|---|---|
committer | Darren Bane <darren.bane@emdalo.com> | 2020-12-04 21:02:35 +0000 |
commit | 10b5ba35c96f72e5b66698b36c7e0a38b555f394 (patch) | |
tree | 86e559dda61b1d0091cc594888e9c6a40666a27a | |
parent | 078ae5a0780015dfff775196d675fb23f0367060 (diff) | |
download | lsp-10b5ba35c96f72e5b66698b36c7e0a38b555f394.tar.gz |
Start porting 'lexer'
-rw-r--r-- | clex.lisp | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/clex.lisp b/clex.lisp index 550ead4..7ca04f0 100644 --- a/clex.lisp +++ b/clex.lisp @@ -6,7 +6,8 @@ #:<lstring> #:<lend> #:<lident> - #:ident)) + #:ident + #:lexer)) (in-package #:clex) (defclass <lexeme> () () (:metaclass <abstract-class>)) @@ -60,5 +61,23 @@ (defgeneric lexer (cl)) (defmethod lexer ((cl <string-lexer>)) + (flet ((lexer-char (c) + (cond ((member c '(#\space #\tab)) + (forward cl) + (lexer cl)) ; NB: tail recursion. ok? + ((or (and (char>= c #\a) (char<= c #\z)) + (and (char>= c #\A) (char<= c #\Z))) + (make-instance (find-class '<lident>) 'i (extract-ident cl))) + ((char= c #\") + (forward cl) + (let ((res (make-instance (find-class '<lstring>) 's (extract (lambda (c) (char/= c #\")) cl)))) + (forward cl) + res)) + ((member c '(#\+ #\- #\* #\/ #\% #\& #\| #\! #\= #\( #\))) + (forward cl) + (make-instance (find-class '<lsymbol>) 's (string c))) + ((member c '(#\< #\>)) + (forward cl) + ) (provide "clex") |