branch: externals/parser-generator commit f0de6698b984d8ed07fe07e66b36158407eb1dd7 Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Added todo item --- parser-generator-ll.el | 16 +++++++-- parser-generator.el | 2 +- test/parser-generator-ll-test.el | 71 ++++++++++++++++++++++++++++++++++++---- 3 files changed, 79 insertions(+), 10 deletions(-) diff --git a/parser-generator-ll.el b/parser-generator-ll.el index 58d6d10576..82f4e383f7 100644 --- a/parser-generator-ll.el +++ b/parser-generator-ll.el @@ -59,7 +59,7 @@ (list (list start) start-rhs - nil) + (list parser-generator--eof-identifier)) stack)))) (setq stack (nreverse stack)) (parser-generator--debug @@ -79,6 +79,10 @@ (parser-generator--first parent-follow nil t t)) (look-aheads) (sets)) + (parser-generator--debug + (message "\nproduction-lhs: %S" production-lhs) + (message "production-rhs: %S" production-rhs) + (message "parent-follow: %S" parent-follow)) (cond ((and first-rhs @@ -106,6 +110,9 @@ "Unexpected empty FIRST for production: %S and parent-follow: %S" production parent-follow))) + (parser-generator--debug + (message "look-aheads: %S" look-aheads)) + ;; TODO merge-max-terminal-sets should do the right thing ;; For each non-terminal in the production right-hand side ;; push a new item to stack with a local-follow @@ -116,6 +123,9 @@ (let ((sub-symbol (nth sub-symbol-index production-rhs))) (when (parser-generator--valid-non-terminal-p sub-symbol) + (parser-generator--debug + (message + "\nnon-terminal sub-symbol: %S" sub-symbol)) (let* ((follow-set (nthcdr (1+ sub-symbol-index) production-rhs)) (merged-follow @@ -127,7 +137,7 @@ sub-symbol))) (parser-generator--debug (message - "\nfollow-set: %S for %S in %S" + "follow-set: %S for %S in %S" follow-set (nth sub-symbol-index production-rhs) production-rhs) @@ -189,6 +199,8 @@ item-hash-key t distinct-item-p) + (parser-generator--debug + (message "new table: %S" table)) (if (gethash table-hash-key tables) diff --git a/parser-generator.el b/parser-generator.el index d995fcbf7d..602391eb10 100644 --- a/parser-generator.el +++ b/parser-generator.el @@ -45,7 +45,7 @@ (defvar parser-generator--debug - nil + t "Whether to print debug messages or not.") (defvar diff --git a/test/parser-generator-ll-test.el b/test/parser-generator-ll-test.el index 3a1d455f77..6f103ef8f8 100644 --- a/test/parser-generator-ll-test.el +++ b/test/parser-generator-ll-test.el @@ -33,27 +33,27 @@ ) (parser-generator-process-grammar) (let ((tables (parser-generator-ll--generate-tables))) - ;; (message "tables: %S" tables) + (message "tables: %S" tables) (should (equal tables '( ( - ((A) (b a)) + ((A) (b a)) ;; T A,{ba} ( ((b b) (b) nil) ((b a) (e) nil) ) ) ( - ((A) (a a)) + ((A) (a a)) ;; T A,{aa} ( ((a a) (e) nil) ((b a) (b) nil) ) ) ( - ((S) nil) + ((S) ($)) ;; T0 ( ((a b) (a A a a) ((a a))) ((a a) (a A a a) ((a a))) @@ -61,8 +61,66 @@ ) ) ) + ) + )) + + ;; TODO Pass Example 5.17 here + (parser-generator-set-eof-identifier '$) + (parser-generator-set-e-identifier 'e) + (parser-generator-set-look-ahead-number 2) + (parser-generator-set-grammar + '( + (S A) + (a b) + ( + (S e (a b A)) + (A (S a a) b) + ) + S + ) + ) + (parser-generator-process-grammar) + (let* ((tables + (parser-generator-ll--generate-tables))) + (message "tables: %S" tables) + (should + (equal + tables + '( + ( + ((S) nil) ;; T0 + ( + (($ $) (e) nil) + ((a b) (a b A) $) + ) + ) + ( + ((A) nil) ;; T1 + ( + ((b $) (b) nil) + ((a a) (S a a) ((a a))) + ((a b) (S a a) ((a a))) + ) + ) + ( + ((S) (a a)) ;; T2 + ( + ((a a) (e) nil) + ((a b) (a B a) ((a a))) + ) + ) + ( + ((A) (a a)) ;; T3 + ( + ((a a) (S a a) ((a a))) + ((a b) (S a a) ((a a))) + ((b a) (b) nil) + ) + ) + ) )) - tables) + ) + (message "Passed tests for (parser-generator-ll--generate-tables)")) @@ -171,11 +229,10 @@ ) (parser-generator-process-grammar) (let* ((tables - (parser-generator-ll--generate-tables)) + (parser-generator-ll--generate-tables)) ;; TODO Replace with hard-coded value here (parser-tables (parser-generator-ll--generate-parsing-table tables))) - (message "tables: %S" tables) (message "parser-tables: %S" parser-tables) (should (equal