branch: externals/parser-generator commit c6d3ad2e40c28c1c43ecc1d105030839a0f88604 Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Infix calculator working as expected without precedence rules --- parser-generator-lr.el | 28 ++++++------------ test/parser-generator-lr-test.el | 63 +++++++++++++++++++++++++++++++++++++--- 2 files changed, 68 insertions(+), 23 deletions(-) diff --git a/parser-generator-lr.el b/parser-generator-lr.el index ec9d9b7..d48cb4e 100644 --- a/parser-generator-lr.el +++ b/parser-generator-lr.el @@ -1610,7 +1610,7 @@ (setq look-ahead (nreverse look-ahead)) (parser-generator--debug - (message "look-ahead: %s" look-ahead) + (message "\nlook-ahead: %s" look-ahead) (message "look-ahead-full: %s" look-ahead-full)) (let ((table-index @@ -1787,7 +1787,7 @@ (while (< popped-items pop-items) (setq popped-item (pop pushdown-list)) (parser-generator--debug - (message "popped-item: %s" popped-item)) + (message "popped-item-from-pushdownlist-list: %s" popped-item)) (when (and (listp popped-item) (parser-generator--valid-symbol-p @@ -1799,6 +1799,9 @@ (push production-number output) (let ((popped-items-meta-contents)) + (setq + popped-items-contents + (reverse popped-items-contents)) ;; Collect arguments for translation (dolist (popped-item popped-items-contents) (parser-generator--debug @@ -1844,13 +1847,10 @@ popped-items-meta-contents))))) ;; If we just have one argument, pass it as a instead of a list - (if (= (length popped-items-meta-contents) 1) - (setq - popped-items-meta-contents - (car popped-items-meta-contents)) + (when (= (length popped-items-meta-contents) 1) (setq popped-items-meta-contents - (nreverse popped-items-meta-contents))) + (car popped-items-meta-contents))) (parser-generator--debug (message @@ -1881,17 +1881,12 @@ (gethash temp-hash-key translation-symbol-table))) - (when - symbol-translations - (setq - symbol-translations - (reverse symbol-translations))) (push partial-translation symbol-translations) (puthash temp-hash-key - (reverse symbol-translations) + symbol-translations translation-symbol-table) (setq translation @@ -1913,17 +1908,12 @@ (gethash temp-hash-key translation-symbol-table))) - (when - symbol-translations - (setq - symbol-translations - (reverse symbol-translations))) (push partial-translation symbol-translations) (puthash temp-hash-key - (reverse symbol-translations) + symbol-translations translation-symbol-table) (setq translation diff --git a/test/parser-generator-lr-test.el b/test/parser-generator-lr-test.el index e0fa6b2..ed56db9 100644 --- a/test/parser-generator-lr-test.el +++ b/test/parser-generator-lr-test.el @@ -620,6 +620,16 @@ (parser-generator-lr-translate))) (message "Passed 10/5") + + (switch-to-buffer buffer) + (kill-region (point-min) (point-max)) + (insert "8+10/5\n") + (should + (equal + 10 + (parser-generator-lr-translate))) + (message "Passed 8+10/5") + (switch-to-buffer buffer) (kill-region (point-min) (point-max)) (insert "10^2\n") @@ -631,6 +641,15 @@ (switch-to-buffer buffer) (kill-region (point-min) (point-max)) + (insert "1+10^2\n") + (should + (equal + 101 + (parser-generator-lr-translate))) + (message "Passed 1+10^2") + + (switch-to-buffer buffer) + (kill-region (point-min) (point-max)) (insert "-33\n") (should (equal @@ -643,18 +662,54 @@ (insert "3+4*5\n") (should (equal - 37 + 23 (parser-generator-lr-translate))) - (message "Passed 3+4*5 with expected wrong associativity") + (message "Passed 3+4*5") (switch-to-buffer buffer) (kill-region (point-min) (point-max)) (insert "3+4+5-6\n") (should (equal - 12 + 6 + (parser-generator-lr-translate))) + (message "Passed 3+4+5-6") + + (switch-to-buffer buffer) + (kill-region (point-min) (point-max)) + (insert "4*5+3\n") + (should + (equal + 32 + (parser-generator-lr-translate))) + (message "Passed 4*5+3 with expected wrong associativity") + + (switch-to-buffer buffer) + (kill-region (point-min) (point-max)) + (insert "10/1+1\n") + (should + (equal + 5 + (parser-generator-lr-translate))) + (message "Passed 10/1+1 with expected wrong associativity") + + (switch-to-buffer buffer) + (kill-region (point-min) (point-max)) + (insert "-33+5\n") + (should + (equal + -38 + (parser-generator-lr-translate))) + (message "Passed -33+5 with expected wrong associativity") + + (switch-to-buffer buffer) + (kill-region (point-min) (point-max)) + (insert "10^2+3\n") + (should + (equal + 100000 (parser-generator-lr-translate))) - (message "Passed 3+4+5-6 with expected wrong result") + (message "Passed 10^2+3 with expected wrong associativity") (kill-buffer))