about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorDarren Bane <darren.bane@emdalo.com>2020-12-04 21:02:35 +0000
committerDarren Bane <darren.bane@emdalo.com>2020-12-04 21:02:35 +0000
commit10b5ba35c96f72e5b66698b36c7e0a38b555f394 (patch)
tree86e559dda61b1d0091cc594888e9c6a40666a27a
parent078ae5a0780015dfff775196d675fb23f0367060 (diff)
downloadlsp-10b5ba35c96f72e5b66698b36c7e0a38b555f394.tar.gz
Start porting 'lexer'
-rw-r--r--clex.lisp21
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")