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

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

[elpa] externals/parser-generator f23bc217d8 30/82: More wrestling


From: Christian Johansson
Subject: [elpa] externals/parser-generator f23bc217d8 30/82: More wrestling
Date: Thu, 12 May 2022 13:28:15 -0400 (EDT)

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

    More wrestling
---
 parser-generator-ll.el           | 12 ++++++++----
 parser-generator.el              | 30 ++++++++++++++++++++----------
 test/parser-generator-ll-test.el |  2 +-
 3 files changed, 29 insertions(+), 15 deletions(-)

diff --git a/parser-generator-ll.el b/parser-generator-ll.el
index 82f4e383f7..95816fd0d7 100644
--- a/parser-generator-ll.el
+++ b/parser-generator-ll.el
@@ -91,21 +91,24 @@
            look-aheads
            (parser-generator--merge-max-terminal-sets
             first-rhs
-            nil)))
+            nil
+            t)))
          ((and first-parent-follow
                (not first-rhs))
           (setq
            look-aheads
            (parser-generator--merge-max-terminal-sets
             nil
-            first-parent-follow)))
+            first-parent-follow
+            t)))
          ((and first-rhs
                first-parent-follow)
           (setq
            look-aheads
            (parser-generator--merge-max-terminal-sets
             first-rhs
-            first-parent-follow)))
+            first-parent-follow
+            t)))
          (t (error
              "Unexpected empty FIRST for production: %S and parent-follow: %S"
              production
@@ -409,7 +412,8 @@
                       (let ((merged-terminal-sets
                              (parser-generator--merge-max-terminal-sets
                               first-sub-symbol-rhs
-                              first-local-follow-sets)))
+                              first-local-follow-sets
+                              t)))
                         (parser-generator--debug
                          (message "sub-symbol-rhs: %S" sub-symbol-rhs)
                          (message "first-sub-symbol-rhs: %S" 
first-sub-symbol-rhs)
diff --git a/parser-generator.el b/parser-generator.el
index 602391eb10..05e637536f 100644
--- a/parser-generator.el
+++ b/parser-generator.el
@@ -1238,8 +1238,8 @@
          look-ahead)))
     (nreverse look-ahead)))
 
-(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."
+(defun parser-generator--merge-max-terminal-sets (a b &optional 
abort-on-e-identifier)
+  "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, optionally ABORT-ON-E-IDENTIFIER."
   (let ((a-length (length a))
         (a-index 0)
         (b-length (length b))
@@ -1255,7 +1255,8 @@
                   ((merged-element
                     (parser-generator--merge-max-terminals
                      a-element
-                     b-element)))
+                     b-element
+                     abort-on-e-identifier)))
                 (if merged-lists
                     (setq
                      merged-lists
@@ -1274,7 +1275,8 @@
               ((merged-element
                 (parser-generator--merge-max-terminals
                  a-element
-                 nil)))
+                 nil
+                 abort-on-e-identifier)))
             (if merged-lists
                 (setq
                  merged-lists
@@ -1294,7 +1296,8 @@
                 ((merged-element
                   (parser-generator--merge-max-terminals
                    nil
-                   b-element)))
+                   b-element
+                   abort-on-e-identifier)))
               (if merged-lists
                   (setq
                    merged-lists
@@ -1317,8 +1320,8 @@
     merged-lists))
 
 ;; Lemma 5.1 p. 348
-(defun parser-generator--merge-max-terminals (a b)
-  "Calculate L1 (+) L2 which is a merge of all terminals in A and B but with 
exactly length of the set look-ahead number."
+(defun parser-generator--merge-max-terminals (a b &optional 
abort-on-e-identifier)
+  "Calculate L1 (+) L2 which is a merge of all terminals in A and B but with 
exactly length of the set look-ahead number, optionally ABORT-ON-E-IDENTIFIER."
   (let ((k (max 1 parser-generator--look-ahead-number))
         (merged)
         (merge-count 0)
@@ -1327,20 +1330,27 @@
         (a-length (length a))
         (b-element)
         (b-index 0)
-        (b-length (length b)))
+        (b-length (length b))
+        (continue t))
     (while (and
+            continue
             (< a-index a-length)
             (< merge-count k))
       (setq a-element (nth a-index a))
-      (unless (parser-generator--valid-e-p a-element)
+      (if (parser-generator--valid-e-p a-element)
+          (when abort-on-e-identifier
+            (setq continue nil))
         (push a-element merged)
         (setq merge-count (1+ merge-count)))
       (setq a-index (1+ a-index)))
     (while (and
+            continue
             (< b-index b-length)
             (< merge-count k))
       (setq b-element (nth b-index b))
-      (unless (parser-generator--valid-e-p b-element)
+      (if (parser-generator--valid-e-p b-element)
+          (when abort-on-e-identifier
+            (setq continue nil))
         (push b-element merged)
         (setq merge-count (1+ merge-count)))
       (setq b-index (1+ b-index)))
diff --git a/test/parser-generator-ll-test.el b/test/parser-generator-ll-test.el
index 6f103ef8f8..e1f88745f9 100644
--- a/test/parser-generator-ll-test.el
+++ b/test/parser-generator-ll-test.el
@@ -33,7 +33,7 @@
    )
   (parser-generator-process-grammar)
   (let ((tables (parser-generator-ll--generate-tables)))
-    (message "tables: %S" tables)
+    (message "tables 1: %S" tables)
     (should
      (equal
       tables



reply via email to

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