branch: externals/parser-generator commit f0cd9f6f2516ed76dc4b2c9c59146caaece10e4c Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@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)