diff options
author | Darren Bane <dbane@tilde.institute> | 2020-12-11 14:14:33 +0000 |
---|---|---|
committer | Darren Bane <dbane@tilde.institute> | 2020-12-11 14:14:33 +0000 |
commit | 207cda23007f05dd954ee82511babba457465265 (patch) | |
tree | 44c143f1554b83d31eaac374a738b7fbaaba459d /clex.lisp | |
parent | 76105d297c5b56cf097bcf129e6de56d681744cc (diff) | |
parent | f16f553f2effb7ac8120fb8a15b59bcdd480a97d (diff) | |
download | lsp-207cda23007f05dd954ee82511babba457465265.tar.gz |
Merge branch 'master' of /home/dbane/public_repos/lsp into master
Diffstat (limited to 'clex.lisp')
-rw-r--r-- | clex.lisp | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/clex.lisp b/clex.lisp index cdd6025..7ca04f0 100644 --- a/clex.lisp +++ b/clex.lisp @@ -4,7 +4,10 @@ #:<lint> #:<lsymbol> #:<lstring> - #:<lend>)) + #:<lend> + #:<lident> + #:ident + #:lexer)) (in-package #:clex) (defclass <lexeme> () () (:metaclass <abstract-class>)) @@ -55,4 +58,26 @@ (and (char>= x #\0) (char<= x #\9)) (char= x #\_)))) (extract #'is-alpha-num cl))) + +(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") |