branch: externals/parser-generator
commit f0cd9f6f2516ed76dc4b2c9c59146caaece10e4c
Author: Christian Johansson <[email protected]>
Commit: Christian Johansson <[email protected]>
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)