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

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

[elpa] externals/parser-generator 96f128f 155/434: More various stuff


From: ELPA Syncer
Subject: [elpa] externals/parser-generator 96f128f 155/434: More various stuff
Date: Mon, 29 Nov 2021 15:59:30 -0500 (EST)

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

    More various stuff
---
 parser-generator.el              | 13 +++++++++----
 test/parser-generator-lr-test.el | 26 ++++++++++++++++++++++++++
 test/parser-generator-test.el    | 23 ++++++++++++++++++++++-
 3 files changed, 57 insertions(+), 5 deletions(-)

diff --git a/parser-generator.el b/parser-generator.el
index c151273..bb83211 100644
--- a/parser-generator.el
+++ b/parser-generator.el
@@ -245,7 +245,8 @@
     (dolist (non-terminal non-terminals)
       (puthash non-terminal t parser-generator--table-non-terminal-p)))
 
-  (let ((productions (parser-generator--get-grammar-productions)))
+  (let ((productions (parser-generator--get-grammar-productions))
+        (purified-production))
     (setq parser-generator--table-productions-rhs (make-hash-table :test 
'equal))
     (dolist (p productions)
       (let ((lhs (car p))
@@ -254,7 +255,11 @@
           (dolist (rhs-element rhs)
             (unless (listp rhs-element)
               (setq rhs-element (list rhs-element)))
-            (push rhs-element new-value))
+            (let ((new-rhs))
+              (dolist (rhs-sub-element rhs-element)
+                (unless (functionp rhs-sub-element)
+                  (push rhs-sub-element new-rhs)))
+              (push (nreverse new-rhs) new-value)))
           (puthash lhs (nreverse new-value) 
parser-generator--table-productions-rhs))))
 
     (setq parser-generator--table-productions-number (make-hash-table :test 
'equal))
@@ -309,7 +314,7 @@
 (defun parser-generator-set-grammar (G)
   "Set grammar G.."
   (unless (parser-generator--valid-grammar-p G)
-    (error "Invalid grammar G!"))
+    (error "Invalid grammar G! %s" G))
   (setq parser-generator--grammar G))
 
 (defun parser-generator-process-grammar ()
@@ -721,7 +726,7 @@
   (unless (listp β)
     (setq β (list β)))
   (unless (parser-generator--valid-sentential-form-p β)
-    (error "Invalid sentential form β!"))
+    (error "Invalid sentential form β! %s" β))
   (let ((productions (parser-generator--get-grammar-productions))
         (k parser-generator--look-ahead-number))
     (let ((i-max (length productions)))
diff --git a/test/parser-generator-lr-test.el b/test/parser-generator-lr-test.el
index 4b2e12e..5c18c97 100644
--- a/test/parser-generator-lr-test.el
+++ b/test/parser-generator-lr-test.el
@@ -319,6 +319,32 @@
 
   (message "Passed test with terminals as string, invalid syntax")
 
+  ;; TODO Test translation with terminals as strings here
+
+  (parser-generator-set-grammar '((Sp S) ("a" "b") ((Sp S) (S (S "a" S "b" 
(lambda(args) (nreverse args)))) (S e)) Sp))
+  (parser-generator-set-look-ahead-number 1)
+  (parser-generator-process-grammar)
+  (parser-generator-lr-generate-parser-tables)
+
+  (setq
+   parser-generator-lex-analyzer--function
+   (lambda (index)
+     (let* ((string '(("a" 1 . 2) ("a" 2 . 3) ("b" 3 . 4) ("b" 4 . 5)))
+            (string-length (length string))
+            (max-index (1+ index))
+            (tokens))
+       (while (and
+               (< index string-length)
+               (< index max-index))
+         (push (nth index string) tokens)
+         (setq index (1+ index)))
+       (nreverse tokens))))
+
+  (should
+   (equal
+    '((2 2 2 1 1) nil)
+    (parser-generator-lr--parse)))
+
   (message "Passed tests for (parser-generator-lr--parse)"))
 
 (defun parser-generator-lr-test ()
diff --git a/test/parser-generator-test.el b/test/parser-generator-test.el
index c31587e..b8a82c3 100644
--- a/test/parser-generator-test.el
+++ b/test/parser-generator-test.el
@@ -377,6 +377,14 @@
            t
            (parser-generator--valid-grammar-p '((A B C) ("a" "b" "c") ((A "a" 
(lambda(a) (message "Was here: %s" a)))) A))))
 
+  (should (equal
+           t
+           (parser-generator--valid-grammar-p '((A B C) ("a" "b" "c") ((A "a" 
(lambda(a) (message "Was here: %s" a)) "b")) A))))
+
+  (should (equal
+           t
+           (parser-generator--valid-grammar-p '((A B C) ("a" "b" "c") ((A ("a" 
(lambda(a) (message "Was here: %s" a))))) A))))
+
   (message "Passed tests for (parser-generator--valid-grammar-p)"))
 
 (defun parser-generator-test--valid-look-ahead-number-p ()
@@ -413,7 +421,20 @@
   "Test `parser-generator--valid-sentential-form-p'."
   (message "Starting tests  for (parser-generator--valid-sentential-form-p)")
 
-  ;; TODO Add tests for this
+  (parser-generator-set-grammar '((S A B) ("a" "b") ((S A) (A ("b" "a")) (B 
"b" (lambda(b) (message "Was here: %s" b)))) S))
+  (parser-generator-process-grammar)
+
+  (should
+   (equal
+    nil
+    (parser-generator--valid-sentential-form-p
+     '(B "b" (lambda(b) (message "Was here: %s" b))))))
+
+  (should
+   (equal
+    t
+    (parser-generator--valid-sentential-form-p
+     '(B "b"))))
 
   (message "Passed tests for (parser-generator--valid-sentential-form-p)"))
 



reply via email to

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