branch: externals/parser-generator commit ef60d962e7701c761560d2f543a4bbcbb1b13106 Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Added failing test for new function the generates grammar prefixes --- parser-generator.el | 48 +++++++++++++++++++++++++++++++++++++++++++ test/parser-generator-test.el | 16 +++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/parser-generator.el b/parser-generator.el index 2157d04..2b26858 100644 --- a/parser-generator.el +++ b/parser-generator.el @@ -160,6 +160,54 @@ (error "No grammar G defined!"))) (nth 0 G)) +(defun parser-generator--get-grammar-prefixes () + "Return all prefixes of length look-ahead number of terminals and non-terminals." + (let ((symbols + (append + (parser-generator--get-grammar-terminals) + (parser-generator--get-grammar-non-terminals))) + (prefixes) + (added-prefixes (make-hash-table :test 'equal)) + (k parser-generator--look-ahead-number) + (indexes) + (index) + (prefix) + (prefix-indexes)) + (let ((symbols-length (length symbols)) + (i 0) + (found-new t)) + + ;; Initialize indexes + (while (< i k) + (push 0 indexes) + (setq i (1+ i))) + + (while found-new + ;; Reset variables + (setq found-new nil) + (setq i 0) + (setq prefix nil) + (setq prefix-indexes nil) + + ;; Build prefix and prefix-indexes from actual state + (while (< i k) + (setq index (nth i indexes)) + (push (nth index symbols) prefix) + (push index prefix-indexes) + (setq i (1+ i))) + + (message "prefix: %s" prefix) + + ;; If prefix is new add to list + (unless (gethash prefix-indexes added-prefixes) + (push prefix prefixes) + (puthash prefix-indexes t added-prefixes)) + + ;; TODO Try to find a new index here + + )) + (sort prefixes '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 diff --git a/test/parser-generator-test.el b/test/parser-generator-test.el index ec8e1b8..5d74105 100644 --- a/test/parser-generator-test.el +++ b/test/parser-generator-test.el @@ -694,6 +694,21 @@ (message "Passed tests for (parser-generator--merge-max-terminals)")) +(defun parser-generator-test--get-grammar-prefixes () + "Test `parser-generator--get-grammar-prefixes'." + (message "Passed tests for (parser-generator--get-grammar-prefixes)") + + (parser-generator-set-look-ahead-number 1) + (parser-generator-set-grammar '((S A B) ("a" "b") ((S A) (S (B)) (B "a") (A "a") (A ("b" "a"))) S)) + (parser-generator-process-grammar) + + (should + (equal + '(("a") (A) ("b") (B) (S)) + (parser-generator--get-grammar-prefixes))) + + (message "Passed tests for (parser-generator--get-grammar-prefixes)")) + (defun parser-generator-test () "Run test." ;; (setq debug-on-error t) @@ -711,6 +726,7 @@ (parser-generator-test--get-grammar-rhs) (parser-generator-test--get-grammar-look-aheads) (parser-generator-test--merge-max-terminals) + (parser-generator-test--get-grammar-prefixes) ;; Algorithms (parser-generator-test--first)