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

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

[elpa] externals/parser-generator 18d7c63 195/434: Added new function to


From: ELPA Syncer
Subject: [elpa] externals/parser-generator 18d7c63 195/434: Added new function to merge lists of terminals
Date: Mon, 29 Nov 2021 15:59:39 -0500 (EST)

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

    Added new function to merge lists of terminals
---
 parser-generator.el           | 38 ++++++++++++++++++++++++++++++++++++--
 test/parser-generator-test.el | 23 +++++++++++++++++++++++
 2 files changed, 59 insertions(+), 2 deletions(-)

diff --git a/parser-generator.el b/parser-generator.el
index 25c0e4d..a712d56 100644
--- a/parser-generator.el
+++ b/parser-generator.el
@@ -11,7 +11,7 @@
 
 
 (defvar parser-generator--debug
-  nil
+  t
   "Whether to print debug messages or not.")
 
 (defvar parser-generator--e-identifier
@@ -708,6 +708,37 @@
     (parser-generator--debug
      (message "Generated F-sets"))))
 
+(defun parser-generator--merge-max-terminals (a b k)
+  "Merge terminals from A and B to a maximum length of K."
+  (let ((merged)
+        (merge-count 0)
+        (continue t)
+        (a-element)
+        (a-index 0)
+        (a-length (length a))
+        (b-element)
+        (b-index 0)
+        (b-length (length b)))
+    (while (and
+            (< a-index a-length)
+            (< merge-count k)
+            continue)
+      (setq a-element (nth a-index a))
+      (if (parser-generator--valid-e-p a-element)
+          (setq continue nil)
+        (push a-element merged))
+      (setq a-index (1+ a-index)))
+    (while (and
+            (< b-index b-length)
+            (< merge-count k)
+            continue)
+      (setq b-element (nth b-index b))
+      (if (parser-generator--valid-e-p b-element)
+          (setq continue nil)
+        (push b-element merged))
+      (setq b-index (1+ b-index)))
+    merged))
+
 ;; p. 357
 (defun parser-generator--f-set (input-tape state stack)
   "A deterministic push-down transducer (DPDT) for building F-sets from 
INPUT-TAPE, STATE and STACK."
@@ -872,7 +903,7 @@
                                                              
,alternative-leading-terminals
                                                              
,alternative-all-leading-terminals-p
                                                              ,(1+ 
input-tape-index))))
-                                                      (parser-generator--debug 
(message "branched off01: %s" branch))
+                                                      (parser-generator--debug 
(message "branched off 0: %s" branch))
                                                       ;; Branch off here with 
a separate track where this e-identifier is ignored
                                                       (push branch stack)))))
 
@@ -942,7 +973,9 @@
                                             (parser-generator--debug (message 
"branched off 5: %s" branch))
                                             (push branch stack)))
 
+                                        (parser-generator--debug (message 
"leading-terminals-1: %s" leading-terminals))
                                         (setq leading-terminals (append 
leading-terminals sub-terminal-set))
+                                        (parser-generator--debug (message 
"leading-terminals-2: %s" leading-terminals))
                                         (setq leading-terminals-count (+ 
leading-terminals-count (length sub-terminal-set)))
                                         (when (> leading-terminals-count k)
                                           (setq leading-terminals (butlast 
leading-terminals (- leading-terminals-count k)))
@@ -1008,6 +1041,7 @@
             (when (> leading-terminals-count 0)
               (unless (listp leading-terminals)
                 (setq leading-terminals (list leading-terminals)))
+              (message "leading-terminals: %s" leading-terminals)
               (push leading-terminals f-set))))))
     (list expanded-all f-set)))
 
diff --git a/test/parser-generator-test.el b/test/parser-generator-test.el
index 5446bb0..8110599 100644
--- a/test/parser-generator-test.el
+++ b/test/parser-generator-test.el
@@ -624,6 +624,28 @@
 
   (message "Passed tests  for (parser-generator--valid-terminal-p)"))
 
+(defun parser-generator-test--merge-max-terminals ()
+  "Test `parser-generator--merge-max-terminals'."
+  (message "Passed tests  for (parser-generator--merge-max-terminals)")
+
+  (should
+   (equal
+    '(a b e)
+    (parser-generator--merge-max-terminals
+     '(a)
+     '(b e)
+     3)))
+
+  (should
+   (equal
+    '(a e)
+    (parser-generator--merge-max-terminals
+     '(a e)
+     '(b e)
+     3)))
+
+  (message "Passed tests  for (parser-generator--merge-max-terminals)"))
+
 (defun parser-generator-test ()
   "Run test."
   ;; (setq debug-on-error t)
@@ -640,6 +662,7 @@
   (parser-generator-test--sort-list)
   (parser-generator-test--get-grammar-rhs)
   (parser-generator-test--get-grammar-look-aheads)
+  (parser-generator-test--merge-max-terminals)
 
   ;; Algorithms
   (parser-generator-test--first)



reply via email to

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