branch: externals/parser-generator commit a96ab3ac9232f4dc984f9791cd18b756e804411a Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
More debugging LR k > 1 --- parser-generator-lr.el | 22 ++++++++++----- parser-generator.el | 2 +- test/parser-generator-lr-test.el | 58 +++++++++++++++++++++++++++++++++++----- 3 files changed, 68 insertions(+), 14 deletions(-) diff --git a/parser-generator-lr.el b/parser-generator-lr.el index cf51d4a..f606f98 100644 --- a/parser-generator-lr.el +++ b/parser-generator-lr.el @@ -712,6 +712,9 @@ (push (car look-ahead-item) look-ahead) (push look-ahead-item look-ahead))) + (parser-generator--debug + (message "look-ahead: %s" look-ahead)) + (let ((table-index (car pushdown-list))) (let ((action-table @@ -787,15 +790,21 @@ searching-match (< goto-index goto-table-length)) (let ((goto-item (nth goto-index goto-table))) - (let ((goto-item-look-ahead (list (car goto-item))) + (let ((goto-item-symbol (list (car goto-item))) (goto-item-next-index (car (cdr goto-item)))) - (push goto-item-look-ahead possible-look-aheads) + (push goto-item-symbol possible-look-aheads) + + (parser-generator--debug + (message "goto-item: %s" goto-item) + (message "goto-item-symbol: %s" goto-item-symbol)) - (when (equal goto-item-look-ahead a) + (when (equal goto-item-symbol a) (setq next-index goto-item-next-index) (setq searching-match nil)))) (setq goto-index (1+ goto-index))) + (parser-generator--debug + (message "next-index: %s" next-index)) (unless next-index (error @@ -804,6 +813,7 @@ table-index possible-look-aheads)) + ;; Maybe push both tokens here? (push (car a-full) pushdown-list) (push next-index pushdown-list) (parser-generator-lex-analyzer--pop-token))))) @@ -913,14 +923,14 @@ searching-match (< goto-index goto-table-length)) (let ((goto-item (nth goto-index goto-table))) - (let ((goto-item-look-ahead (list (car goto-item))) + (let ((goto-item-symbol (list (car goto-item))) (goto-item-next-index (car (cdr goto-item)))) (parser-generator--debug (message "goto-item: %s" goto-item) - (message "goto-item-look-ahead: %s" goto-item-look-ahead)) + (message "goto-item-symbol: %s" goto-item-symbol)) (when (equal - goto-item-look-ahead + goto-item-symbol production-lhs) (setq next-index goto-item-next-index) (setq searching-match nil)))) diff --git a/parser-generator.el b/parser-generator.el index c47252c..87ee3e3 100644 --- a/parser-generator.el +++ b/parser-generator.el @@ -11,7 +11,7 @@ (defvar parser-generator--debug - nil + t "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 f4357e9..4aeeb64 100644 --- a/test/parser-generator-lr-test.el +++ b/test/parser-generator-lr-test.el @@ -409,18 +409,62 @@ (parser-generator-set-grammar '((Sp S) ("a" "b") ((Sp S) (S (S "a" S "b")) (S e)) Sp)) (parser-generator-set-look-ahead-number 2) (parser-generator-process-grammar) + (let ((lr-items (parser-generator-lr--generate-goto-tables))) (parser-generator--debug - (message "lr-items: %s" (parser-generator--hash-values-to-list lr-items t))) + (message "all lr-items: %s" (parser-generator--hash-values-to-list lr-items t))) - ;; TODO Fix so that there is an accept path in look-ahead number 2 + (should + (equal + '((0 ((S 1))) + (1 (("a" 2))) + (2 ((S 3))) + (3 (("a" 4) ("b" 5))) + (4 ((S 6))) + (5 nil) + (6 (("a" 4) ("b" 7))) + (7 nil)) + (parser-generator--hash-to-list + parser-generator-lr--goto-tables))) + (message "Passed GOTO-tables k = 2") + + ;; TODO Validate lr-items here + + ;; (should + ;; (equal + ;; '((0 (((S) nil (S "a" S "b") ("a")) ((S) nil (S "a" S "b") (e)) ((S) nil nil ("a")) ((S) nil nil (e)) ((Sp) nil (S) (e)))) + ;; (1 (((S) (S) ("a" S "b") ("a")) ((S) (S) ("a" S "b") (e)) ((Sp) (S) nil (e)))) + ;; (2 (((S) (S "a") (S "b") ("a")) ((S) (S "a") (S "b") (e)) ((S) nil (S "a" S "b") ("a")) ((S) nil (S "a" S "b") ("b")) ((S) nil nil ("a")) ((S) nil nil ("b")))) + ;; (3 (((S) (S) ("a" S "b") ("a")) ((S) (S) ("a" S "b") ("b")) ((S) (S "a" S) ("b") ("a")) ((S) (S "a" S) ("b") (e)))) + ;; (4 (((S) (S "a") (S "b") ("a")) ((S) (S "a") (S "b") ("b")) ((S) nil (S "a" S "b") ("a")) ((S) nil (S "a" S "b") ("b")) ((S) nil nil ("a")) ((S) nil nil ("b")))) + ;; (5 (((S) (S "a" S "b") nil ("a")) ((S) (S "a" S "b") nil (e)))) + ;; (6 (((S) (S) ("a" S "b") ("a")) ((S) (S) ("a" S "b") ("b")) ((S) (S "a" S) ("b") ("a")) ((S) (S "a" S) ("b") ("b")))) + ;; (7 (((S) (S "a" S "b") nil ("a")) ((S) (S "a" S "b") nil ("b"))))) + ;; (parser-generator--hash-to-list + ;; lr-items))) + ;; (message "Passed LR-items k = 2") - (parser-generator--debug - (message "goto-tables: %s" (parser-generator--hash-values-to-list parser-generator-lr--goto-tables t))) (parser-generator-lr--generate-action-tables lr-items) - ;; TODO Should generate accept somewhere in this action-table (parser-generator--debug - (message "action-tables: %s" (parser-generator--hash-values-to-list parser-generator-lr--action-tables t)))) + (message "action-tables: %s" (parser-generator--hash-values-to-list parser-generator-lr--action-tables t))) + + ;; TODO Validate action-table here + + ;; (should + ;; (equal + ;; '((0 (((a) reduce 2) ((e) reduce 2))) + ;; (1 (((a) shift) ((e) accept))) + ;; (2 (((a) reduce 2) ((b) reduce 2))) + ;; (3 (((a) shift) ((b) shift))) + ;; (4 (((a) reduce 2) ((b) reduce 2))) + ;; (5 (((a) reduce 1) ((e) reduce 1))) + ;; (6 (((a) shift) ((b) shift))) + ;; (7 (((a) reduce 1) ((b) reduce 1)))) + ;; (parser-generator--hash-to-list + ;; parser-generator-lr--action-tables))) + ;; (message "Passed ACTION-tables k = 2") + + ) (setq parser-generator-lex-analyzer--function (lambda (index) @@ -629,7 +673,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) )