branch: externals/parser-generator commit 5c0bcd5f9abbdd5d2b20bf514d58c4e0f6445c5c Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Passing test for LL-table generation example 5.17 --- parser-generator-ll.el | 23 +++++++++++++++------ test/parser-generator-ll-test.el | 44 +++++++++++++++++----------------------- 2 files changed, 36 insertions(+), 31 deletions(-) diff --git a/parser-generator-ll.el b/parser-generator-ll.el index e8c1ff7f7e..c31b8ec216 100644 --- a/parser-generator-ll.el +++ b/parser-generator-ll.el @@ -142,10 +142,15 @@ "\nnon-terminal sub-symbol: %S" sub-symbol)) (let* ((follow-set (nthcdr (1+ sub-symbol-index) production-rhs)) - (merged-follow - (append follow-set parent-follow)) + (first-follow-set + (parser-generator--first follow-set nil t t)) + (saturated-first-follow-set + (parser-generator-generate-terminal-saturated-first-set + first-follow-set)) (local-follow-set - (parser-generator--first merged-follow nil t t)) + (parser-generator--merge-max-terminal-sets + saturated-first-follow-set + (list parent-follow))) (sub-symbol-rhss (parser-generator--get-grammar-rhs sub-symbol))) @@ -156,13 +161,19 @@ (parser-generator--debug (message - "follow-set: %S for %S in %S" + "\nfollow-set: %S for %S in %S" follow-set (nth sub-symbol-index production-rhs) production-rhs) (message - "merged-follow: %S" - follow-set) + "first-follow-set: %S" + first-follow-set) + (message + "saturated-first-follow-set: %S" + saturated-first-follow-set) + (message + "parent-follow: %S" + parent-follow) (message "local-follow-set: %S" local-follow-set) diff --git a/test/parser-generator-ll-test.el b/test/parser-generator-ll-test.el index 8a3068dcca..fd6f70c598 100644 --- a/test/parser-generator-ll-test.el +++ b/test/parser-generator-ll-test.el @@ -16,8 +16,6 @@ "Test `parser-generator-ll--generate-tables'." (message "Started tests for (parser-generator-ll--generate-tables)") - ;; Example 5.14 p. 350 - ;; Example 5.15 p. 351 (parser-generator-set-e-identifier 'e) (parser-generator-set-look-ahead-number 2) (parser-generator-set-grammar @@ -63,9 +61,8 @@ ) ) )) - (message "Passed Example 5.14 p. 350") + (message "Passed Example 5.14 p. 350 and 5.15 p. 351") - ;; TODO Pass Example 5.17 here (parser-generator-set-eof-identifier '$) (parser-generator-set-e-identifier 'e) (parser-generator-set-look-ahead-number 2) @@ -83,45 +80,44 @@ (parser-generator-process-grammar) (let* ((tables (parser-generator-ll--generate-tables))) - (message "tables: %S" tables) (should (equal tables '( ( - ((S) ($)) ;; T0 - ( - (($ $) (e) nil) - ((a b) (a b A) $) - ) - ) - ( - ((A) ($)) ;; T1 + ((A) (a a)) ;; T3 ( - ((b $) (b) nil) - ((a a) (S a a) ((a a))) ((a b) (S a a) ((a a))) + ((a a) (S a a) ((a a))) + ((b a) (b) nil) ) ) ( ((S) (a a)) ;; T2 ( + ((a b) (a b A) ((a a))) ((a a) (e) nil) - ((a b) (a B a) ((a a))) ) ) ( - ((A) (a a)) ;; T3 + ((A) ($)) ;; T1 ( - ((a a) (S a a) ((a a))) ((a b) (S a a) ((a a))) - ((b a) (b) nil) + ((a a) (S a a) ((a a))) + ((b $) (b) nil) + ) + ) + ( + ((S) ($)) ;; T0 + ( + (($ $) (e) nil) + ((a b) (a b A) (($))) ) ) ) )) ) - (message "Passed Example 5.17") + (message "Passed Example 5.17 p. 354") (message "Passed tests for (parser-generator-ll--generate-tables)")) @@ -163,8 +159,6 @@ (parser-tables (parser-generator-ll--generate-parsing-table tables))) - ;; (message "parser-tables: %S" parser-tables) - (should (equal '( @@ -212,9 +206,9 @@ ) ) parser-tables))) - (message "Passed Example 5.16") + (message "Passed Example 5.16 p. 352") - ;; TODO Test Example 5.17 here + ;; TODO Make this pass (parser-generator-set-eof-identifier '$) (parser-generator-set-e-identifier 'e) (parser-generator-set-look-ahead-number 2) @@ -248,7 +242,7 @@ ) ) parser-tables))) - (message "Passed example 5.17") + (message "Passed example 5.17 p. 354") (message "Passed tests for (parser-generator-ll--generate-parsing-table)"))