branch: externals/parser-generator commit 0304b78f14cea9db09345b52ca08dea480b2f850 Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Added a unit-test to invalidate LR-items --- parser.el | 11 +++++++---- test/parser-test.el | 8 +++++++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/parser.el b/parser.el index 9644ad2..93dee01 100644 --- a/parser.el +++ b/parser.el @@ -774,8 +774,11 @@ (setq goto-table-table (sort goto-table-table 'parser--sort-list)) (push `(,lr-item-set-index ,goto-table-table) goto-table))) - (setq parser--goto-table (sort goto-table 'parser--sort-list)))) - + (setq parser--goto-table (sort goto-table 'parser--sort-list))) + (unless + (parser--lr-items-valid-p + (parser--hash-values-to-list parser--table-lr-items t)) + (error "Inconsistent grammar!"))) t) ;; Algorithm 5.10, p. 391 @@ -847,9 +850,9 @@ (message "b-suffix-follow-eff: %s" b-suffix-follow-eff)) (dolist (b-suffix-follow-eff-item b-suffix-follow-eff) - (when (equal a-look-ahead b-suffix-follow-eff-item) + (when (equal a-follow b-suffix-follow-eff-item) (parser--debug - (message "Inconsistent grammar!")) + (message "Inconsistent grammar! %s conflicts with %s" a b)) (setq valid-p nil)))) (setq b-index (1+ b-index)))) (setq a-index (1+ a-index))) diff --git a/test/parser-test.el b/test/parser-test.el index 7e662ad..c8fdfed 100644 --- a/test/parser-test.el +++ b/test/parser-test.el @@ -479,7 +479,13 @@ t (parser--lr-items-valid-p (parser--hash-values-to-list parser--table-lr-items t)))) - ;; TODO Figure out a grammar here that should be inconsistent + (message "Passed first") + + (should + (equal + nil + (parser--lr-items-valid-p + '(((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))) ((S (S) (a S b) (a)) (S (S) (a S b) (e)) (Sp (S) nil (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 nil (a)) (S nil nil (b))) ((S (S) (a S b) (a)) (S (S) (a S b) (b)) (S (S a S) (b) (a)) (S (S a S) (b) (e))) ((S (S a S b) nil (a)) (S (S a S b) (a) (a)) (S (S a S b) nil (e))) ((S (S a) (S b) (a)) (S (S a) (S b) (b)) (S nil (S a S b) (a)) [...] (message "Passed tests for (parser--lr-items-valid-p)"))