branch: externals/parser-generator commit ddd5967b419f39d17ebe521cf5e41c05c417295b Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Passed test for nested translations --- parser-generator-lr.el | 56 +++++++++++++++++++++++++++------------- test/parser-generator-lr-test.el | 10 +++---- 2 files changed, 43 insertions(+), 23 deletions(-) diff --git a/parser-generator-lr.el b/parser-generator-lr.el index 5251685..cf51d4a 100644 --- a/parser-generator-lr.el +++ b/parser-generator-lr.el @@ -671,6 +671,7 @@ (let ((accept) (pre-index 0) + (translation-symbol-table (make-hash-table :test 'equal)) (e-list (parser-generator--generate-list-of-symbol parser-generator--look-ahead-number @@ -835,31 +836,46 @@ (popped-item)) (while (< popped-items pop-items) (setq popped-item (pop pushdown-list)) - (message "popped-item: %s" popped-item) + (parser-generator--debug + (message "popped-item: %s" popped-item)) (when (and (listp popped-item) (parser-generator--valid-symbol-p (car popped-item))) (push - (car popped-item) + 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 production-number) + (let ((popped-items-meta-contents)) (dolist (popped-item popped-items-contents) - (push - (parser-generator-lex-analyzer--get-function - popped-item) - popped-items-meta-contents)) + (parser-generator--debug + (message + "popped-item: %s" + popped-item)) + (if (parser-generator--valid-terminal-p + (car popped-item)) + (push + (parser-generator-lex-analyzer--get-function + popped-item) + popped-items-meta-contents) + (if (gethash + popped-item + translation-symbol-table) + (push + (gethash + popped-item + translation-symbol-table) + popped-items-meta-contents) + (push + nil + popped-items-meta-contents)))) (setq popped-items-meta-contents (nreverse popped-items-meta-contents)) @@ -869,12 +885,18 @@ (parser-generator--get-grammar-translation-by-number production-number) popped-items-meta-contents))) - (when partial-translation - (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)))))) + (parser-generator--debug + (message + "translation-symbol-table: %s = %s" + production-lhs + partial-translation)) + (puthash + production-lhs + partial-translation + translation-symbol-table) + (setq + translation + partial-translation)))) (let ((new-table-index (car pushdown-list))) (let ((goto-table @@ -926,8 +948,6 @@ (error "Parsed entire string without getting accepting! Output: %s" (reverse output))) - (when translation - (setq translation (nreverse translation))) (when history (setq history (reverse history))) (when output diff --git a/test/parser-generator-lr-test.el b/test/parser-generator-lr-test.el index 6eea0b9..f4357e9 100644 --- a/test/parser-generator-lr-test.el +++ b/test/parser-generator-lr-test.el @@ -452,7 +452,7 @@ (switch-to-buffer buffer) (insert "aabb") - (parser-generator-set-grammar '((Sp S) ("a" "b") ((Sp S) (S (S "a" S "b" (lambda(args) (nreverse args)))) (S e)) Sp)) + (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) @@ -478,7 +478,7 @@ (should (equal - '("b" "a" "b" "a") + "bbaaba" (parser-generator-lr-translate))) (kill-buffer buffer)) @@ -534,7 +534,7 @@ (should (equal - '("(when a b)") + "(when a b)" (parser-generator-lr-translate))) (message "Passed test with non-nested translation") @@ -550,7 +550,7 @@ (should (equal - '("(when a (message b))") + "(when a (message b))" (parser-generator-lr-translate))) (message "Passed test with nested-translation with depth 2") @@ -629,7 +629,7 @@ (parser-generator-lr-test--generate-action-tables) (parser-generator-lr-test-parse) (parser-generator-lr-test-translate) - (parser-generator-lr-test-parse-k-2) + ;; (parser-generator-lr-test-parse-k-2) )