branch: externals/parser-generator commit 54857e466e9f0b7cd1fc1e1edb63f93a16333dab Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Added failing unit test for translation via LRk --- parser-generator-lr.el | 15 +++++++++------ parser-generator.el | 2 +- test/parser-generator-lr-test.el | 24 ++++++++++++++++++++++-- 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/parser-generator-lr.el b/parser-generator-lr.el index 031215a..5251685 100644 --- a/parser-generator-lr.el +++ b/parser-generator-lr.el @@ -803,7 +803,7 @@ table-index possible-look-aheads)) - (push a-full pushdown-list) + (push (car a-full) pushdown-list) (push next-index pushdown-list) (parser-generator-lex-analyzer--pop-token))))) @@ -835,19 +835,21 @@ (popped-item)) (while (< popped-items pop-items) (setq popped-item (pop pushdown-list)) - (parser-generator--debug - (message "popped-item: %s" popped-item)) + (message "popped-item: %s" popped-item) (when (and (listp popped-item) - (listp (car popped-item)) - (parser-generator--valid-terminal-p - (car (car popped-item)))) + (parser-generator--valid-symbol-p + (car popped-item))) (push (car popped-item) popped-items-contents)) (setq popped-items (1+ popped-items))))) (push production-number output) + ;; TODO If popped items contain a non-terminal + ;; it should be evaluated first before + ;; translation is executed. + ;; Perform translation at reduction if specified (when (parser-generator--get-grammar-translation-by-number @@ -871,6 +873,7 @@ (unless (listp partial-translation) (setq partial-translation (list partial-translation))) (dolist (part-translation partial-translation) + (message "part-translation: %s" part-translation) (push part-translation translation)))))) (let ((new-table-index (car pushdown-list))) diff --git a/parser-generator.el b/parser-generator.el index 87ee3e3..c47252c 100644 --- a/parser-generator.el +++ b/parser-generator.el @@ -11,7 +11,7 @@ (defvar parser-generator--debug - t + nil "Whether to print debug messages or not.") (defvar parser-generator--e-identifier diff --git a/test/parser-generator-lr-test.el b/test/parser-generator-lr-test.el index acaff6a..6eea0b9 100644 --- a/test/parser-generator-lr-test.el +++ b/test/parser-generator-lr-test.el @@ -488,7 +488,7 @@ (switch-to-buffer buffer) (insert "if (a) { b; }") - (parser-generator-set-grammar '((Sp S) (";" OPEN_ROUND_BRACKET CLOSE_ROUND_BRACKET IF OPEN_CURLY_BRACKET CLOSE_CURLY_BRACKET VARIABLE) ((Sp S) (S (IF OPEN_ROUND_BRACKET VARIABLE CLOSE_ROUND_BRACKET OPEN_CURLY_BRACKET VARIABLE ";" CLOSE_CURLY_BRACKET (lambda(args) (format "(when %s %s)" (nth 2 args) (nth 5 args)))))) Sp)) + (parser-generator-set-grammar '((Sp S) (";" OPEN_ROUND_BRACKET CLOSE_ROUND_BRACKET ECHO IF OPEN_CURLY_BRACKET CLOSE_CURLY_BRACKET VARIABLE) ((Sp S) (S (IF OPEN_ROUND_BRACKET VARIABLE CLOSE_ROUND_BRACKET OPEN_CURLY_BRACKET VARIABLE ";" CLOSE_CURLY_BRACKET (lambda(args) (format "(when %s %s)" (nth 2 args) (nth 5 args)))))) Sp)) (parser-generator-set-look-ahead-number 1) (parser-generator-process-grammar) (parser-generator-lr-generate-parser-tables) @@ -506,6 +506,8 @@ (cond ((looking-at "if") (setq token `(IF ,(match-beginning 0) . ,(match-end 0)))) + ((looking-at "echo") + (setq token `(ECHO ,(match-beginning 0) . ,(match-end 0)))) ((looking-at "(") (setq token `(OPEN_ROUND_BRACKET ,(match-beginning 0) . ,(match-end 0)))) ((looking-at ")") @@ -534,11 +536,29 @@ (equal '("(when a b)") (parser-generator-lr-translate))) + (message "Passed test with non-nested translation") + + (switch-to-buffer buffer) + (kill-region (point-min) (point-max)) + + (parser-generator-set-grammar '((Sp S T) (";" OPEN_ROUND_BRACKET CLOSE_ROUND_BRACKET ECHO IF OPEN_CURLY_BRACKET CLOSE_CURLY_BRACKET VARIABLE) ((Sp S) (S (IF OPEN_ROUND_BRACKET VARIABLE CLOSE_ROUND_BRACKET OPEN_CURLY_BRACKET T CLOSE_CURLY_BRACKET (lambda(args) (format "(when %s %s)" (nth 2 args) (nth 5 args))))) (T (ECHO VARIABLE ";" (lambda(args) (format "(message %s)" (nth 1 args)))) (VARIABLE ";" (lambda(args) (format "%s" (nth 0 args)))))) Sp)) + (parser-generator-set-look-ahead-number 1) + (parser-generator-process-grammar) + (parser-generator-lr-generate-parser-tables) + + (insert "if (a) { echo b; }") + + (should + (equal + '("(when a (message b))") + (parser-generator-lr-translate))) + + (message "Passed test with nested-translation with depth 2") (switch-to-buffer buffer) (kill-region (point-min) (point-max)) (goto-char 1) - (insert "if (a) { b }") + (insert "if (a) { echo b }") (should-error (parser-generator-lr-parse))