[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)
- [elpa] externals/parser-generator 5b45b2b 235/434: Improved comments, (continued)
- [elpa] externals/parser-generator 5b45b2b 235/434: Improved comments, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator c2d2d0d 239/434: Fixed FIRST calculating when building lr-item sets, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator a516e3f 234/434: Started on new test for LR(2) Parser, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 06c09bc 254/434: Removed commented-out code, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator a796d8d 253/434: Added another passing unit test for k=2, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator b2193b2 251/434: GOTO-items now only contain one symbol in parse function, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator d147355 256/434: Fixed a bug in processing production RHS when loading symbols, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 8e3084b 270/434: More work LRk parser k = 0, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 58190dc 272/434: LR Parser k=0 building correct LR items, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 0f8aa1d 265/434: Updated LRk README, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator f0cd9f6 280/434: Started on test for export parser feature,
ELPA Syncer <=
- [elpa] externals/parser-generator 3e9b4ee 279/434: Improved README, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 2920af5 286/434: Parser is exported but helper-functions are missing still, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator e904d46 289/434: Moved LR-parser exporter to stand-alone file and added documentation about export, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 099304e 296/434: Some coding-styling fixes, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 5a2dbb3 297/434: Removed unnecessary debug outputs, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 99b531f 300/434: Made some cpu complexity optimizations, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 17c36f8 309/434: Added cache to lr-items for prefix function, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator b6e2e64 312/434: Passing tests after memory optimization of LR parser, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 61dfc74 310/434: Added TODO-item, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator f371e2d 320/434: Added failing test for conflict, ELPA Syncer, 2021/11/29