branch: externals/parser-generator commit 7fe73186d8b9e66fb019958ffaf979290fb285c9 Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Passed test for distinct LR-items for grammar --- parser.el | 22 ++++++++++++++++++---- test/parser-test.el | 36 ++++++++++++++++++++++++------------ 2 files changed, 42 insertions(+), 16 deletions(-) diff --git a/parser.el b/parser.el index a98d05e..2325f68 100644 --- a/parser.el +++ b/parser.el @@ -115,6 +115,19 @@ (error "No grammar G defined!"))) (nth 1 G)) +(defun parser--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) + (if (hash-table-p hash-table) + (progn + (maphash + (lambda (k v) (push (list k v) result)) + hash-table) + (if un-sorted + (nreverse result) + (sort (nreverse result) (lambda (a b) (< (car a) (car b)))))) + nil))) + (defun parser--load-symbols () "Load terminals and non-terminals in grammar." (let ((terminals (parser--get-grammar-terminals))) @@ -687,9 +700,10 @@ (setq popped-item (pop unmarked-lr-items)) (setq lr-item-index (car popped-item)) (setq lr-item (car (cdr popped-item))) - (message "lr-item-index: %s" lr-item-index) - (message "lr-item: %s" lr-item) - (message "popped-item: %s" popped-item) + (parser--debug + (message "lr-item-index: %s" lr-item-index) + (message "lr-item: %s" lr-item) + (message "popped-item: %s" popped-item)) (puthash lr-item lr-item-index marked-lr-items) (puthash lr-item-index lr-item parser--table-lr-items) (setq goto-table-table nil) @@ -725,7 +739,7 @@ (push `(,lr-item-index ,goto-table-table) goto-table))) (setq parser--goto-table (nreverse goto-table)))) - parser--goto-table) + parser--table-lr-items) ;; Algorithm 5.8, p. 386 (defun parser--lr-items-for-prefix (γ) diff --git a/test/parser-test.el b/test/parser-test.el index 8effcf3..2250b7a 100644 --- a/test/parser-test.el +++ b/test/parser-test.el @@ -230,19 +230,31 @@ ;; Example 5.30, p. 389 (parser--set-grammar '((Sp S) (a b) ((Sp S) (S (S a S b)) (S e)) Sp)) (parser--set-look-ahead-number 1) - (message "GOTO-table: %s" (parser--lr-items-for-grammar)) - (should - (equal - '((0 (S 1)) - (1 (a 2)) - (2 (S 3)) - (3 (a 4) (b 5)) - (4 (S 6)) - (5 nil) - (6 (a 4) (b 7)) - (7 nil)) - (parser--lr-items-for-grammar))) + ;; (message "GOTO-table: %s" (parser--lr-items-for-grammar)) + ;; (message "LR-items: %s" (parser--hash-to-list (parser--lr-items-for-grammar))) + + (should + (equal + '((0 (S nil (S a S b) (a))) + (1 (Sp (S) nil (e))) + (2 (S (S) (a S b) (e))) + (3 (S (S a) (S b) (e))) + (4 (S nil (S a S b) (a))) + (5 (S nil (S a S b) (b))) + (6 (S nil nil (b))) + (7 (S (S) (a S b) (b))) + (8 (S (S a) (S b) (b))) + (9 (S nil (S a S b) (a))) + (10 (S (S) (a S b) (a))) + (11 (S (S a) (S b) (a))) + (12 (S (S a S) (b) (a))) + (13 (S (S a S b) nil (a))) + (14 (S (S a S) (b) (b))) + (15 (S (S a S b) nil (b))) + (16 (S (S a S) (b) (e))) + (17 (S (S a S b) nil (e)))) + (parser--hash-to-list (parser--lr-items-for-grammar)))) (message "Passed LR-items for example 5.30") (message "Passed tests for (parser--lr-items-for-grammar)"))