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

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

[elpa] externals/parser-generator f0cd9f6 280/434: Started on test for e


From: ELPA Syncer
Subject: [elpa] externals/parser-generator f0cd9f6 280/434: Started on test for export parser feature
Date: Mon, 29 Nov 2021 15:59:58 -0500 (EST)

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

    Started on test for export parser feature
---
 parser-generator-lex-analyzer.el | 12 ++++---
 parser-generator-lr.el           | 78 ++++++++++++++++++++++++++++++++++++++--
 test/parser-generator-lr-test.el | 38 +++++++++++++++++++-
 3 files changed, 121 insertions(+), 7 deletions(-)

diff --git a/parser-generator-lex-analyzer.el b/parser-generator-lex-analyzer.el
index 52a1c34..bce7d04 100644
--- a/parser-generator-lex-analyzer.el
+++ b/parser-generator-lex-analyzer.el
@@ -13,19 +13,23 @@
 ;;; Variables:
 
 
-(defvar parser-generator-lex-analyzer--get-function
+(defvar
+  parser-generator-lex-analyzer--get-function
   nil
   "Get token information function.  This function will be called when building 
token meta-information before calling optional syntax-directed translation / 
semantic-actions.  Anything other than nil is expected.")
 
-(defvar parser-generator-lex-analyzer--function
+(defvar
+  parser-generator-lex-analyzer--function
   nil
   "Function used as lex-analyzer.  This function will be called and as result 
a list with structure '(a b . c) is expected where a is a string or symbol, if 
no more tokens can be found nil is expected, if it's not possible to proceed 
lex analysis an error-signal is expected.")
 
-(defvar parser-generator-lex-analyzer--index
+(defvar
+  parser-generator-lex-analyzer--index
   nil
   "Index in lex-analyzer.")
 
-(defvar parser-generator-lex-analyzer--reset-function
+(defvar
+  parser-generator-lex-analyzer--reset-function
   nil
   "Function used when resetting lex-analyzer.")
 
diff --git a/parser-generator-lr.el b/parser-generator-lr.el
index 6cf7bf8..824a103 100644
--- a/parser-generator-lr.el
+++ b/parser-generator-lr.el
@@ -14,11 +14,13 @@
 ;;; Variables:
 
 
-(defvar parser-generator-lr--action-tables
+(defvar
+  parser-generator-lr--action-tables
   nil
   "Action-tables for grammar.")
 
-(defvar parser-generator-lr--goto-tables
+(defvar
+  parser-generator-lr--goto-tables
   nil
   "Goto-tables for grammar.")
 
@@ -33,6 +35,78 @@
      table-lr-items)
     table-lr-items))
 
+(defun parser-generator-lr--export-parser (namespace)
+  "Export parser with NAMESPACE."
+
+  ;; Make sure all requisites are defined 
+  (unless parser-generator-lr--action-tables
+    (error "Missing generated ACTION-tables!"))
+  (unless parser-generator-lr--goto-tables
+    (error "Missing generated GOTO-tables!"))
+  (unless parser-generator--table-productions-number
+    (error "Table for production-numbers is undefined!"))
+  (unless parser-generator--table-look-aheads-p
+    (error "Table for valid look-aheads is undefined!"))
+  (unless parser-generator--look-ahead-number
+    (error "Missing a look-ahead number!"))
+  (unless parser-generator--e-identifier
+    (error "Missing definition for e-identifier!"))
+  (unless parser-generator--eof-identifier
+    (error "Missing definition for EOF-identifier!"))
+  (unless parser-generator--table-non-terminal-p
+    (error "Table for non-terminals is undefined!"))
+  (unless parser-generator--table-terminal-p
+    (error "Table for terminals is undefined!"))
+  (unless parser-generator--table-translations
+    (error "Table for translations by production-number is undefined!"))
+  (unless parser-generator-lex-analyzer--get-function
+    (error "Missing lex-analyzer get function!"))
+  (unless parser-generator-lex-analyzer--function
+    (error "Missing lex-analyzer function!"))
+
+  ;; TODO Extract some stuff as global
+  ;; 1. parse-function
+  ;; 2. parse variables
+  ;; 2. lex-functions
+  ;; 3. lex index
+
+  ;; TODO Export parser here
+  `(lambda
+    (&optional
+     input-tape-index
+     pushdown-list
+     output
+     translation
+     translation-symbol-table
+     history)
+    (let
+        ((action-tables
+          ,parser-generator-lr--action-tables)
+         (goto-tables
+          ,parser-generator-lr--goto-tables)
+         (table-productions-number
+          ,parser-generator--table-productions-number)
+         (table-look-aheads-p
+          ,parser-generator--table-look-aheads-p)
+         (look-ahead-number
+          ,parser-generator--look-ahead-number)
+         (e-identifier
+          ,parser-generator--e-identifier)
+         (eof-identifier
+          ,parser-generator--eof-identifier)
+         (table-non-terminal-p
+          ,parser-generator--table-non-terminal-p)
+         (table-terminal-p
+          ,parser-generator--table-terminal-p)
+         (table-translations
+          ,parser-generator--table-translations)
+         (lex-analyzer-get-function
+          ,parser-generator-lex-analyzer--get-function)
+         (lex-analyzer-function
+          ,parser-generator-lex-analyzer--function)
+         (lex-analyzer-reset-function
+          ,parser-generator-lex-analyzer--reset-function))
+      )))
 
 ;; Algorithm 5.11, p. 393
 (defun parser-generator-lr--generate-action-tables (table-lr-items)
diff --git a/test/parser-generator-lr-test.el b/test/parser-generator-lr-test.el
index 49c4071..cac4994 100644
--- a/test/parser-generator-lr-test.el
+++ b/test/parser-generator-lr-test.el
@@ -1152,6 +1152,41 @@
 
   (message "Passed tests for (parser-generator-lr-translate)"))
 
+(defun parser-generator-lr-test-export-parser ()
+  "Test `parser-generator-lr--export-parser'."
+  (message "Started tests for (parser-generator-lr--export-parser)")
+
+  (parser-generator-set-grammar
+   '((Sp S) (a b) ((Sp S) (S (S a S b)) (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 index)
+            (tokens))
+       (while (and
+               (< (1- index) string-length)
+               (< (1- index) max-index))
+         (push (nth (1- index) string) tokens)
+         (setq index (1+ index)))
+       (nreverse tokens))))
+  (setq
+   parser-generator-lex-analyzer--get-function
+   (lambda (token)
+     (car token)))
+  (should
+   (equal
+    '(2 2 2 1 1)
+    (parser-generator-lr-parse)))
+  (let ((export (parser-generator-lr--export-parser "e--")))
+    (message "export: %s" export))
+
+  (message "Passed tests for (parser-generator-lr--export-parser)"))
+
 (defun parser-generator-lr-test ()
   "Run test."
   ;; (setq debug-on-error t)
@@ -1163,7 +1198,8 @@
   (parser-generator-lr-test-parse)
   (parser-generator-lr-test-translate)
   (parser-generator-lr-test-parse-k-2)
-  (parser-generator-lr-test-parse-k-0))
+  (parser-generator-lr-test-parse-k-0)
+  (parser-generator-lr-test-export-parser))
 
 
 (provide 'parser-generator-lr-test)



reply via email to

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