branch: externals/parser-generator commit 069bf34ee5d3ca3c3c9f0e9969f8e42aa2c7c4a1 Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Added test for new helper function list of symbol --- parser-generator.el | 80 +++++++++++++++++++++---------------------- test/parser-generator-test.el | 35 ++++++++++++++----- 2 files changed, 66 insertions(+), 49 deletions(-) diff --git a/parser-generator.el b/parser-generator.el index b98f352..116f1f0 100644 --- a/parser-generator.el +++ b/parser-generator.el @@ -90,6 +90,15 @@ (push element new-elements))) (nreverse new-elements))) +(defun parser-generator--generate-list-of-symbol (k symbol) + "Generate list of K number of SYMBOL." + (let ((list-index 0) + (list)) + (while (< list-index k) + (push symbol list) + (setq list-index (1+ list-index))) + list)) + (defun parser-generator--get-grammar-look-aheads () "Return all possible look-ahead set." (unless parser-generator--look-ahead-number @@ -160,46 +169,6 @@ (error "No grammar G defined!"))) (nth 0 G)) -(defun parser-generator--generate-list-of-symbol (k symbol) - "Generate list of K number of SYMBOL." - (let ((list-index 0) - (list)) - (while (< list-index k) - (push symbol list) - (setq list-index (1+ list-index))) - list)) - -(defun parser-generator--get-list-permutations (list k) - "Return all possible LIST permutations length K." - (let ((permutations) - (permutations-length 1)) - (let ((list-length (length list)) - (i 0)) - (while (< i k) - - (let ((times (expt list-length (- k (1+ i)))) - (global-i 0)) - (while (< global-i permutations-length) - ;; For each list.. - (let ((list-i 0)) - (while (< list-i list-length) - - ;; Add it |list| ^ (k - i) times to list - (let ((times-i 0)) - (while (< times-i times) - (if (= i 0) - (push (list (nth list-i list)) permutations) - (push (nth list-i list) (nth global-i permutations))) - (setq global-i (1+ global-i)) - (setq times-i (1+ times-i)))) - (setq list-i (1+ list-i)))) - - (when (= i 0) - (setq permutations-length (length permutations))))) - - (setq i (1+ i)))) - (sort permutations 'parser-generator--sort-list))) - (defun parser-generator--get-grammar-production-number (production) "If PRODUCTION exist, return it's number." (unless parser-generator--table-productions-number @@ -248,6 +217,37 @@ (error "Table for translations by production-number is undefined!")) (gethash production-number parser-generator--table-translations)) +(defun parser-generator--get-list-permutations (list k) + "Return all possible LIST permutations length K." + (let ((permutations) + (permutations-length 1)) + (let ((list-length (length list)) + (i 0)) + (while (< i k) + + (let ((times (expt list-length (- k (1+ i)))) + (global-i 0)) + (while (< global-i permutations-length) + ;; For each list.. + (let ((list-i 0)) + (while (< list-i list-length) + + ;; Add it |list| ^ (k - i) times to list + (let ((times-i 0)) + (while (< times-i times) + (if (= i 0) + (push (list (nth list-i list)) permutations) + (push (nth list-i list) (nth global-i permutations))) + (setq global-i (1+ global-i)) + (setq times-i (1+ times-i)))) + (setq list-i (1+ list-i)))) + + (when (= i 0) + (setq permutations-length (length permutations))))) + + (setq i (1+ i)))) + (sort permutations 'parser-generator--sort-list))) + (defun parser-generator--hash-to-list (hash-table &optional un-sorted) "Return a list that represent the HASH-TABLE. Each element is a list: (list key value), optionally UN-SORTED." (let (result) diff --git a/test/parser-generator-test.el b/test/parser-generator-test.el index ea3195dc..00f0c8f 100644 --- a/test/parser-generator-test.el +++ b/test/parser-generator-test.el @@ -740,24 +740,41 @@ (message "Passed tests for (parser-generator--get-list-permutations)")) +(defun parser-generator-test--generate-list-of-symbol () + "Test `parser-generator--generate-list-of-symbol'." + (message "Starting tests for (parser-generator-test--generate-list-of-symbol)") + + (should + (equal + '(a a a) + (parser-generator--generate-list-of-symbol 3 'a))) + + (should + (equal + '((a b) (a b)) + (parser-generator--generate-list-of-symbol 2 '(a b)))) + + (message "Passed tests for (parser-generator-test--generate-list-of-symbol)")) + (defun parser-generator-test () "Run test." ;; (setq debug-on-error t) ;; Helpers - (parser-generator-test--valid-look-ahead-p) - (parser-generator-test--valid-look-ahead-number-p) - (parser-generator-test--valid-production-p) + (parser-generator-test--distinct) + (parser-generator-test--generate-list-of-symbol) + (parser-generator-test--get-grammar-look-aheads) + (parser-generator-test--get-grammar-rhs) + (parser-generator-test--get-list-permutations) + (parser-generator-test--merge-max-terminals) + (parser-generator-test--sort-list) (parser-generator-test--valid-grammar-p) + (parser-generator-test--valid-look-ahead-number-p) + (parser-generator-test--valid-look-ahead-p) (parser-generator-test--valid-non-terminal-p) + (parser-generator-test--valid-production-p) (parser-generator-test--valid-sentential-form-p) (parser-generator-test--valid-terminal-p) - (parser-generator-test--distinct) - (parser-generator-test--sort-list) - (parser-generator-test--get-grammar-rhs) - (parser-generator-test--get-grammar-look-aheads) - (parser-generator-test--merge-max-terminals) - (parser-generator-test--get-list-permutations) ;; Algorithms (parser-generator-test--first)