[mcclim-cvs] CVS mcclim/Drei

thenriksen thenriksen at common-lisp.net
Tue Nov 21 23:28:07 UTC 2006


Update of /project/mcclim/cvsroot/mcclim/Drei
In directory clnet:/tmp/cvs-serv15276/Drei

Modified Files:
	lisp-syntax.lisp 
Log Message:
The Drei accept method for expressions seriously stresses the Lisp
syntax, and requires very consistent representation of
incomplete/complete tokens. This patch is a start, but there are still
tokens that need to be handled (and since the code is very repetitive,
a generator macro should probably also be written). I don't really
have the theoretical knowledge to work very much with parsers, so my
solutions might not be as elegant as possible.


--- /project/mcclim/cvsroot/mcclim/Drei/lisp-syntax.lisp	2006/11/11 00:08:30	1.4
+++ /project/mcclim/cvsroot/mcclim/Drei/lisp-syntax.lisp	2006/11/21 23:28:07	1.5
@@ -1006,7 +1006,7 @@
 (define-parser-state |' form | (lexer-toplevel-state parser-state) ())
 
 (define-new-lisp-state (form-may-follow quote-lexeme) |' |)
-(define-new-lisp-state (|' | form) |' form |)
+(define-new-lisp-state (|' | complete-form-mixin) |' form |)
 (define-new-lisp-state (|' | comment) |' |)
 (define-new-lisp-state (|' | unmatched-right-parenthesis-lexeme) |( form* ) |)
 
@@ -1032,7 +1032,7 @@
 (define-parser-state |` form | (lexer-toplevel-state parser-state) ())
 
 (define-new-lisp-state (form-may-follow backquote-lexeme) |` |)
-(define-new-lisp-state (|` | form) |` form |)
+(define-new-lisp-state (|` | complete-form-mixin) |` form |)
 (define-new-lisp-state (|` | comment) |` |)
 (define-new-lisp-state (|` | unmatched-right-parenthesis-lexeme) |( form* ) |)
 
@@ -1083,17 +1083,23 @@
 
 ;;; parse trees
 (defclass function-form (form) ())
+(defclass complete-function-form (form complete-form-mixin) ())
+(defclass incomplete-function-form (form incomplete-form-mixin) ())
 
 (define-parser-state |#' | (form-may-follow) ())
 (define-parser-state |#' form | (lexer-toplevel-state parser-state) ())
 
 (define-new-lisp-state (form-may-follow function-lexeme) |#' |)
-(define-new-lisp-state (|#' | form) |#' form |)
+(define-new-lisp-state (|#' | complete-form-mixin) |#' form |)
 (define-new-lisp-state (|#' | comment) |#' |)
 
 ;;; reduce according to the rule form -> #' form
 (define-lisp-action (|#' form | t)
-  (reduce-until-type function-form function-lexeme))
+  (reduce-until-type complete-function-form function-lexeme))
+(define-lisp-action (|#' | unmatched-right-parenthesis-lexeme)
+  (reduce-until-type incomplete-function-form function-lexeme))
+(define-lisp-action (|#' | (eql nil))
+  (reduce-until-type incomplete-function-form function-lexeme))
 
 ;;;;;;;;;;;;;;;; Reader conditionals
 
@@ -1219,17 +1225,21 @@
 
 ;;; parse trees
 (defclass pathname-form (form) ())
+(defclass complete-pathname-form (pathname-form complete-form-mixin) ())
+(defclass incomplete-pathname-form (pathname-form incomplete-form-mixin) ())
 
 (define-parser-state |#P | (form-may-follow) ())
 (define-parser-state |#P form | (lexer-toplevel-state parser-state) ())
 
 (define-new-lisp-state (form-may-follow pathname-start-lexeme) |#P |)
-(define-new-lisp-state (|#P | form) |#P form |)
+(define-new-lisp-state (|#P | complete-form-mixin) |#P form |)
 (define-new-lisp-state (|#P | comment) |#P |)
 
 ;;; reduce according to the rule form -> #P form
 (define-lisp-action (|#P form | t)
-  (reduce-until-type pathname-form pathname-start-lexeme))
+  (reduce-until-type complete-pathname-form pathname-start-lexeme))
+(define-lisp-action (|#P | (eql nil))
+  (reduce-until-type incomplete-pathname-form pathname-start-lexeme))
 
 ;;;;;;;;;;;;;;;; undefined reader macro
 
@@ -2606,6 +2616,26 @@
 (defmethod token-to-object ((syntax lisp-syntax) (token literal-object-lexeme) &key &allow-other-keys)
   (object-after (start-mark token)))
 
+(defmethod token-to-object ((syntax lisp-syntax) (token pathname-form) &key &allow-other-keys)
+  (read-from-string (token-string syntax token)))
+
+(defmethod token-to-object ((syntax lisp-syntax) (token incomplete-pathname-form) &rest args &key read &allow-other-keys)
+  (if read
+      ;; Will cause a reader error (which is what we want).
+      (call-next-method)
+      ;; Try to create a pathname as much as possible.
+      (let ((pathspec-token (second (children token))))
+        (pathname (if pathspec-token
+                      (apply #'token-to-object syntax pathspec-token
+                             ;; Since `pathspec-token' will be
+                             ;; incomplete, `read'ing from it is
+                             ;; probably bad.
+                             :read nil args)
+                      "")))))
+
+(defmethod token-to-object ((syntax lisp-syntax) (token complete-function-form) &rest args &key &allow-other-keys)
+  (fdefinition (apply #'token-to-object syntax (second (children token)) args)))
+
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;
 ;;; Arglist fetching.
@@ -2693,6 +2723,9 @@
 (defmethod indent-form ((syntax lisp-syntax) (tree long-comment-form) path)
   (values tree 0))
 
+(defmethod indent-form ((syntax lisp-syntax) (tree pathname-form) path)
+  (values tree 0))
+
 (defmethod indent-form ((syntax lisp-syntax) (tree quote-form) path)
   (indent-list syntax (elt-noncomment (children tree) (car path)) (cdr path)))
 




More information about the Mcclim-cvs mailing list