branch: externals/parser-generator commit e1315c373b5da1348bd5cfb5e3e47953bcd2ba3d Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Updated so E-FREE-FIRST(x) only uses E-FREE-FIRST on first symbol --- parser-generator-lr.el | 3 --- parser-generator.el | 4 +++- test/parser-generator-test.el | 4 ++-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/parser-generator-lr.el b/parser-generator-lr.el index a8c06e9..e2fffd3 100644 --- a/parser-generator-lr.el +++ b/parser-generator-lr.el @@ -25,7 +25,6 @@ ;; Main Algorithms -;; TODO Test this function with above 1 as look-ahead number (defun parser-generator-lr-generate-parser-tables () "Generate parsing tables for grammar." (let ((table-lr-items @@ -178,7 +177,6 @@ (setq table-index (1+ table-index)))))) ;; Algorithm 5.9, p. 389 -;; TODO Test this function with above 1 as look-ahead number (defun parser-generator-lr--generate-goto-tables () "Calculate set of valid LR(k) items for grammar and a GOTO-table." (let ((lr-item-set-new-index 0) @@ -598,7 +596,6 @@ (message "γ: %s" γ)) prefix-previous))))) -;; TODO Make this function work with k > 1 (defun parser-generator-lr--items-for-goto (previous-lr-item x) "Calculate LR-items for GOTO(PREVIOUS-LR-ITEM, X)." (let ((lr-new-item) diff --git a/parser-generator.el b/parser-generator.el index a834882..1babaad 100644 --- a/parser-generator.el +++ b/parser-generator.el @@ -1202,7 +1202,9 @@ (parser-generator--debug (message "non-terminal symbol: %s" symbol)) (let ((symbol-f-set)) - (if disallow-e-first + (if (and + disallow-e-first + (= first-length 0)) (setq symbol-f-set (nth 1 (gethash symbol parser-generator--f-free-sets))) (setq symbol-f-set (nth 1 (gethash symbol parser-generator--f-sets)))) (parser-generator--debug diff --git a/test/parser-generator-test.el b/test/parser-generator-test.el index 7ee76af..4a880b4 100644 --- a/test/parser-generator-test.el +++ b/test/parser-generator-test.el @@ -439,12 +439,12 @@ (parser-generator--e-free-first '(e a)))) (should (equal - '((a e)) + '((a a) (a e)) (parser-generator--e-free-first '(a S)))) (message "Passed empty-free-first 2 with trailing e-identifier 2") (should (equal - '((a b)) + '((a a) (a e)) (parser-generator--e-free-first '(a S b)))) (message "Passed empty-free-first 2 with trailing e-identifier 1")