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

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

[elpa] externals/parser-generator 38223d3 206/434: Passed tests for gene


From: ELPA Syncer
Subject: [elpa] externals/parser-generator 38223d3 206/434: Passed tests for generating grammar prefixes
Date: Mon, 29 Nov 2021 15:59:42 -0500 (EST)

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

    Passed tests for generating grammar prefixes
---
 parser-generator.el           | 54 ++++++++++++++++++++++++++++++++-----------
 test/parser-generator-test.el | 10 ++++++++
 2 files changed, 50 insertions(+), 14 deletions(-)

diff --git a/parser-generator.el b/parser-generator.el
index 3361101..9a95db5 100644
--- a/parser-generator.el
+++ b/parser-generator.el
@@ -172,7 +172,8 @@
         (index)
         (prefix)
         (stack)
-        (increment-index 0))
+        (increment-index)
+        (include))
     (let ((symbols-length (length symbols))
           (i 0))
 
@@ -181,7 +182,6 @@
         (puthash i 0 indexes)
         (push 0 index)
         (setq i (1+ i)))
-      (setq stack (list index))
 
       ;; Build stack of all indexes that needs to be processed
       (let ((index-remains t))
@@ -189,26 +189,52 @@
 
           (setq i 0)
           (setq prefix nil)
+          (setq include t)
           (while (< i k)
             (setq index (gethash i indexes))
 
-            (when (= i increment-index)
-              (if (and
-                   (= index (1- symbols-length))
-                   (= increment-index (1- k)))
-                  (setq index-remains nil)
-                (if (= index (1- symbols-length))
+            (when increment-index
+              (when (= i increment-index)
+                (if (and
+                     (= index (1- symbols-length))
+                     (= increment-index (1- k)))
                     (progn
-                      (setq index 0)
-                      (setq increment-index (1+ increment-index)))
-                  (setq index (1+ index)))
-                (puthash i index indexes)))
+
+                      ;; Iterate columns and see if any is less than
+                      ;; max index, in that case increment it and re-do
+                      ;; last column
+                      (let ((found-not-incremented)
+                            (i-2 0))
+                        (while (and
+                                (< i-2 (1- k))
+                                (not found-not-incremented))
+                          (unless (= (gethash i-2 indexes) (1- symbols-length))
+                            (puthash i-2 (1+ (gethash i-2 indexes)) indexes)
+                            (puthash i -1 indexes)
+                            (setq include nil)
+                            (setq found-not-incremented t))
+                          (setq i-2 (1+ i-2)))
+
+                        (unless found-not-incremented
+                          (setq index-remains nil))))
+                  (if (= index (1- symbols-length))
+                      (progn
+                        (setq index 0)
+                        (setq increment-index (1+ increment-index)))
+                    (setq index (1+ index)))
+                  (puthash i index indexes))))
 
             (when index-remains
               (push index prefix))
             (setq i (1+ i)))
 
-          (when index-remains
+          (unless increment-index
+            (setq increment-index (1- k)))
+
+          (when (and
+                 index-remains
+                 include)
+            (setq prefix (nreverse prefix))
             (push prefix stack))
           ))
 
@@ -225,7 +251,7 @@
             (setq i (1+ i)))
 
           (push prefix prefixes))))
-      (sort prefixes 'parser-generator--sort-list)))
+    (sort prefixes 'parser-generator--sort-list)))
 
 (defun parser-generator--get-grammar-production-number (production)
   "If PRODUCTION exist, return it's number."
diff --git a/test/parser-generator-test.el b/test/parser-generator-test.el
index fb59ec9..c6647f5 100644
--- a/test/parser-generator-test.el
+++ b/test/parser-generator-test.el
@@ -707,6 +707,16 @@
     '((A) (B) (S) ("a") ("b"))
     (parser-generator--get-grammar-prefixes)))
 
+  (parser-generator-set-look-ahead-number 2)
+  (should
+   (equal
+    '((A A) (A B) (A S) (A "a") (A "b")
+      (B A) (B B) (B S) (B "a") (B "b")
+      (S A) (S B) (S S) (S "a") (S "b")
+      ("a" A) ("a" B) ("a" S) ("a" "a") ("a" "b")
+      ("b" A) ("b" B) ("b" S) ("b" "a") ("b" "b"))
+    (parser-generator--get-grammar-prefixes)))
+
   (message "Passed tests  for (parser-generator--get-grammar-prefixes)"))
 
 (defun parser-generator-test ()



reply via email to

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