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

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

[elpa] externals/parser-generator 60d9968 202/434: Fixed valid look-ahea


From: ELPA Syncer
Subject: [elpa] externals/parser-generator 60d9968 202/434: Fixed valid look-ahead with k above 1
Date: Mon, 29 Nov 2021 15:59:41 -0500 (EST)

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

    Fixed valid look-ahead with k above 1
---
 parser-generator-lr.el        |  3 +++
 parser-generator.el           | 21 ++++++++++-------
 test/parser-generator-test.el | 52 ++++++++++++++++++++++++++++++++++++++++++-
 3 files changed, 67 insertions(+), 9 deletions(-)

diff --git a/parser-generator-lr.el b/parser-generator-lr.el
index 40481da..faec337 100644
--- a/parser-generator-lr.el
+++ b/parser-generator-lr.el
@@ -70,6 +70,7 @@
                               (when eff
                                 ;; Go through eff-items and see if any item is 
a valid look-ahead of grammar
                                 ;; in that case save in action table a shift 
action here
+                                ;; TODO Verify that stuff like aeee is valid 
look-ahead if look-ahead is 4
                                 (let ((eff-index 0)
                                       (eff-item)
                                       (eff-length (length eff))
@@ -156,6 +157,8 @@
         (table-lr-items (make-hash-table :test 'equal))
         (e-list))
 
+    ;; TODO Verify what symbols should consist of if k > 1
+
     (let ((e-list-index 0)
           (e-list-length parser-generator--look-ahead-number))
       (while (< e-list-index e-list-length)
diff --git a/parser-generator.el b/parser-generator.el
index 703f6fe..2157d04 100644
--- a/parser-generator.el
+++ b/parser-generator.el
@@ -103,7 +103,15 @@
     (let ((terminals-max-index (1- (length terminals)))
           (terminal-index)
           (look-ahead-length)
-          (look-ahead))
+          (look-ahead)
+          (e-list))
+
+      (let ((e-list-index 0)
+            (e-list-length parser-generator--look-ahead-number))
+        (while (< e-list-index e-list-length)
+          (push parser-generator--e-identifier e-list)
+          (setq e-list-index (1+ e-list-index))))
+
       (while stack
         (let ((item (pop stack)))
           (setq terminal-index (nth 0 item))
@@ -130,15 +138,12 @@
             (if look-ahead
                 (progn
 
-                  (when (= look-ahead-length k)
-                    (setq look-ahead-to-add (reverse look-ahead)))
-
-                  (when (= look-ahead-length (1- k))
+                  (while (< look-ahead-length k)
                     (push parser-generator--e-identifier look-ahead)
-                    (setq look-ahead-to-add (reverse look-ahead))))
+                    (setq look-ahead-length (1+ look-ahead-length)))
+                  (setq look-ahead-to-add (reverse look-ahead)))
 
-              (when (= k 1)
-                (setq look-ahead-to-add `(,parser-generator--e-identifier))))
+              (setq look-ahead-to-add e-list))
 
             (when (and look-ahead-to-add
                        (not (gethash look-ahead-to-add added-look-aheads)))
diff --git a/test/parser-generator-test.el b/test/parser-generator-test.el
index 7efe589..ec8e1b8 100644
--- a/test/parser-generator-test.el
+++ b/test/parser-generator-test.el
@@ -20,10 +20,18 @@
 
   (should
    (equal
+    nil
+    (parser-generator--valid-look-ahead-p '("a" "b"))))
+  (should
+   (equal
     t
     (parser-generator--valid-look-ahead-p "a")))
   (should
    (equal
+    nil
+    (parser-generator--valid-look-ahead-p "A")))
+  (should
+   (equal
     t
     (parser-generator--valid-look-ahead-p "b")))
   (should
@@ -36,9 +44,51 @@
     (parser-generator--valid-look-ahead-p "d")))
   (should
    (equal
+    nil
+    (parser-generator--valid-look-ahead-p 'f)))
+  (should
+   (equal
     t
     (parser-generator--valid-look-ahead-p 'e)))
 
+  (message "Passed with look-ahead number is 1")
+
+  ;; TODO Test with look-ahead number = 2 here
+
+  (parser-generator-set-look-ahead-number 2)
+  (parser-generator-set-grammar '((S A) ("a" "b") ((S A) (A ("b" "a"))) S))
+  (parser-generator-process-grammar)
+  (should
+   (equal
+    t
+    (parser-generator--valid-look-ahead-p '("a" "a"))))
+  (should
+   (equal
+    nil
+    (parser-generator--valid-look-ahead-p "a")))
+  (should
+   (equal
+    t
+    (parser-generator--valid-look-ahead-p '("b" "b"))))
+  (should
+   (equal
+    nil
+    (parser-generator--valid-look-ahead-p '("a" "c"))))
+  (should
+   (equal
+    nil
+    (parser-generator--valid-look-ahead-p '("a" "d"))))
+  (should
+   (equal
+    nil
+    (parser-generator--valid-look-ahead-p '(f e))))
+  (should
+   (equal
+    t
+    (parser-generator--valid-look-ahead-p '(e e))))
+
+  (message "Passed with look-ahead number is 2")
+
   (message "Passed tests for (parser-generator--valid-look-ahead-p)"))
 
 (defun parser-generator-test--get-grammar-look-aheads ()
@@ -59,7 +109,7 @@
 
   (should
    (equal
-    '(("a" "a") ("a" "b") ("a" e) ("b" "a") ("b" "b") ("b" e))
+    '(("a" "a") ("a" "b") ("a" e) ("b" "a") ("b" "b") ("b" e) (e e))
     (parser-generator--get-grammar-look-aheads)))
 
   (message "Passed tests for (parser-generator--get-grammar-look-aheads)"))



reply via email to

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