emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/parser-generator 59aea4d 077/434: More tweaking new alg


From: ELPA Syncer
Subject: [elpa] externals/parser-generator 59aea4d 077/434: More tweaking new algorithm
Date: Mon, 29 Nov 2021 15:59:12 -0500 (EST)

branch: externals/parser-generator
commit 59aea4d7aaba2e9cb1293b18aba82e52de3d1308
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>

    More tweaking new algorithm
---
 parser.el           | 14 ++++++++------
 test/parser-test.el |  2 +-
 2 files changed, 9 insertions(+), 7 deletions(-)

diff --git a/parser.el b/parser.el
index 7dab2dc..d17d072 100644
--- a/parser.el
+++ b/parser.el
@@ -653,8 +653,8 @@
     follow-set))
 
 ;; Algorithm 5.9, p. 389
-(defun parser--lr-items-for-grammar ()
-  "Calculate set of valid LR(k) items for grammar."
+(defun parser--lr-items-for-grammar (length)
+  "Calculate set of valid LR(k) items for grammar with LENGTH."
   (let ((prefixes)
         (marked-prefixes (make-hash-table :test 'equal))
         (lr-items)
@@ -662,14 +662,16 @@
 
     (let ((e-set (parser--lr-items-for-prefix parser--e-identifier)))
       ;;(1) Place V(e) in S. The set V(e) is initially unmarked.
-      (push e-set lr-items)
+      (setq lr-items (append lr-items e-set))
       (push `(,parser--e-identifier) prefixes))
 
     ;; (3) Repeat step (2) until all sets of items in S are marked.
     (let ((prefix))
 
       ;; (2) If a set of items a in S is unmarked
-      (while prefixes
+      (while (and prefixes
+                  (> length 0))
+        (setq length (1- length))
 
         ;; (2) Mark a by computing for each X in N u E, GOTO (a, X). 
(Algorithm 5.8 can be used here.)
         (setq prefix (pop prefixes))
@@ -698,11 +700,11 @@
                 ;; If a' = GOTO(a, X) is nonempty
                 (when prefix-lr-items
 
-                  (message "Added to stack.")
+                  (message "viable-prefix: %s" alternative-prefix)
 
                   ;; then add a' to S as an unmarked set of items
                   (push alternative-prefix prefixes)
-                  (push prefix-lr-items lr-items))))))))
+                  (setq lr-items (append lr-items prefix-lr-items)))))))))
 
     lr-items))
 
diff --git a/test/parser-test.el b/test/parser-test.el
index 9ca16d3..8d0b0b6 100644
--- a/test/parser-test.el
+++ b/test/parser-test.el
@@ -238,7 +238,7 @@
       (S nil nil (a))
       (S nil nil (e))
       (Sp nil (S) (e)))
-    (parser--lr-items-for-grammar)))
+    (parser--lr-items-for-grammar 8)))
   (message "Passed LR-items for example 5.30")
 
   (message "Passed tests for (parser--lr-items-for-grammar)"))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]