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

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

[elpa] externals/parser-generator 044f33a 151/434: Added more support fo


From: ELPA Syncer
Subject: [elpa] externals/parser-generator 044f33a 151/434: Added more support for SDT
Date: Mon, 29 Nov 2021 15:59:29 -0500 (EST)

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

    Added more support for SDT
---
 parser-generator.el           | 35 ++++++++++++++++++++++++++++-------
 test/parser-generator-test.el |  6 +++++-
 2 files changed, 33 insertions(+), 8 deletions(-)

diff --git a/parser-generator.el b/parser-generator.el
index d06f568..27c522b 100644
--- a/parser-generator.el
+++ b/parser-generator.el
@@ -62,6 +62,10 @@
   nil
   "Hash-table of non-terminals for quick checking.")
 
+(defvar parser-generator--table-translations
+  nil
+  "Hash-table indexed by production-number and value is translation function.")
+
 
 ;; Macros
 
@@ -249,19 +253,36 @@
 
     (setq parser-generator--table-productions-number (make-hash-table :test 
'equal))
     (setq parser-generator--table-productions-number-reverse (make-hash-table 
:test 'equal))
+    (setq parser-generator--table-translations (make-hash-table :test 'equal))
     (let ((production-index 0))
       (dolist (p productions)
         (let ((lhs (car p))
               (rhs (cdr p))
-              (production))
-          (dolist (rhs-element rhs)
-            (unless (listp rhs-element)
-              (setq rhs-element (list rhs-element)))
-            (setq production (list lhs rhs-element))
-            (parser-generator--debug
-             (message "Production %s: %s" production-index production))
+              (production)
+              (translation))
+          (let ((rhs-element-index 0)
+                (rhs-length (length rhs))
+                (rhs-element))
+            (while (< rhs-element-index rhs-length)
+              (setq rhs-element (nth rhs-element-index rhs))
+              (unless (listp rhs-element)
+                (setq rhs-element (list rhs-element)))
+
+              (if (and
+                   (functionp rhs-element)
+                   (= rhs-element-index (1- rhs-length)))
+                  (progn
+                    (setq translation rhs-element)
+                    (parser-generator--debug
+                     (message "Translation %s: %s" production-index 
translation)))
+                (setq production (list lhs rhs-element))
+                (parser-generator--debug
+                 (message "Production %s: %s" production-index production)))
+              (setq rhs-element-index (1+ rhs-element-index)))
             (puthash production production-index 
parser-generator--table-productions-number)
             (puthash production-index production 
parser-generator--table-productions-number-reverse)
+            (when translation
+              (puthash production-index translation 
parser-generator--table-translations))
             (setq production-index (1+ production-index)))))))
 
   (let ((look-aheads (parser-generator--get-grammar-look-aheads)))
diff --git a/test/parser-generator-test.el b/test/parser-generator-test.el
index d9c02d0..c31587e 100644
--- a/test/parser-generator-test.el
+++ b/test/parser-generator-test.el
@@ -373,6 +373,10 @@
            nil
            (parser-generator--valid-grammar-p '((A B C) (a (b c) "c") (A ("a" 
"b") (a b)) (B b) (C "c")))))
 
+  (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 ()
@@ -451,7 +455,7 @@
   "Test `parser-generator--get-grammar-rhs'."
   (message "Started tests  for (parser-generator--get-grammar-rhs)")
 
-  (parser-generator-set-grammar '((S A) ("a" "b") ((S A) (A ("b" "a"))) S))
+  (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



reply via email to

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