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

Robert Strandh rstrandh at common-lisp.net
Wed Mar 2 05:21:08 UTC 2005


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

Modified Files:
	syntax.lisp 
Log Message:
A parser state now stores its parser instead of just the grammar of
the parser so that we can get to the initial state and the target of
the parser from a given state.

Added functions for analysing parse stack.

Date: Wed Mar  2 06:21:08 2005
Author: rstrandh

Index: climacs/syntax.lisp
diff -u climacs/syntax.lisp:1.31 climacs/syntax.lisp:1.32
--- climacs/syntax.lisp:1.31	Wed Mar  2 05:07:26 2005
+++ climacs/syntax.lisp	Wed Mar  2 06:21:07 2005
@@ -135,10 +135,9 @@
 ;;; parser
 
 (defclass parser ()
-  ((grammar :initarg :grammar)
+  ((grammar :initarg :grammar :reader parser-grammar)
    (target :initarg :target :reader target)
-   (initial-state :reader initial-state)
-   (lexer :initarg :lexer)))
+   (initial-state :reader initial-state)))
 
 (defclass rule-item () ())
 
@@ -202,7 +201,7 @@
   nil)
 
 (defclass parser-state ()
-  ((grammar :initarg :grammar :reader state-grammar)
+  ((parser :initarg :parser :reader parser)
    (incomplete-items :initform (make-hash-table :test #'eq)
 		     :reader incomplete-items)
    (parse-trees :initform (make-hash-table :test #'eq)
@@ -245,7 +244,7 @@
 	  nil)
  	(t
  	 (push item (gethash orig-state (incomplete-items to-state)))
- 	 (loop for rule in (rules (state-grammar to-state))
+ 	 (loop for rule in (rules (parser-grammar (parser to-state)))
  	       do (when (let ((sym1 (aref (symbols (rule item)) (dot-position item)))
 			      (sym2 (left-hand-side rule)))
 			  (or (subtypep sym1 sym2) (subtypep sym2 sym1)))
@@ -269,7 +268,7 @@
 (defmethod initialize-instance :after ((parser parser) &rest args)
   (declare (ignore args))
   (with-slots (grammar initial-state) parser
-     (setf initial-state (make-instance 'parser-state :grammar grammar))
+     (setf initial-state (make-instance 'parser-state :parser parser))
      (loop for rule in (rules grammar)
 	   do (when (let ((sym (left-hand-side rule)))
 		      (or (subtypep (target parser) sym)
@@ -286,12 +285,44 @@
 			     initial-state initial-state)))))
 
 (defun advance-parse (parser tokens state)
-  (with-slots (grammar) parser
-     (let ((new-state (make-instance 'parser-state :grammar grammar)))
-       (loop for token in tokens 
-	     do (potentially-handle-parse-tree token state new-state))
-       new-state)))
-
-(defclass lexer () ())
-
-(defgeneric lex (lexer))
+  (let ((new-state (make-instance 'parser-state :parser parser)))
+    (loop for token in tokens 
+	  do (potentially-handle-parse-tree token state new-state))
+    new-state))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;
+;;; Code for analysing parse stack
+
+(defun parse-stack-top (state)
+  "given a parse state, return a list of all incomplete items that did
+not originate in that state, or if no such items exist, a list of all
+parse trees of state that originated in the initial state."
+  (let ((items '()))
+    (map-over-incomplete-items
+     state
+     (lambda (key item)
+       (unless (eq key state)
+	 (push item items))))
+    (unless items
+      (loop with target = (target (parser state))
+	    for parse-tree in (gethash (initial-state (parser state))
+				       (parse-trees state))
+	    when (subtypep parse-tree target)
+	      do (push parse-tree items)))
+    items))	    
+
+(defun parse-stack-next (incomplete-item)
+  "given an incomplete item, return a list of all incomplete items it
+could have been predicted from."
+  (let ((items '())
+	(orig-state (orig-state incomplete-item))
+	(sym1 (left-hand-side (rule incomplete-item))))
+    (map-over-incomplete-items
+     orig-state
+     (lambda (key item)
+       (unless (eq key orig-state)
+	 (when (let ((sym2 (aref (symbols (rule item)) (dot-position item))))
+		 (or (subtypep sym1 sym2) (subtypep sym2 sym1)))
+	   (push item items)))))
+    items))




More information about the Climacs-cvs mailing list