about summary refs log tree commit diff stats
path: root/clex.lisp
diff options
context:
space:
mode:
Diffstat (limited to 'clex.lisp')
-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")