[climacs-cvs] CVS update: climacs/cl-syntax.lisp

Pascal Fong Kye pfong at common-lisp.net
Thu Apr 21 15:22:12 UTC 2005


Update of /project/climacs/cvsroot/climacs
In directory common-lisp.net:/tmp/cvs-serv4684

Modified Files:
	cl-syntax.lisp 
Log Message:
2nd vers cl-synt
Date: Thu Apr 21 17:22:11 2005
Author: pfong

Index: climacs/cl-syntax.lisp
diff -u climacs/cl-syntax.lisp:1.7 climacs/cl-syntax.lisp:1.8
--- climacs/cl-syntax.lisp:1.7	Wed Apr 20 17:39:10 2005
+++ climacs/cl-syntax.lisp	Thu Apr 21 17:22:11 2005
@@ -77,8 +77,16 @@
 	(#\` (fo) (make-instance 'backquote))
 	(#\@ (fo) (make-instance 'at))
 	(#\; (fo) (make-instance 'semicolon))
-	(t (cond ((numberp object) (fo)
-		  (make-instance 'number-item))
+	(t (cond ((numberp object) 
+		  (loop until (end-of-buffer-p scan)
+		     while (numberp (object-after scan))
+		     do (fo))
+		  (make-instance 'default-item))
+		 ((neutralcharp object)
+		  (loop until (end-of-buffer-p scan)
+		     while (neutralcharp (object-after scan))
+		     do (fo))
+		  (make-instance 'default-item))
 		 (t (fo) (make-instance 'default-item))))))))
 
 
@@ -88,6 +96,14 @@
    (parser)))
 
 
+
+(defun neutralcharp (var)
+  (and (characterp var)
+       (not (member var '(#\( #\) #\, #\" #\' #\# #\| #\` #\@ #\; #\\
+			  #\. #\+ #\-)
+		    :test #'char=))))
+
+
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;
 ;;; parser
@@ -105,16 +121,16 @@
   `(progn
      (defclass ,name (cl-entry) ())
      (defclass ,empty-name (,name) ())
-
+     
      (defclass ,nonempty-name (,name)
-	  ((items :initarg :items)
-	   (item :initarg :item)))
-
+       ((items :initarg :items)
+	(item :initarg :item)))
+     
      (add-cl-rule (,name -> () (make-instance ',empty-name)))
-
+     
      (add-cl-rule (,name -> (,name ,item-name)
-				    (make-instance ',nonempty-name
-				       :items ,name :item ,item-name)))     
+			 (make-instance ',nonempty-name
+					:items ,name :item ,item-name)))     
      (defmethod display-parse-tree ((entity ,empty-name) (syntax cl-syntax) pane)
        (declare (ignore pane))
        nil)
@@ -140,7 +156,7 @@
 
 (defmethod display-parse-tree ((entity string-char) (syntax cl-syntax) pane)
   (with-slots (item) entity
-     (display-parse-tree item syntax pane)))
+    (display-parse-tree item syntax pane)))
 
 (defclass string-part (cl-entry)
   ((item :initarg :item)
@@ -150,12 +166,12 @@
 								     item)
 								    (start-offset
 								     ch))))
-			      :item item :ch ch))
+			  :item item :ch ch))
 
 (defmethod display-parse-tree ((entity string-part) (syntax cl-syntax) pane)
   (with-slots (item ch) entity
-     (display-parse-tree item syntax pane)
-     (display-parse-tree ch syntax pane)))
+    (display-parse-tree item syntax pane)
+    (display-parse-tree ch syntax pane)))
 
 (defclass string-item (cl-entry)
   ((item :initarg :item)))
@@ -173,8 +189,7 @@
 (defclass identifier-item (cl-entry)
   ((item :initarg :item)))
 
-(add-cl-rule (identifier-item -> (string-item) :item
-			      string-item))
+(add-cl-rule (identifier-item -> (string-item) :item string-item))
 (add-cl-rule (identifier-item -> (hex) :item hex)) 
 (add-cl-rule (identifier-item -> (double-quote) :item double-quote))
 
@@ -212,6 +227,7 @@
     (display-parse-tree item syntax pane))) 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;line-comment
+
 ;;missing (cannot parse end of line)
 
 
@@ -233,7 +249,7 @@
 
 (defmethod display-parse-tree ((entity balanced-comment) (syntax cl-syntax) pane)
   (with-slots (start-hex items end-hex) entity
-    (with-drawing-options (pane :ink +red+)
+    (with-drawing-options (pane :ink +blue+)
       (display-parse-tree start-hex syntax pane)
       (display-parse-tree items syntax pane)
       (display-parse-tree end-hex syntax pane)))) 
@@ -307,6 +323,10 @@
     (display-parse-tree header syntax pane)
     (display-parse-tree item syntax pane)))
 
+(defclass start-number-expr (cl-entry)
+  ((start :initarg :start)
+   (item :initarg :item)))
+
 (defclass binary-expr (cl-entry)
   ((start :initarg :start)
    (header :initarg :header)
@@ -342,26 +362,26 @@
 										  (buffer-sequence (buffer radix)
 												   (start-offset radix)
 												   (end-offset radix))
-											     'string)))))))
+										  'string)))))))
 			   :start start :header header :item item))
 
 (defmethod display-parse-tree ((entity radix-n-expr) (syntax cl-syntax) pane)
   (with-slots (start radix header item) entity
-     (display-parse-tree start syntax pane)
-     (display-parse-tree radix syntax pane)
-     (display-parse-tree header syntax pane)
-     (display-parse-tree item syntax pane)))
+    (display-parse-tree start syntax pane)
+    (display-parse-tree radix syntax pane)
+    (display-parse-tree header syntax pane)
+    (display-parse-tree item syntax pane)))
 
 (defclass simple-number (cl-entry)
   ((content :initarg :content)))
 
 (add-cl-rule (simple-number -> ((content string-item (radix-is
-								    content 10)))
+						      content 10)))
 			    :content content))
 
 (defmethod display-parse-tree ((entity simple-number) (syntax cl-syntax) pane)
   (with-slots (content) entity
-     (display-parse-tree content syntax pane)))
+    (display-parse-tree content syntax pane)))
 
 (defclass complex-number (cl-entry)
   ((start :initarg :start)
@@ -381,10 +401,10 @@
 
 (defmethod display-parse-tree ((entity complex-number) (syntax cl-syntax) pane)
   (with-slots (start realpart imagpart end) entity
-     (display-parse-tree start syntax pane)
-     (display-parse-tree realpart syntax pane)
-     (display-parse-tree imagpart syntax pane)
-     (display-parse-tree end syntax pane)))
+    (display-parse-tree start syntax pane)
+    (display-parse-tree realpart syntax pane)
+    (display-parse-tree imagpart syntax pane)
+    (display-parse-tree end syntax pane)))
 
 (defclass complex-expr (cl-entry)
   ((start :initarg :start)
@@ -418,7 +438,7 @@
 (defmethod display-parse-tree ((entity number-expr) (syntax cl-syntax) pane)
   (with-slots (content) entity
     (with-drawing-options (pane :ink +blue+)
-     (display-parse-tree content syntax pane))))
+      (display-parse-tree content syntax pane))))
 
 (defclass pathname-expr (cl-entry)
   ((start :initarg :start)
@@ -448,10 +468,8 @@
 			    (backslash default-item (and (= (end-offset start)    
 							    (start-offset backslash)) 
 							 (default-item-is backslash #\\))) 
-			    (item cl-lexeme (and (= (end-offset backslash)
-						    (start-offset item))
-						 (= (+ 1 (start-offset item)) 
-						    (end-offset item)))))
+			    (item cl-lexeme (= (end-offset backslash)
+					       (start-offset item)))) 
 			:start start :backslash backslash :item item))
 
 (defmethod display-parse-tree ((entity char-item) (syntax cl-syntax) pane)
@@ -471,8 +489,7 @@
 			:start start :items cl-terminals
 			:end end))
 
-(defmethod display-parse-tree ((entity list-expr) (syntax cl-syntax) 
-pane)
+(defmethod display-parse-tree ((entity list-expr) (syntax cl-syntax) pane)
   (with-slots (start items end) entity
     (display-parse-tree start syntax pane)
     (display-parse-tree items syntax pane)
@@ -489,12 +506,12 @@
 				       (read-expr identifier (= (end-offset read-car) (start-offset read-expr))))
 				   :read-car read-car :read-expr read-expr))
 
-						
+
 (defmethod display-parse-tree ((entity read-time-point-attr) (syntax cl-syntax) pane)
   (with-slots (read-car read-expr) entity
     (display-parse-tree read-car syntax pane)
     (display-parse-tree read-expr syntax pane)))
-							      
+
 ;;;;;;;;;;;;; read-time-evaluation
 
 (defclass read-time-evaluation (cl-entry)
@@ -505,51 +522,50 @@
 (add-cl-rule (read-time-evaluation -> ((start hex) 
 				       (item read-time-point-attr (= (end-offset start) (start-offset item))))
 				   :start start :item item))
-	     
+
 (defmethod display-parse-tree ((entity read-time-evaluation) (syntax cl-syntax) pane)
   (with-slots (start item) entity
     (display-parse-tree start syntax pane)
     (display-parse-tree item syntax pane)))
 
-;;;;;;;;;;;;;; read-time-plus-attr
 
-(defclass read-time-plus-attr (cl-entry) 
+;;;;;;;;;;;;;;;;;;;;;;; read-time-attr
+
+(defclass read-time-attr (cl-entry)
   ((read-car :initarg :read-car)
    (read-expr :initarg :read-expr)))
 
+(defmethod display-parse-tree ((entity read-time-attr) (syntax cl-syntax) pane)
+  (with-slots (read-car read-expr) entity
+    (display-parse-tree read-car syntax pane)
+    (display-parse-tree read-expr syntax pane)))
+
+
+;;;;;;;;;;;;;; read-time-plus-attr
+
+(defclass read-time-plus-attr (read-time-attr) ()) 
+
 (add-cl-rule (read-time-plus-attr -> ((read-car default-item (default-item-is read-car #\+))
 				      (read-expr read-time-expr (= (end-offset read-car) (start-offset read-expr))))
 				  :read-car read-car :read-expr
 				  read-expr))
 
-(defmethod display-parse-tree ((entity read-time-plus-attr) (syntax cl-syntax) pane)
-  (with-slots (read-car read-expr) entity
-    (display-parse-tree read-car syntax pane)
-    (display-parse-tree read-expr syntax pane)))
-
 ;;;;;;;;;;;;;; read-time-minus-attr
 
-(defclass read-time-minus-attr (cl-entry) 
-  ((read-car :initarg :read-car)
-   (read-expr :initarg :read-expr)))
+(defclass read-time-minus-attr (read-time-attr) ()) 
 
 (add-cl-rule (read-time-minus-attr -> ((read-car default-item (default-item-is read-car #\-))
 				       (read-expr read-time-expr (= (end-offset read-car) (start-offset read-expr))))
 				   :read-car read-car :read-expr
 				   read-expr))
 
-(defmethod display-parse-tree ((entity read-time-minus-attr) (syntax cl-syntax) pane)
-  (with-slots (read-car read-expr) entity
-    (display-parse-tree read-car syntax pane)
-    (display-parse-tree read-expr syntax pane)))
-
 ;;;;;;;;;;;;; read-time-expr
 
 (defclass read-time-expr (cl-entry) 
   ((time-expr :initarg :time-expr)))
 
 (add-cl-rule (read-time-expr -> (list-expr) :time-expr list-expr)) 
-                                              
+
 (add-cl-rule (read-time-expr -> (identifier) :time-expr identifier))
 
 
@@ -557,45 +573,40 @@
   (with-slots (time-expr) entity
     (display-parse-tree time-expr syntax pane)))
 
-;;;;;;;;;;;;; read-time-conditional-plus
 
-(defclass read-time-conditional-plus (cl-entry)
+;;;;;;;;;;;;;;;;;;;;;;;;;; read-time-conditional
+(defclass read-time-conditional (cl-entry)
   ((start :initarg :start)
    (test :initarg :test)
    (expr :initarg :expr)))
 
-(add-cl-rule (read-time-conditional-plus -> ((start hex) 
-					     (test read-time-plus-attr (= (end-offset start) (start-offset test)))
-					     (expr cl-terminal (/= (end-offset test) (start-offset expr))))
-					 :start start
-					 :test test
-					 :expr expr))
 
-(defmethod display-parse-tree ((entity read-time-conditional-plus) (syntax cl-syntax) pane)
+(defmethod display-parse-tree ((entity read-time-conditional) (syntax cl-syntax) pane)
   (with-slots (start test expr) entity
     (display-parse-tree start syntax pane)
     (display-parse-tree test syntax pane)
     (display-parse-tree expr syntax pane)))
 
+
+;;;;;;;;;;;;; read-time-conditional-plus
+
+(defclass read-time-conditional-plus (read-time-conditional) ())
+  
+
+(add-cl-rule (read-time-conditional-plus -> ((start hex) 
+					     (test read-time-plus-attr (= (end-offset start) (start-offset test)))
+					     (expr cl-terminal (/= (end-offset test) (start-offset expr))))
+					 :start start :test test :expr expr))
+
 ;;;;;;;;;;;;; read-time-conditional-minus
 
-(defclass read-time-conditional-minus (cl-entry)
-  ((start :initarg :start)
-   (test :initarg :test)
-   (expr :initarg :expr)))
+(defclass read-time-conditional-minus (read-time-conditional) ())
 
 (add-cl-rule (read-time-conditional-minus -> ((start hex) 
 					      (test read-time-minus-attr (= (end-offset start) (start-offset test)))
 					      (expr cl-terminal (/= (end-offset test) (start-offset expr))))
 					  :start start :test test :expr expr))
 
-(defmethod display-parse-tree ((entity read-time-conditional-minus) (syntax cl-syntax) pane)
-  (with-slots (start test expr) entity
-    (display-parse-tree start syntax pane)
-    (display-parse-tree test syntax pane)
-    (display-parse-tree expr syntax pane)))
-
-
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;function-expression
 
 (defclass fun-expr (cl-entry) 
@@ -643,7 +654,7 @@
 
 (define-list bit-items empty-bit-items nonempty-bit-items bit-item)
 
-(defclass bitvect-expr (cl-nonterminal);FIXME
+(defclass bitvect-expr (cl-nonterminal)
   ((start :initarg :start)
    (asterisk :initarg :asterisk)
    (items :initarg :items)))
@@ -651,16 +662,16 @@
 (add-cl-rule (bitvect-expr -> ((start hex)
 			       (asterisk default-item (and (= (end-offset start)    
 							      (start-offset asterisk)) 
-							   (default-item-is asterisk "*"))) 
+							   (default-item-is asterisk #\*))) 
 			       (items bit-items))
 			   :start start :asterisk asterisk :items items))
 
 (defmethod display-parse-tree ((entity bitvect-expr) (syntax cl-syntax) pane)
   (with-slots (start asterisk items) entity
     (with-drawing-options (pane :ink +brown+)
-    (display-parse-tree start syntax pane)
-    (display-parse-tree asterisk syntax pane)
-    (display-parse-tree items syntax pane))))
+      (display-parse-tree start syntax pane)
+      (display-parse-tree asterisk syntax pane)
+      (display-parse-tree items syntax pane))))
 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Quote expr
@@ -768,16 +779,16 @@
 (defmethod initialize-instance :after ((syntax cl-syntax) &rest args)
   (declare (ignore args))
   (with-slots (parser lexer buffer) syntax
-     (setf parser (make-instance 'parser
-		     :grammar *cl-grammar*
-		     :target 'cl-terminals))
-     (setf lexer (make-instance 'cl-lexer :buffer (buffer syntax)))
-     (let ((m (clone-mark (low-mark buffer) :left))
+    (setf parser (make-instance 'parser
+				:grammar *cl-grammar*
+				:target 'cl-terminals))
+    (setf lexer (make-instance 'cl-lexer :buffer (buffer syntax)))
+    (let ((m (clone-mark (low-mark buffer) :left))
 	   (lexeme (make-instance 'start-lexeme :state (initial-state parser))))
-       (setf (offset m) 0)
-       (setf (start-offset lexeme) m
-	     (end-offset lexeme) 0)
-       (insert-lexeme lexer 0 lexeme))))
+      (setf (offset m) 0)
+      (setf (start-offset lexeme) m
+	    (end-offset lexeme) 0)
+      (insert-lexeme lexer 0 lexeme))))
 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -791,8 +802,8 @@
        while (mark<= (end-offset (lexeme lexer valid-parse)) bot)
        do (let ((current-token (lexeme lexer (1- valid-parse)))
 		(next-lexeme (lexeme lexer valid-parse)))
-		(setf (slot-value next-lexeme 'state)
-		      (advance-parse parser (list next-lexeme) (slot-value current-token 'state))))
+	    (setf (slot-value next-lexeme 'state)
+		  (advance-parse parser (list next-lexeme) (slot-value current-token 'state))))
 	 (incf valid-parse))))
 
 (defmethod inter-lexeme-object-p ((lexer cl-lexer) object)
@@ -821,23 +832,23 @@
   (let ((space-width (space-width pane))
 	(tab-width (tab-width pane)))
     (loop while (< start end)
-	  do (ecase (buffer-object buffer start)
-	       (#\Newline (terpri pane)
-			  (setf (aref *cursor-positions* (incf *current-line*))
-				(multiple-value-bind (x y) (stream-cursor-position pane)
-				  (declare (ignore x))
-				  y)))
-	       (#\Space (stream-increment-cursor-position
-			 pane space-width 0))
-	       (#\Tab (let ((x (stream-cursor-position pane)))
-			(stream-increment-cursor-position
-			 pane (- tab-width (mod x tab-width)) 0))))
+       do (ecase (buffer-object buffer start)
+	    (#\Newline (terpri pane)
+		       (setf (aref *cursor-positions* (incf *current-line*))
+			     (multiple-value-bind (x y) (stream-cursor-position pane)
+			       (declare (ignore x))
+			       y)))
+	    (#\Space (stream-increment-cursor-position
+		      pane space-width 0))
+	    (#\Tab (let ((x (stream-cursor-position pane)))
+		     (stream-increment-cursor-position
+		      pane (- tab-width (mod x tab-width)) 0))))
 	 (incf start))))		    
 
 (defmethod display-parse-tree :around ((entity cl-parse-tree) syntax pane)
   (with-slots (top bot) pane
-     (when (and (end-offset entity) (mark> (end-offset entity) top))
-       (call-next-method))))
+    (when (and (end-offset entity) (mark> (end-offset entity) top))
+      (call-next-method))))
 
 (defmethod display-parse-tree ((entity cl-entry) (syntax cl-syntax) pane)
   (flet ((cache-test (t1 t2)
@@ -850,15 +861,15 @@
 			   :id-test #'eq
 			   :cache-value entity
 			   :cache-test #'cache-test)
-      (with-slots (ink face) entity
-	 (setf ink (medium-ink (sheet-medium pane))
-	       face (text-style-face (medium-text-style (sheet-medium pane))))
-	 (present (coerce (buffer-sequence (buffer syntax)
-					   (start-offset entity)
-					   (end-offset entity))
-			  'string)
-		  'string
-		  :stream pane)))))
+		     (with-slots (ink face) entity
+		       (setf ink (medium-ink (sheet-medium pane))
+			     face (text-style-face (medium-text-style (sheet-medium pane))))
+		       (present (coerce (buffer-sequence (buffer syntax)
+							 (start-offset entity)
+							 (end-offset entity))
+					'string)
+				'string
+				:stream pane)))))
 
 (defmethod display-parse-tree :before ((entity cl-entry) (syntax cl-syntax) pane)
   (handle-whitespace pane (buffer pane) *white-space-start* (start-offset entity))
@@ -871,7 +882,7 @@
     (unless (null next)
       (display-parse-stack (parse-stack-symbol next) next syntax pane))
     (loop for parse-tree in (reverse (parse-stack-parse-trees stack))
-	  do (display-parse-tree parse-tree syntax pane)))) 
+       do (display-parse-tree parse-tree syntax pane)))) 
 
 (defun display-parse-state (state syntax pane)
   (let ((top (parse-stack-top state)))
@@ -879,7 +890,7 @@
 	(display-parse-stack (parse-stack-symbol top) top syntax pane)
 	(display-parse-tree (target-parse-tree state) syntax pane))))
 
-		    
+
 (defmethod redisplay-pane-with-syntax ((pane climacs-pane) (syntax cl-syntax) current-p)
   (with-slots (top bot) pane
     (setf *cursor-positions* (make-array (1+ (number-of-lines-in-region top bot)))
@@ -890,32 +901,32 @@
 				     1.0)))
 	;; find the last token before bot
 	(let ((end-token-index (max (floor (/ (offset bot) average-token-size)) 1)))
-	    ;; go back to a token before bot
+	  ;; go back to a token before bot
 	  (loop until (mark<= (end-offset (lexeme lexer (1- end-token-index))) bot)
 	     do (decf end-token-index))
 	  ;; go forward to the last token before bot
 	  (loop until (or (= end-token-index (nb-lexemes lexer))
 			  (mark> (start-offset (lexeme lexer end-token-index)) bot))
 	     do (incf end-token-index))
-	    (let ((start-token-index end-token-index))
-	      ;; go back to the first token after top, or until the previous token
-	      ;; contains a valid parser state
-	      (loop until (or (mark<= (end-offset (lexeme lexer (1- start-token-index))) top)
-			      (not (parse-state-empty-p 
-				    (slot-value (lexeme lexer (1- start-token-index)) 'state))))
+	  (let ((start-token-index end-token-index))
+	    ;; go back to the first token after top, or until the previous token
+	    ;; contains a valid parser state
+	    (loop until (or (mark<= (end-offset (lexeme lexer (1- start-token-index))) top)
+			    (not (parse-state-empty-p 
+				  (slot-value (lexeme lexer (1- start-token-index)) 'state))))
 		 do (decf start-token-index))
-	      (let ((*white-space-start* (offset top)))
-		;; display the parse tree if any
-		(unless (parse-state-empty-p (slot-value (lexeme lexer (1- start-token-index)) 'state))
-		  (display-parse-state (slot-value (lexeme lexer (1- start-token-index)) 'state)
-				       syntax
-				       pane))
-		;; display the lexemes
-		(with-drawing-options (pane :ink +red+)
-		  (loop while (< start-token-index end-token-index)
-			do (let ((token (lexeme lexer start-token-index)))
-			     (display-parse-tree token syntax pane))
-		       (incf start-token-index))))))))
+	    (let ((*white-space-start* (offset top)))
+	      ;; display the parse tree if any
+	      (unless (parse-state-empty-p (slot-value (lexeme lexer (1- start-token-index)) 'state))
+		(display-parse-state (slot-value (lexeme lexer (1- start-token-index)) 'state)
+				     syntax
+				     pane))
+	      ;; display the lexemes
+	      (with-drawing-options (pane :ink +red+)
+		(loop while (< start-token-index end-token-index)
+		   do (let ((token (lexeme lexer start-token-index)))
+			(display-parse-tree token syntax pane))
+		     (incf start-token-index))))))))
     (let* ((cursor-line (number-of-lines-in-region top (point pane)))
 	   (height (text-style-height (medium-text-style pane) pane))
 	   (cursor-y (+ (* cursor-line (+ height (stream-vertical-spacing pane)))))




More information about the Climacs-cvs mailing list