branch: externals/parser-generator commit 603df447f55155755e6ef6c831b788155d99c705 Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Added failing unit tests for (parser--sort-list) --- parser.el | 22 +++++++++++++++++ test/parser-test.el | 71 ++++++++++++++++++++++++++++++++++++----------------- 2 files changed, 71 insertions(+), 22 deletions(-) diff --git a/parser.el b/parser.el index cb461b1..038378f 100644 --- a/parser.el +++ b/parser.el @@ -115,6 +115,25 @@ (setq parser--f-sets nil) (parser--load-symbols)) +(defun parser--sort-list (a b) + "Return non-nil if a element in A is greater than a element in B in lexicographic order." + (let ((max-index (1- (min (length a) (length b)))) + (index 0) + (continue t) + (response nil)) + (while (and + continue + (< index max-index)) + (let ((a-element (nth index a)) + (b-element (nth index b))) + (if (string-greaterp a-element b-element) + (setq continue nil) + (when (string-greaterp b-element a-element) + (setq response t) + (setq continue nil)))) + (setq index (1+ index))) + response)) + (defun parser--valid-e-p (symbol) "Return whether SYMBOL is the e identifier or not." (eq symbol 'e)) @@ -543,6 +562,9 @@ (setq input-tape-index (1+ input-tape-index))) (when (> first-length 0) (push first first-list)))))) + (message "first-list-before-sort: %s" first-list) + (setq first-list (sort first-list 'parser--sort-list)) + (message "first-list-after-sort: %s" first-list) first-list)))) ;; Definition p. 343, FOLLOW(β) = w, w is the set {w|β=>*aβy and w is in FIRST(y)} diff --git a/test/parser-test.el b/test/parser-test.el index 92074e3..e787e4c 100644 --- a/test/parser-test.el +++ b/test/parser-test.el @@ -9,6 +9,32 @@ (require 'parser) (require 'ert) +(defun parser-test--sort-list () + "Test `parser--sort-list'." + (message "Starting tests for (parser-test--sort-list)") + + (should + (equal + '((a b c) (b c d) (c e f)) + (sort '((a b c) (c e f) (b c d)) 'parser--sort-list))) + + (should + (equal + '((a b c) (a c c) (c e f)) + (sort '((a c c) (a b c) (c e f)) 'parser--sort-list))) + + (should + (equal + '((a b) (a c c) (c e f g h)) + (sort '((a c c) (a b) (c e f g h)) 'parser--sort-list))) + + (should + (equal + '((a) (b) (c)) + (sort '((a) (c) (b)) 'parser--sort-list))) + + (message "Passed tests for (parser--distinct)")) + (defun parser-test--distinct () "Test `parser--distinct'." (message "Starting tests for (parser--distinct)") @@ -134,7 +160,7 @@ (parser--set-look-ahead-number 2) (should (equal - '((d a) (c f)) + '((c f) (d a)) (parser--first 'S))) (message "Passed first 2 with semi-complex grammar") @@ -142,7 +168,7 @@ (parser--set-look-ahead-number 3) (should (equal - '(("d" "a" "m") ("c" "a" "m")) + '(("c" "a" "m") ("d" "a" "m")) (parser--first 'S))) (message "Passed first 3 with semi-complex grammar") @@ -150,7 +176,7 @@ (parser--set-look-ahead-number 1) (should (equal - '((e) (c) (b) (a)) + '((a) (a) (c) (e)) (parser--first 'S))) (message "Passed first 1 with complex grammar") @@ -212,40 +238,40 @@ (message "Starting tests for (parser--valid-grammar-p)") (should (equal - t - (parser--valid-grammar-p '((A B C) ("a" "b" "c") ((A "a")) A)))) + t + (parser--valid-grammar-p '((A B C) ("a" "b" "c") ((A "a")) A)))) (should (equal - nil - (parser--valid-grammar-p '((A B C) ("a" "b" "c") ((A "a")) (A))))) + nil + (parser--valid-grammar-p '((A B C) ("a" "b" "c") ((A "a")) (A))))) (should (equal - nil - (parser--valid-grammar-p '((A B C) (("a" "b") "c") ((A "a")) A)))) + nil + (parser--valid-grammar-p '((A B C) (("a" "b") "c") ((A "a")) A)))) (should (equal - nil - (parser--valid-grammar-p '(((A B) C) ("a" "b" "c") ((A "a")) A)))) + nil + (parser--valid-grammar-p '(((A B) C) ("a" "b" "c") ((A "a")) A)))) (should (equal - nil - (parser--valid-grammar-p '(((A B) C) ("a" "b" "c") ((A)) A)))) + nil + (parser--valid-grammar-p '(((A B) C) ("a" "b" "c") ((A)) A)))) (should (equal - nil - (parser--valid-grammar-p "A"))) + nil + (parser--valid-grammar-p "A"))) (should (equal - nil - (parser--valid-grammar-p '(A B C)))) + nil + (parser--valid-grammar-p '(A B C)))) (should (equal - nil - (parser--valid-grammar-p '((A B))))) + nil + (parser--valid-grammar-p '((A B))))) (should (equal - nil - (parser--valid-grammar-p '((A B C) (a (b c) "c") (A ("a" "b") (a b)) (B b) (C "c"))))) + nil + (parser--valid-grammar-p '((A B C) (a (b c) "c") (A ("a" "b") (a b)) (B b) (C "c"))))) (message "Passed tests for (parser--valid-grammar-p)")) @@ -309,8 +335,9 @@ (parser-test--valid-look-ahead-number-p) (parser-test--valid-production-p) (parser-test--valid-grammar-p) - (parser-test--distinct) (parser-test--valid-sentential-form-p) + (parser-test--distinct) + (parser-test--sort-list) (parser-test--first) (parser-test--e-free-first) (parser-test--follow)