branch: externals/parser-generator commit ecbbf21e09b1813ebba0234734de11825691040d Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Added test for exported translator --- parser-generator-lex-analyzer.el | 2 +- parser-generator-lr-export.el | 31 ++++++++--------- test/parser-generator-lr-export-test.el | 60 +++++++++++++++++++++++++++++++-- 3 files changed, 73 insertions(+), 20 deletions(-) diff --git a/parser-generator-lex-analyzer.el b/parser-generator-lex-analyzer.el index bce7d04..2f3dff7 100644 --- a/parser-generator-lex-analyzer.el +++ b/parser-generator-lex-analyzer.el @@ -97,7 +97,7 @@ (error "Lex-analyze failed to peek next look-ahead at %s, error: %s" index - (car (cdr error)))))) + error)))) (nreverse look-ahead))) (defun parser-generator-lex-analyzer--pop-token () diff --git a/parser-generator-lr-export.el b/parser-generator-lr-export.el index 9ecd2b7..4df6e21 100644 --- a/parser-generator-lr-export.el +++ b/parser-generator-lr-export.el @@ -54,56 +54,56 @@ ;; Action-tables (insert (format - "(defconst\n %s--action-tables\n %s\n \"Generated action-tables.\")\n\n" + "(defconst\n %s--action-tables\n %S\n \"Generated action-tables.\")\n\n" namespace parser-generator-lr--action-tables)) ;; Goto-tables (insert (format - "(defconst\n %s--goto-tables\n %s\n \"Generated goto-tables.\")\n\n" + "(defconst\n %s--goto-tables\n %S\n \"Generated goto-tables.\")\n\n" namespace parser-generator-lr--goto-tables)) ;; Table production-number (insert (format - "(defconst\n %s--table-productions-number-reverse\n %s\n \"Hash-table indexed by production-number and value is production.\")\n\n" + "(defconst\n %s--table-productions-number-reverse\n %S\n \"Hash-table indexed by production-number and value is production.\")\n\n" namespace parser-generator--table-productions-number-reverse)) ;; Table look-aheads (insert (format - "(defconst\n %s--table-look-aheads\n %s\n \"Hash-table of valid look-aheads.\")\n\n" + "(defconst\n %s--table-look-aheads\n %S\n \"Hash-table of valid look-aheads.\")\n\n" namespace parser-generator--table-look-aheads-p)) ;; Table terminals (insert (format - "(defconst\n %s--table-terminal-p\n %s\n \"Hash-table of valid terminals.\")\n\n" + "(defconst\n %s--table-terminal-p\n %S\n \"Hash-table of valid terminals.\")\n\n" namespace parser-generator--table-non-terminal-p)) ;; Table non-terminals (insert (format - "(defconst\n %s--table-non-terminal-p\n %s\n \"Hash-table of valid non-terminals.\")\n\n" + "(defconst\n %s--table-non-terminal-p\n %S\n \"Hash-table of valid non-terminals.\")\n\n" namespace parser-generator--table-non-terminal-p)) ;; Table translations (insert (format - "(defconst\n %s--table-translations\n %s\n \"Hash-table of translations.\")\n\n" + "(defconst\n %s--table-translations\n %S\n \"Hash-table of translations.\")\n\n" namespace parser-generator--table-translations)) ;; Lex-Analyzer Get Function (insert (format - "(defconst\n %s-lex-analyzer--get-function\n (lambda %s %s)\n \"Lex-Analyzer Get Function.\")\n\n" + "(defconst\n %s-lex-analyzer--get-function\n (lambda %S %S)\n \"Lex-Analyzer Get Function.\")\n\n" namespace (nth 2 parser-generator-lex-analyzer--get-function) (nth 3 parser-generator-lex-analyzer--get-function))) @@ -111,7 +111,7 @@ ;; Lex-Analyzer Function (insert (format - "(defconst\n %s-lex-analyzer--function\n (lambda %s %s)\n \"Lex-Analyzer Function.\")\n\n" + "(defconst\n %s-lex-analyzer--function\n (lambda %S %S)\n \"Lex-Analyzer Function.\")\n\n" namespace (nth 2 parser-generator-lex-analyzer--function) (nth 3 parser-generator-lex-analyzer--function))) @@ -124,7 +124,7 @@ (if parser-generator-lex-analyzer--reset-function (insert (format - "(lambda %s %s)\n" + "(lambda %S %S)\n" (nth 2 parser-generator-lex-analyzer--reset-function) (nth 3 parser-generator-lex-analyzer--reset-function))) (insert "nil\n")) @@ -133,21 +133,21 @@ ;; E-identifier (insert (format - "(defconst\n %s--e-identifier\n '%s\n \"e-identifier\")\n\n" + "(defconst\n %s--e-identifier\n '%S\n \"e-identifier\")\n\n" namespace parser-generator--e-identifier)) ;; EOF-identifier (insert (format - "(defconst\n %s--eof-identifier\n '%s\n \"EOF-identifier.\")\n\n" + "(defconst\n %s--eof-identifier\n '%S\n \"EOF-identifier.\")\n\n" namespace parser-generator--eof-identifier)) ;; Look-ahead number (insert (format - "(defconst\n %s--look-ahead-number\n %s\n \"Look-ahead number.\")\n\n" + "(defconst\n %s--look-ahead-number\n %S\n \"Look-ahead number.\")\n\n" namespace parser-generator--look-ahead-number)) @@ -169,9 +169,6 @@ "(defun %s-lex-analyzer--get-function (token) \"Get information about TOKEN.\" - (unless - %s-lex-analyzer--get-function - (error \"Missing lex-analyzer get function!\")) (let ((meta-information)) (condition-case error @@ -259,7 +256,7 @@ (error \"Lex-analyze failed to peek next look-ahead at %s, error: %s\" index - (car (cdr error)))))) + error)))) (nreverse look-ahead)))\n") ;; Lex-Analyzer Pop Token diff --git a/test/parser-generator-lr-export-test.el b/test/parser-generator-lr-export-test.el index f03b70c..0b81d8a 100644 --- a/test/parser-generator-lr-export-test.el +++ b/test/parser-generator-lr-export-test.el @@ -33,16 +33,18 @@ (push (nth (1- index) string) tokens) (setq index (1+ index))) (nreverse tokens)))) + (setq parser-generator-lex-analyzer--get-function (lambda (token) (car token))) - ;; Test parser + ;; Test parse (should (equal '(2 2 2 1 1) (parser-generator-lr-parse))) + (message "Passed parse before export") ;; Export parser (let ((export (parser-generator-lr-export-to-elisp "e--"))) @@ -54,7 +56,6 @@ (equal t (fboundp 'e---parse))) - (when (fboundp 'e---parse) (should (equal @@ -62,6 +63,61 @@ (e---parse)))) (message "Passed parse for exported parser"))) + (let ((buffer (generate-new-buffer "*a*"))) + (switch-to-buffer buffer) + (insert "aabb") + + (parser-generator-set-grammar '((Sp S) ("a" "b") ((Sp S) (S (S "a" S "b" (lambda(args) (let ((list "")) (dolist (item args) (when item (setq list (format "%s%s" item list)))) list)))) (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) + (with-current-buffer "*a*" + (when (<= (+ index 1) (point-max)) + (let ((start index) + (end (+ index 1))) + (let ((token (buffer-substring-no-properties start end))) + `(,token ,start . ,end))))))) + + (setq + parser-generator-lex-analyzer--get-function + (lambda (token) + (with-current-buffer "*a*" + (let ((start (car (cdr token))) + (end (cdr (cdr token)))) + (when (<= end (point-max)) + (buffer-substring-no-properties start end)))))) + + (should + (equal + "bbaaba" + (parser-generator-lr-translate))) + + (message "Passed translate before export") + + ;; Export parser + (let ((export (parser-generator-lr-export-to-elisp "fa"))) + (message "export:\n%s\n" export) + (with-temp-buffer + (insert export) + (eval-buffer) + (should + (equal + t + (fboundp 'fa-translate)))) + + (message "Executing exported translater") + + (when (fboundp 'fa-translate) + (should + (equal + "bbaaba" + (fa-translate)))) + (message "Passed translate for exported parser"))) + (message "Passed tests for (parser-generator-lr-export-to-elisp)")) (defun parser-generator-lr-export-test ()