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

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

[elpa] externals/parser-generator 80dd506b65 33/82: More work on LL-help


From: Christian Johansson
Subject: [elpa] externals/parser-generator 80dd506b65 33/82: More work on LL-helper functions
Date: Thu, 12 May 2022 13:28:15 -0400 (EDT)

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

    More work on LL-helper functions
---
 parser-generator-ll.el | 40 ++++++++++++++++++++++++++++------------
 parser-generator.el    | 17 ++++++++++-------
 2 files changed, 38 insertions(+), 19 deletions(-)

diff --git a/parser-generator-ll.el b/parser-generator-ll.el
index 973571e575..a7acf6f73e 100644
--- a/parser-generator-ll.el
+++ b/parser-generator-ll.el
@@ -47,6 +47,7 @@
   (let ((tables (make-hash-table :test 'equal))
         (distinct-item-p (make-hash-table :test 'equal))
         (stack)
+        (distinct-stack-item-p (make-hash-table :test 'equal))
         (stack-item)
         (k (max 1 parser-generator--look-ahead-number)))
 
@@ -54,13 +55,21 @@
     (let* ((start (parser-generator--get-grammar-start))
            (start-rhss (parser-generator--get-grammar-rhs start)))
       (dolist (start-rhs start-rhss)
-        (let* ((production (list (list start) start-rhs)))
+        (let* ((production
+                (list (list start) start-rhs))
+               (initial-stack-item
+                (list
+                 (list start)
+                 start-rhs
+                 (list parser-generator--eof-identifier))))
+          (puthash
+           initial-stack-item
+           t
+           distinct-stack-item-p)
           (push
-           (list
-            (list start)
-            start-rhs
-            (list parser-generator--eof-identifier))
+           initial-stack-item
            stack))))
+
     (setq stack (nreverse stack))
     (parser-generator--debug
      (message "stack: %S" stack))
@@ -171,13 +180,20 @@
                                (list sub-symbol)
                                sub-symbol-rhs
                                local-follow)))
-                        (parser-generator--debug
-                         (message
-                          "new-stack-item: %S"
-                          new-stack-item))
-                        (push
-                         new-stack-item
-                         stack)))))))
+                        (unless (gethash
+                                 new-stack-item
+                                 distinct-stack-item-p)
+                          (parser-generator--debug
+                           (message
+                            "new-stack-item: %S"
+                            new-stack-item))
+                          (puthash
+                           new-stack-item
+                           t
+                           distinct-stack-item-p)
+                          (push
+                           new-stack-item
+                           stack))))))))
             (setq
              sub-symbol-index
              (1+ sub-symbol-index))))
diff --git a/parser-generator.el b/parser-generator.el
index e956ffc033..617d9f1088 100644
--- a/parser-generator.el
+++ b/parser-generator.el
@@ -2090,13 +2090,16 @@
 
 (defun parser-generator-generate-terminal-saturated-first-set (first-set)
   "Generated a set from FIRST-SET with items that does not end with the 
e-identifier if there is alternative items that continues with terminals."
-  (let* ((max-terminal-count
-          (parser-generator-calculate-max-terminal-count
-           first-set))
-         (saturated-list
-          (parser-generator-generate-sets-of-terminals
-           first-set
-           max-terminal-count)))
+  (let ((max-terminal-count
+         (parser-generator-calculate-max-terminal-count
+          first-set))
+        (saturated-list))
+    (when (> max-terminal-count 0)
+      (setq
+       saturated-list
+       (parser-generator-generate-sets-of-terminals
+        first-set
+        max-terminal-count)))
     saturated-list))
 
 (defun parser-generator-generate-sets-of-terminals (sets count)



reply via email to

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