branch: externals/parser-generator commit d7f43d7909fed00e0a727cb5eea5a92609e470a0 Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Sorting lr-items for prefix before return --- README.md | 14 +++++++------- parser.el | 12 ++++++++++-- test/parser-test.el | 26 +++++++++++++------------- 3 files changed, 30 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 7e3ef9b..15da72d 100644 --- a/README.md +++ b/README.md @@ -149,11 +149,11 @@ Calculate the set of LR(k) items valid for any viable prefix S. (parser--set-look-ahead-number 1) (should (equal - '((S nil nil (a)) - (S nil (S a S b) (a)) - (S nil nil (e)) - (S nil (S a S b) (e)) - (Sp nil (S) (e))) + '((S nil (S a S b) (a)) + (S nil (S a S b) (e)) + (S nil nil (a)) + (S nil nil (e)) + (Sp nil (S) (e))) (parser--lr-items-for-prefix 'e))) ``` @@ -163,9 +163,9 @@ Calculate the set of LR(k) items valid for any viable prefix S. (parser--set-look-ahead-number 1) (should (equal - '((Sp (S) nil (e)) + '((S (S) (a S b) (a)) (S (S) (a S b) (e)) - (S (S) (a S b) (a))) + (Sp (S) nil (e))) (parser--lr-items-for-prefix 'S))) ``` diff --git a/parser.el b/parser.el index 6a0ef52..5c4807d 100644 --- a/parser.el +++ b/parser.el @@ -149,6 +149,14 @@ (< index length)) (let ((a-element (nth index a)) (b-element (nth index b))) + (while (and + a-element + (listp a-element)) + (setq a-element (car a-element))) + (while (and + b-element + (listp b-element)) + (setq b-element (car b-element))) (if (string-greaterp a-element b-element) (setq continue nil) (when (string-greaterp b-element a-element) @@ -688,7 +696,7 @@ (setq rhs-rest-first '((e)))) (let ((sub-production (parser--get-grammar-rhs rhs-first))) (parser--debug - (message "sub-production: %s" sub-production)) + (message "sub-production: %s" sub-production)) ;; For each production with B as LHS (dolist (sub-rhs sub-production) @@ -786,7 +794,7 @@ (parser--debug (message "γ: %s" γ)) - (gethash γ lr-items)))) + (sort (gethash γ lr-items) 'parser--sort-list)))) (provide 'parser) diff --git a/test/parser-test.el b/test/parser-test.el index 4404665..bf3ccee 100644 --- a/test/parser-test.el +++ b/test/parser-test.el @@ -233,30 +233,30 @@ (should (equal - '((S nil nil (a)) - (S nil (S a S b) (a)) - (S nil nil (e)) - (S nil (S a S b) (e)) - (Sp nil (S) (e))) + '((S nil (S a S b) (a)) + (S nil (S a S b) (e)) + (S nil nil (a)) + (S nil nil (e)) + (Sp nil (S) (e))) (parser--lr-items-for-prefix 'e))) (message "Passed V(e)") (should (equal - '((Sp (S) nil (e)) + '((S (S) (a S b) (a)) (S (S) (a S b) (e)) - (S (S) (a S b) (a))) + (Sp (S) nil (e))) (parser--lr-items-for-prefix 'S))) (message "Passed V(S)") (should (equal - '((S nil (e) (a)) - (S nil (S a S b) (a)) - (S nil (e) (b)) - (S nil (S a S b) (b)) - (S (S a) (S b) (a)) - (S (S a) (S b) (e))) + '((S (S a) (S b) (a)) + (S (S a) (S b) (e)) + (S nil (S a S b) (a)) + (S nil (S a S b) (b)) + (S nil (e) (a)) + (S nil (e) (b))) (parser--lr-items-for-prefix '(S a)))) (message "Passed V(Sa)")