branch: externals/parser-generator commit 2181545d262dfa8b43283cccb303ced539d40257 Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Implemented test for validation of LL(1) grammar --- parser-generator-ll.el | 27 ++++++++----- test/parser-generator-ll-test.el | 82 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 97 insertions(+), 12 deletions(-) diff --git a/parser-generator-ll.el b/parser-generator-ll.el index fd40b6e8d4..b38843cdf2 100644 --- a/parser-generator-ll.el +++ b/parser-generator-ll.el @@ -122,10 +122,11 @@ (look-ahead-list (parser-generator-lex-analyzer--peek-next-look-ahead)) (look-ahead)) - (message "\nstack: %S" stack) - (message "output: %S" output) - (message "state: %S" state) - (message "state-action-table: %S" state-action-table) + (parser-generator--debug + (message "\nstack: %S" stack) + (message "output: %S" output) + (message "state: %S" state) + (message "state-action-table: %S" state-action-table)) (unless state-action-table (signal @@ -138,7 +139,8 @@ (if look-ahead-list (progn - (message "look-ahead-list: %S" look-ahead-list) + (parser-generator--debug + (message "look-ahead-list: %S" look-ahead-list)) (dolist (look-ahead-list-item look-ahead-list) (push (car look-ahead-list-item) look-ahead)) (setq look-ahead (reverse look-ahead))) @@ -146,7 +148,8 @@ look-ahead eof-look-ahead)) - (message "look-ahead: %S" look-ahead) + (parser-generator--debug + (message "look-ahead: %S" look-ahead)) (unless (gethash (format "%S" look-ahead) @@ -172,19 +175,23 @@ (format "%S" look-ahead) state-action-table)) (action-type action)) - (message "action: %S" action) + (parser-generator--debug + (message "action: %S" action)) (when (listp action) (setq action-type (car action))) - (message "action-type: %S" action-type) + (parser-generator--debug + (message "action-type: %S" action-type)) (cond ((equal action-type 'pop) - (message "pushed: %S" look-ahead) + (parser-generator--debug + (message "pushed: %S" look-ahead)) (parser-generator-lex-analyzer--pop-token) (pop stack)) ((equal action-type 'reduce) - (message "reduced: %S" (nth 1 action)) + (parser-generator--debug + (message "reduced: %S" (nth 1 action))) (pop stack) (unless (equal (nth 1 action) e-reduction) (dolist (reduce-item (reverse (nth 1 action))) diff --git a/test/parser-generator-ll-test.el b/test/parser-generator-ll-test.el index 299124950e..e25bef4014 100644 --- a/test/parser-generator-ll-test.el +++ b/test/parser-generator-ll-test.el @@ -471,7 +471,45 @@ parser-generator-ll--table t))) - ;; TODO Should test k = 1 here as well + (parser-generator-set-eof-identifier '$) + (parser-generator-set-e-identifier 'e) + (parser-generator-set-look-ahead-number 1) + (parser-generator-set-grammar + '( + (S A) + (a b) + ( + (S (a A S) b) + (A a (b S A)) + ) + S + ) + ) + (parser-generator-process-grammar) + (parser-generator-ll-generate-table) + ;; (message "parsing-table: %S" (parser-generator--hash-to-list parser-generator-ll--table t)) + (should + (equal + '( + ("S" + ( + ("(b)" (reduce (b) 1)) + ("(a)" (reduce (a A S) 0)) + ) + ) + ("A" + ( + ("(b)" (reduce (b S A) 3)) + ("(a)" (reduce (a) 2)) + ) + ) + ("b" (("(b)" pop))) + ("a" (("(a)" pop))) + ("$" (("($)" accept))) + ) + (parser-generator--hash-to-list + parser-generator-ll--table + t))) (message "Passed tests for (parser-generator-ll-generate-table)")) @@ -643,7 +681,47 @@ "Test `parser-generator-ll--valid-grammar-k-eq-1-p'." (message "Started tests for (parser-generator-ll--valid-grammar-k-eq-1-p)") - ;; TODO Implement this + (parser-generator-set-eof-identifier '$) + (parser-generator-set-e-identifier 'e) + (parser-generator-set-look-ahead-number 1) + (parser-generator-set-grammar + '( + (S A B) + (a b) + ( + (S (a A S) b B) + (A a (b S A)) + (B a) + ) + S + ) + ) + (parser-generator-process-grammar) + (should + (equal + nil + (parser-generator-ll--valid-grammar-k-eq-1-p))) + + (parser-generator-set-eof-identifier '$) + (parser-generator-set-e-identifier 'e) + (parser-generator-set-look-ahead-number 1) + (parser-generator-set-grammar + '( + (S A B) + (a b c) + ( + (S (a A S) b B) + (A a (b S A)) + (B c) + ) + S + ) + ) + (parser-generator-process-grammar) + (should + (equal + t + (parser-generator-ll--valid-grammar-k-eq-1-p))) (message "Passed tests for (parser-generator-ll--valid-grammar-k-eq-1-p)"))