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

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

[elpa] externals/parser-generator 2e76c4b57e 42/82: Added TODO items


From: Christian Johansson
Subject: [elpa] externals/parser-generator 2e76c4b57e 42/82: Added TODO items
Date: Thu, 12 May 2022 13:28:16 -0400 (EDT)

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

    Added TODO items
---
 parser-generator-ll.el           | 42 +++++++++++++++++++++++++++++++++-------
 test/parser-generator-ll-test.el | 31 ++++++++++++++++++++++++++---
 2 files changed, 63 insertions(+), 10 deletions(-)

diff --git a/parser-generator-ll.el b/parser-generator-ll.el
index 5c830d728e..7ce053e521 100644
--- a/parser-generator-ll.el
+++ b/parser-generator-ll.el
@@ -30,13 +30,40 @@
   (message "\n;; Starting generation of LL(k) parser-tables..\n")
   (unless (parser-generator-ll--valid-grammar-p)
     (error "Invalid grammar specified!"))
-  (let ((parsing-table)
-        (parser-generator-ll--generate-parsing-table
-         (parser-generator-ll--generate-tables)))
-    ;; TODO Generate hash-based parsing table here
+  (let ((list-parsing-table
+         (parser-generator-ll--generate-parsing-table
+          (parser-generator-ll--generate-tables)))
+        (hash-parsing-table (make-hash-table :test 'equal)))
+    (dolist (state-list list-parsing-table)
+      (let ((state-key (nth 0 state-list))
+            (state-look-aheads (nth 1 state-list))
+            (state-hash-table (make-hash-table :test 'equal)))
+        (dolist (state-look-ahead-list state-look-aheads)
+          (let ((state-look-ahead-string (nth 0 state-look-ahead-list))
+                (state-look-ahead-action (nth 1 state-look-ahead-list)))
+            (if (equal state-look-ahead-action 'reduce)
+                (let ((state-look-ahead-reduction
+                       (nth 2 state-look-ahead-list))
+                      (state-look-ahead-production-number
+                       (nth 3 state-look-ahead-list)))
+                  (puthash
+                   state-look-ahead-string
+                   (list
+                    state-look-ahead-action
+                    state-look-ahead-reduction
+                    state-look-ahead-production-number)
+                   state-hash-table))
+              (puthash
+               state-look-ahead-string
+               state-look-ahead-action
+               state-hash-table))))
+        (puthash
+         state-key
+         state-hash-table
+         hash-parsing-table)))
     (setq
      parser-generator-ll--parsing-table
-     parsing-table))
+     hash-parsing-table))
   (message "\n;; Completed generation of LL(k) parser-tables.\n"))
 
 
@@ -351,8 +378,9 @@
              (list
               parser-generator--eof-identifier
               (list
-               eof-look-ahead
-               'accept))
+               (list
+                eof-look-ahead
+                'accept)))
              parsing-table)
           (let ((stack-item (nth 0 terminal-mutation)))
             (when (and
diff --git a/test/parser-generator-ll-test.el b/test/parser-generator-ll-test.el
index 96bda89fe0..f2c6f0554d 100644
--- a/test/parser-generator-ll-test.el
+++ b/test/parser-generator-ll-test.el
@@ -186,7 +186,9 @@
          )
         (
          $
-         (($ $) accept)
+         (
+          (($ $) accept)
+          )
          )
         )
       parser-tables)))
@@ -262,7 +264,9 @@
          )
         (
          $
-         (($ $) accept)
+         (
+          (($ $) accept)
+          )
          )
         )
       parser-tables)))
@@ -285,7 +289,28 @@
   "Test `parser-generator-ll-generate-parser-tables'."
   (message "Started tests for (parser-generator-ll-generate-parser-tables)")
 
-  ;; TODO Do testing of hash-table generation here
+  (parser-generator-set-eof-identifier '$)
+  (parser-generator-set-e-identifier 'e)
+  (parser-generator-set-look-ahead-number 2)
+  (parser-generator-set-grammar
+   '(
+     (S A)
+     (a b)
+     (
+      (S e (a b A))
+      (A (S a a) b)
+      )
+     S
+     )
+   )
+  (parser-generator-process-grammar)
+  (parser-generator-ll-generate-parser-tables)
+  (message "parser-generator-ll--parsing-table: %S" 
parser-generator-ll--parsing-table)
+  (should
+   (equal
+    #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8125 
data (((S) ($)) #s(hash-table size 65 test equal rehash-size 1.5 
rehash-threshold 0.8125 data ((a b) (reduce (a b ((A) ($))) 1) ($ $) (reduce 
(e) 0))) ((A) ($)) #s(hash-table size 65 test equal rehash-size 1.5 
rehash-threshold 0.8125 data ((b $) (reduce (b) 3) (a a) (reduce (((S) (a a)) a 
a) 2) (a b) (reduce (((S) (a a)) a a) 2))) ((S) (a a)) #s(hash-table size 65 
test equal rehash-size 1.5 rehash-threshold 0.81 [...]
+    parser-generator-ll--parsing-table))
+  ;; TODO Make this pass
 
   (message "Passed tests for (parser-generator-ll-generate-parser-tables)"))
 



reply via email to

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