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

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

[elpa] externals/parser-generator 2d56ab0 160/434: Made separate functio


From: ELPA Syncer
Subject: [elpa] externals/parser-generator 2d56ab0 160/434: Made separate functions for parse and translate in LR-parser
Date: Mon, 29 Nov 2021 15:59:31 -0500 (EST)

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

    Made separate functions for parse and translate in LR-parser
---
 parser-generator-lr.el           | 52 ++++++++++++++++++++++++++++++++++++----
 test/parser-generator-lr-test.el | 18 +++++++-------
 2 files changed, 57 insertions(+), 13 deletions(-)

diff --git a/parser-generator-lr.el b/parser-generator-lr.el
index 688af25..39b1ea4 100644
--- a/parser-generator-lr.el
+++ b/parser-generator-lr.el
@@ -474,11 +474,48 @@
     (setq lr-new-item (sort lr-new-item 'parser-generator--sort-list))
     lr-new-item))
 
+(defun parser-generator-lr-parse
+    (&optional
+     input-tape-index
+     pushdown-list
+     output
+     translation
+     pushdown-list-history)
+  "Perform a LR-parse via lex-analyzer, optionally at INPUT-TAPE-INDEX with 
PUSHDOWN-LIST, OUTPUT, TRANSLATION and PUSHDOWN-LIST-HISTORY."
+  (let ((result (parser-generator-lr--parse
+                 input-tape-index
+                 pushdown-list
+                 output
+                 translation
+                 pushdown-list-history)))
+    (nth 0 result)))
+
+(defun parser-generator-lr-translate
+    (&optional
+     input-tape-index
+     pushdown-list
+     output
+     translation
+     pushdown-list-history)
+  "Perform a LR-parse via lex-analyzer, optionally at INPUT-TAPE-INDEX with 
PUSHDOWN-LIST, OUTPUT, TRANSLATION and PUSHDOWN-LIST-HISTORY."
+  (let ((result (parser-generator-lr--parse
+                 input-tape-index
+                 pushdown-list
+                 output
+                 translation
+                 pushdown-list-history)))
+    (nth 1 result)))
+
 ;; Algorithm 5.7, p. 375
 ;; TODO Test incremental usage of this function
 ;; TODO Consider case with 2 character look-ahead
-(defun parser-generator-lr--parse (&optional input-tape-index pushdown-list 
output translation)
-  "Perform a LR-parse via lex-analyzer, optionally at INPUT-TAPE-INDEX with 
PUSHDOWN-LIST, OUTPUT and TRANSLATION."
+(defun parser-generator-lr--parse
+    (&optional input-tape-index
+               pushdown-list
+               output
+               translation
+               pushdown-list-history)
+  "Perform a LR-parse via lex-analyzer, optionally at INPUT-TAPE-INDEX with 
PUSHDOWN-LIST, OUTPUT, TRANSLATION and PUSHDOWN-LIST-HISTORY."
   (unless input-tape-index
     (setq input-tape-index 0))
   (unless pushdown-list
@@ -663,7 +700,11 @@
 
                             (when next-index
                               (push production-lhs pushdown-list)
-                              (push next-index pushdown-list)))))))))
+                              (push next-index pushdown-list)))))
+
+                      (push
+                       `(,parser-generator-lex-analyzer--index ,pushdown-list)
+                       pushdown-list-history)))))
 
                ((equal action-match '(accept))
                 ;;    (d) If f(u) = accept, we halt and declare the string
@@ -677,7 +718,10 @@
       (error "Parsed entire string without getting accepting! Output: %s" 
(nreverse output)))
     (when translation
       (setq translation (nreverse translation)))
-    (list (nreverse output) translation)))
+    (list
+     (nreverse output)
+     translation
+     (nreverse pushdown-list-history))))
 
 (provide 'parser-generator-lr)
 
diff --git a/test/parser-generator-lr-test.el b/test/parser-generator-lr-test.el
index ab71d3a..4d6aae2 100644
--- a/test/parser-generator-lr-test.el
+++ b/test/parser-generator-lr-test.el
@@ -248,8 +248,8 @@
 
   (should
    (equal
-    '((2 2 2 1 1) nil)
-    (parser-generator-lr--parse)))
+    '(2 2 2 1 1)
+    (parser-generator-lr-parse)))
 
   (message "Passed test with terminals as symbols")
 
@@ -295,8 +295,8 @@
 
   (should
    (equal
-    '((2 2 2 1 1) nil)
-    (parser-generator-lr--parse)))
+    '(2 2 2 1 1)
+    (parser-generator-lr-parse)))
 
   (message "Passed test with terminals as string")
 
@@ -351,8 +351,8 @@
 
     (should
      (equal
-      '((2 2 2 1 1) ("b" "a" "b" "a"))
-      (parser-generator-lr--parse)))
+      '("b" "a" "b" "a")
+      (parser-generator-lr-translate)))
 
     (kill-buffer buffer))
   (message "Passed test with translation 1")
@@ -404,8 +404,8 @@
 
     (should
      (equal
-      '((1) ("(when a b)"))
-      (parser-generator-lr--parse)))
+      '("(when a b)")
+      (parser-generator-lr-translate)))
 
     (switch-to-buffer buffer)
     (kill-region (point-min) (point-max))
@@ -413,7 +413,7 @@
     (insert "if (a) { b }")
 
     (should-error
-     (parser-generator-lr--parse))
+     (parser-generator-lr-parse))
 
     (kill-buffer buffer))
   (message "Passed test with translation 2")



reply via email to

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