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

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

[elpa] externals/parser-generator 878b2900f2 05/82: Improved calculation


From: Christian Johansson
Subject: [elpa] externals/parser-generator 878b2900f2 05/82: Improved calculation of merged max terminals when one of the set is undefined
Date: Thu, 12 May 2022 13:28:12 -0400 (EDT)

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

    Improved calculation of merged max terminals when one of the set is 
undefined
---
 parser-generator-ll.el |  6 +++---
 parser-generator.el    | 56 +++++++++++++++++++++++++++++++++++++++++---------
 2 files changed, 49 insertions(+), 13 deletions(-)

diff --git a/parser-generator-ll.el b/parser-generator-ll.el
index bdbc0ca76a..219a1424ae 100644
--- a/parser-generator-ll.el
+++ b/parser-generator-ll.el
@@ -64,14 +64,14 @@
                (not first-dot-look-ahead))
           (setq
            look-aheads
-           (parser-generator--merge-max-terminals
+           (parser-generator--merge-max-terminal-sets
             first-production
             nil)))
          ((and first-dot-look-ahead
                (not first-production))
           (setq
            look-aheads
-           (parser-generator--merge-max-terminals
+           (parser-generator--merge-max-terminal-sets
             nil
             first-dot-look-ahead)))
          ((and first-production
@@ -80,7 +80,7 @@
            look-aheads
            (parser-generator--merge-max-terminal-sets
             first-production
-            first-dot-look-ahead))))
+            first-dot-look-ahead)))
          (t (error
              "Unexpected empty FIRST for production: %S and dot-look-ahead: %S"
              production
diff --git a/parser-generator.el b/parser-generator.el
index 5cf4d9374f..c8cb20166a 100644
--- a/parser-generator.el
+++ b/parser-generator.el
@@ -1232,20 +1232,57 @@
 
 (defun parser-generator--merge-max-terminal-sets (a b)
   "Calculate list of all lists of L1 (+) L2 which is a merge of all terminals 
in lists A combined with all terminals in lists B but with maximum length of 
the set look-ahead number."
-  (let ((a-length
-         (length a))
+  (let ((a-length (length a))
         (a-index 0)
-        (b-length
-         (length b))
+        (b-length (length b))
         (merged-lists))
-    (while (< a-index a-length)
-      (let ((a-element (nth a-index a))
-            (b-index 0))
+    (cond
+     ((and a b)
+      (while (< a-index a-length)
+        (let ((a-element (nth a-index a))
+              (b-index 0))
+          (while (< b-index b-length)
+            (let ((b-element (nth b-index b)))
+              (let ((merged-element
+                     (parser-generator--merge-max-terminals
+                      a-element
+                      b-element)))
+                (if merged-lists
+                    (setq
+                     merged-lists
+                     (append
+                      merged-lists
+                      (list merged-element)))
+                  (setq
+                   merged-lists
+                   (list merged-element)))))
+            (setq b-index (1+ b-index)))
+          (setq a-index (1+ a-index)))))
+     (a
+      (while (< a-index a-length)
+        (let ((a-element (nth a-index a)))
+          (let ((merged-element
+                 (parser-generator--merge-max-terminals
+                  a-element
+                  nil)))
+            (if merged-lists
+                (setq
+                 merged-lists
+                 (append
+                  merged-lists
+                  (list merged-element)))
+              (setq
+               merged-lists
+               (list merged-element)))))
+        (setq a-index (1+ a-index))))
+
+     (b
+      (let ((b-index 0))
         (while (< b-index b-length)
           (let ((b-element (nth b-index b)))
             (let ((merged-element
                    (parser-generator--merge-max-terminals
-                    a-element
+                    nil
                     b-element)))
               (if merged-lists
                   (setq
@@ -1256,8 +1293,7 @@
                 (setq
                  merged-lists
                  (list merged-element)))))
-          (setq b-index (1+ b-index)))
-        (setq a-index (1+ a-index))))
+          (setq b-index (1+ b-index))))))
     (setq
      merged-lists
      (parser-generator--distinct



reply via email to

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