about summary refs log tree commit diff stats
path: root/clex.lisp
diff options
context:
space:
mode:
authorDarren Bane <dbane@tilde.institute>2020-12-11 14:14:33 +0000
committerDarren Bane <dbane@tilde.institute>2020-12-11 14:14:33 +0000
commit207cda23007f05dd954ee82511babba457465265 (patch)
tree44c143f1554b83d31eaac374a738b7fbaaba459d /clex.lisp
parent76105d297c5b56cf097bcf129e6de56d681744cc (diff)
parentf16f553f2effb7ac8120fb8a15b59bcdd480a97d (diff)
downloadlsp-207cda23007f05dd954ee82511babba457465265.tar.gz
Merge branch 'master' of /home/dbane/public_repos/lsp into master
Diffstat (limited to 'clex.lisp')
-rw-r--r--clex.lisp27
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")