branch: externals/parser-generator commit 922033f02cc10e09f1c26ca87cf6c2b770c2f1c5 Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Various stuff --- parser-generator-lr.el | 11 ++++++--- test/parser-generator-lr-test.el | 53 ++++++++++++++++++++++------------------ 2 files changed, 36 insertions(+), 28 deletions(-) diff --git a/parser-generator-lr.el b/parser-generator-lr.el index 3ee60f2..c6078bd 100644 --- a/parser-generator-lr.el +++ b/parser-generator-lr.el @@ -108,15 +108,18 @@ (error "Expecting production number for %s from LR-item %s!" production lr-item)) (if (and - (= production-number 0) - (= (length u) 1) - (parser-generator--valid-e-p (car u))) + (>= (length u) 1) + (parser-generator--valid-e-p + (nth (1- (length u)) u))) (progn ;; Reduction by first production ;; of empty look-ahead means grammar has been accepted + (message "accept of %s" u) (push (list u 'accept) action-table) (setq found-action t)) + (message "no accept of %s, p: %s" u production-number) + ;; save reduction action in action table (push (list u 'reduce production-number) action-table) (setq found-action t)))))))))) @@ -592,7 +595,7 @@ ;; transfer to an error recovery routine). (error (format - "Invalid syntax! Expected one of %s found %s at index %s" + "Invalid syntax! Expected one of %s found %s at index %s " possible-look-aheads look-ahead parser-generator-lex-analyzer--index) diff --git a/test/parser-generator-lr-test.el b/test/parser-generator-lr-test.el index 75c5fef..56f717a 100644 --- a/test/parser-generator-lr-test.el +++ b/test/parser-generator-lr-test.el @@ -312,6 +312,8 @@ (parser-generator-set-look-ahead-number 1) (parser-generator-process-grammar) (parser-generator-lr-generate-parser-tables) + (message "goto-tables: %s" (parser-generator--hash-values-to-list parser-generator-lr--goto-tables t)) + (message "action-tables: %s" (parser-generator--hash-values-to-list parser-generator-lr--action-tables t)) (setq parser-generator-lex-analyzer--function (lambda (index) @@ -365,29 +367,32 @@ (parser-generator-lr-test--parse-incremental-vs-regular) (message "Passed incremental-tests") - ;; (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--hash-values-to-list (parser-generator-lr-generate-parser-tables) t))) - ;; (message "lr-items: %s" lr-items)) - ;; (setq - ;; parser-generator-lex-analyzer--function - ;; (lambda (index) - ;; (let* ((string '(("a" 1 . 2) ("a" 2 . 3) ("b" 3 . 4))) - ;; (string-length (length string)) - ;; (max-index index) - ;; (tokens)) - ;; (while (and - ;; (< (1- index) string-length) - ;; (< (1- index) max-index)) - ;; (push (nth (1- index) string) tokens) - ;; (setq index (1+ index))) - ;; (nreverse tokens)))) - ;; (should - ;; (equal - ;; '(2 2 2 1 1) - ;; (parser-generator-lr-parse))) - ;; (message "Passed test with terminals as string with look-ahead-number 2") + (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--hash-values-to-list (parser-generator-lr-generate-parser-tables) t))) + (message "lr-items: %s" lr-items) + (message "goto-tables: %s" (parser-generator--hash-values-to-list parser-generator-lr--goto-tables t)) + ;; TODO Should generate accept somewhere in this action-table + (message "action-tables: %s" (parser-generator--hash-values-to-list parser-generator-lr--action-tables t))) + (setq + parser-generator-lex-analyzer--function + (lambda (index) + (let* ((string '(("a" 1 . 2) ("a" 2 . 3) ("b" 3 . 4))) + (string-length (length string)) + (max-index index) + (tokens)) + (while (and + (< (1- index) string-length) + (< (1- index) max-index)) + (push (nth (1- index) string) tokens) + (setq index (1+ index))) + (nreverse tokens)))) + (should + (equal + '(2 2 2 1 1) + (parser-generator-lr-parse))) + (message "Passed test with terminals as string with look-ahead-number 2") (message "Passed tests for (parser-generator-lr--parse)")) @@ -551,7 +556,7 @@ (defun parser-generator-lr-test () "Run test." - (setq debug-on-error t) + ;; (setq debug-on-error t) (parser-generator-lr-test--items-for-prefix) (parser-generator-lr-test--items-valid-p)