branch: externals/parser-generator commit 2e76c4b57eca28495014e42d5d4d5a140624785e Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Added TODO items --- parser-generator-ll.el | 42 +++++++++++++++++++++++++++++++++------- test/parser-generator-ll-test.el | 31 ++++++++++++++++++++++++++--- 2 files changed, 63 insertions(+), 10 deletions(-) diff --git a/parser-generator-ll.el b/parser-generator-ll.el index 5c830d728e..7ce053e521 100644 --- a/parser-generator-ll.el +++ b/parser-generator-ll.el @@ -30,13 +30,40 @@ (message "\n;; Starting generation of LL(k) parser-tables..\n") (unless (parser-generator-ll--valid-grammar-p) (error "Invalid grammar specified!")) - (let ((parsing-table) - (parser-generator-ll--generate-parsing-table - (parser-generator-ll--generate-tables))) - ;; TODO Generate hash-based parsing table here + (let ((list-parsing-table + (parser-generator-ll--generate-parsing-table + (parser-generator-ll--generate-tables))) + (hash-parsing-table (make-hash-table :test 'equal))) + (dolist (state-list list-parsing-table) + (let ((state-key (nth 0 state-list)) + (state-look-aheads (nth 1 state-list)) + (state-hash-table (make-hash-table :test 'equal))) + (dolist (state-look-ahead-list state-look-aheads) + (let ((state-look-ahead-string (nth 0 state-look-ahead-list)) + (state-look-ahead-action (nth 1 state-look-ahead-list))) + (if (equal state-look-ahead-action 'reduce) + (let ((state-look-ahead-reduction + (nth 2 state-look-ahead-list)) + (state-look-ahead-production-number + (nth 3 state-look-ahead-list))) + (puthash + state-look-ahead-string + (list + state-look-ahead-action + state-look-ahead-reduction + state-look-ahead-production-number) + state-hash-table)) + (puthash + state-look-ahead-string + state-look-ahead-action + state-hash-table)))) + (puthash + state-key + state-hash-table + hash-parsing-table))) (setq parser-generator-ll--parsing-table - parsing-table)) + hash-parsing-table)) (message "\n;; Completed generation of LL(k) parser-tables.\n")) @@ -351,8 +378,9 @@ (list parser-generator--eof-identifier (list - eof-look-ahead - 'accept)) + (list + eof-look-ahead + 'accept))) parsing-table) (let ((stack-item (nth 0 terminal-mutation))) (when (and diff --git a/test/parser-generator-ll-test.el b/test/parser-generator-ll-test.el index 96bda89fe0..f2c6f0554d 100644 --- a/test/parser-generator-ll-test.el +++ b/test/parser-generator-ll-test.el @@ -186,7 +186,9 @@ ) ( $ - (($ $) accept) + ( + (($ $) accept) + ) ) ) parser-tables))) @@ -262,7 +264,9 @@ ) ( $ - (($ $) accept) + ( + (($ $) accept) + ) ) ) parser-tables))) @@ -285,7 +289,28 @@ "Test `parser-generator-ll-generate-parser-tables'." (message "Started tests for (parser-generator-ll-generate-parser-tables)") - ;; TODO Do testing of hash-table generation here + (parser-generator-set-eof-identifier '$) + (parser-generator-set-e-identifier 'e) + (parser-generator-set-look-ahead-number 2) + (parser-generator-set-grammar + '( + (S A) + (a b) + ( + (S e (a b A)) + (A (S a a) b) + ) + S + ) + ) + (parser-generator-process-grammar) + (parser-generator-ll-generate-parser-tables) + (message "parser-generator-ll--parsing-table: %S" parser-generator-ll--parsing-table) + (should + (equal + #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8125 data (((S) ($)) #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8125 data ((a b) (reduce (a b ((A) ($))) 1) ($ $) (reduce (e) 0))) ((A) ($)) #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8125 data ((b $) (reduce (b) 3) (a a) (reduce (((S) (a a)) a a) 2) (a b) (reduce (((S) (a a)) a a) 2))) ((S) (a a)) #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.81 [...] + parser-generator-ll--parsing-table)) + ;; TODO Make this pass (message "Passed tests for (parser-generator-ll-generate-parser-tables)"))