branch: externals/parser-generator commit 72bbadddc0e65f6f472d6ce361c9e793dbcaa091 Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Added TODO items --- test/parser-generator-ll-test.el | 273 +++++++++++++++++++++++---------------- 1 file changed, 161 insertions(+), 112 deletions(-) diff --git a/test/parser-generator-ll-test.el b/test/parser-generator-ll-test.el index f2267255bf..c06e25a076 100644 --- a/test/parser-generator-ll-test.el +++ b/test/parser-generator-ll-test.el @@ -181,7 +181,82 @@ ) (message "Passed Example 5.5 p. 340") - ;; TODO Example 5.12 p. 346-347 + (parser-generator-set-eof-identifier '$) + (parser-generator-set-e-identifier 'e) + (parser-generator-set-look-ahead-number 1) + (parser-generator-set-grammar + '( + (E E2 T T2 F) + ("a" "(" ")" "+" "*") + ( + (E (T E2)) + (E2 ("+" T E2) e) + (T (F T2)) + (T2 ("*" F T2) e) + (F ("(" E ")") "a") + ) + E + ) + ) + (parser-generator-process-grammar) + (let ((tables (parser-generator-ll--generate-tables))) + (message "tables: %S" tables) + (should + (equal + '( + ( + ((E2) (")")) + ( + ((")") (e) nil) + (("+") ("+" T E2) (("+"))) + ) + ) + ( + ((E) (")")) + ( + (("(") (T E2) (("+"))) + (("a") (T E2) (("+"))) + ) + ) + ( + ((F) ("*")) + ( + (("(") ("(" E ")") ((")"))) + (("a") ("a") nil) + ) + ) + ( + ((T2) ("+")) + ( + (("*") ("*" F T2) (("*"))) + (("+") (e) nil) + ) + ) + ( + ((T) ("+")) + ( + (("(") (F T2) (("*"))) + (("a") (F T2) (("*"))) + ) + ) + ( + ((E2) ($)) + ( + (($) (e) nil) + (("+") ("+" T E2) (("+"))) + ) + ) + ( + ((E) ($)) + ( + (("(") (T E2) (("+"))) + (("a") (T E2) (("+"))) + ) + ) + ) + tables))) + ;; TODO Verify above + (message "Passed Example 5.12 p. 346-347") (message "Passed tests for (parser-generator-ll--generate-tables)")) @@ -336,6 +411,91 @@ parser-tables))) (message "Passed example 5.17 p. 356") + (parser-generator-set-eof-identifier '$) + (parser-generator-set-e-identifier 'e) + (parser-generator-set-look-ahead-number 1) + (parser-generator-set-grammar + '( + (E E2 T T2 F) + ("a" "(" ")" "+" "*") + ( + (E (T E2)) + (E2 ("+" T E2) e) + (T (F T2)) + (T2 ("*" F T2) e) + (F ("(" E ")") "a") + ) + E + ) + ) + (parser-generator-process-grammar) + (parser-generator-process-grammar) + (let ((parser-tables + (parser-generator-ll--generate-parsing-table + (parser-generator-ll--generate-tables)))) + (message "parser-tables: %S" parser-tables) + (should + (equal + '( + ( + ((E) ($)) + ( + (("a") reduce (((T) ("+")) ((E2) nil)) 0) ;; TODO Verify this + (("(") reduce (((T) ("+")) ((E2) nil)) 0) ;; TODO Verify this + ) + ) + ( + ((E2) ($)) + ( + (("+") reduce ("+" ((T) ("+")) ((E2) nil)) 1) + (($) reduce (e) 2) + ) + ) + ( + ((T) ("+")) + ( + (("a") reduce (((F) ("*")) ((T2) nil)) 3) + (("(") reduce (((F) ("*")) ((T2) nil)) 3) + ) + ) + ( + ((T2) ("+")) + ( + (("+") reduce (e) 5) + (("*") reduce ("*" ((F) ("*")) ((T2) nil)) 4) + ) + ) + ( + ((F) ("*")) + ( + (("a") reduce ("a") 7) + (("(") reduce ("(" ((E) (")")) ")") 6) + ) + ) + ( + ((E) (")")) + ( + (("a") reduce (((T) ("+")) ((E2) nil)) 0) + (("(") reduce (((T) ("+")) ((E2) nil)) 0) + ) + ) + ( + ((E2) (")")) + ( + (("+") reduce ("+" ((T) ("+")) ((E2) nil)) 1) + ((")") reduce (e) 2) + ) + ) + ("a" ((("a") pop))) + ("+" ((("+") pop))) + ("*" ((("*") pop))) + (")" (((")") pop))) + ("(" ((("(") pop))) + ($ ((($) accept)))) + parser-tables))) + ;; TODO Verify above + (message "Passed Example 5.12 p. 346-347") + (message "Passed tests for (parser-generator-ll--generate-parsing-table)")) (defun parser-generator-ll-test--parse () @@ -479,117 +639,7 @@ ) ) (parser-generator-process-grammar) - (let ((tables (parser-generator-ll--generate-tables))) - (message "tables: %S" tables) - '( - ( - ((E2) (")")) - ( - ((")") (e) nil) - (("+") ("+" T E2) ((")") ("+"))) - ) - ) - ( - ((E) (")")) - ( - (("(") (T E2) ((")") ("+"))) - (("a") (T E2) ((")") ("+"))) - ) - ) - ( - ((F) ("*")) - ( - (("(") ("(" E ")") ((")"))) - (("a") ("a") nil) - ) - ) - ( - ((T2) ("+")) - ( - (("*") ("*" F T2) (("+") ("*"))) - (("+") (e) nil) - ) - ) - ( - ((T) ("+")) - ( - (("(") (F T2) (("+") ("*"))) - (("a") (F T2) (("+") ("*"))) - ) - ) - ( - ((E2) ($)) - ( - (($) (e) nil) - (("+") ("+" T E2) (($) ("+"))) - ) - ) - ( - ((E) ($)) - ( - (("(") (T E2) (($) ("+"))) - (("a") (T E2) (($) ("+"))) - ) - ) - )) (parser-generator-ll-generate-parser-tables) - (message - "parser-generator-ll--parsing-table: %S" - (parser-generator--hash-to-list - parser-generator-ll--parsing-table - t)) - ;; Local-follow-should exceed k - '( - ("((E) ($))" - ( - ("(\"a\")" (reduce (((T) ($)) ((E2) ("+"))) 0)) - ("(\"(\")" (reduce (((T) ($)) ((E2) ("+"))) 0)) - ) - ) - ("((E2) ($))" - ( - ("(\"+\")" (reduce ("+" ((T) ($)) ((E2) ("+"))) 1)) - ("($)" (reduce (e) 2)) - ) - ) - ("((T) (\"+\"))" - ( - ("(\"a\")" (reduce (((F) ("+")) ((T2) ("*"))) 3)) - ("(\"(\")" (reduce (((F) ("+")) ((T2) ("*"))) 3)) - ) - ) - ("((T2) (\"+\"))" - ( - ("(\"+\")" (reduce (e) 5)) - ("(\"*\")" (reduce ("*" ((F) ("+")) ((T2) ("*"))) 4)) - ) - ) - ("((F) (\"*\"))" - ( - ("(\"a\")" (reduce ("a") 7)) - ("(\"(\")" (reduce ("(" ((E) (")")) ")") 6)) - ) - ) - ("((E) (\")\"))" - ( - ("(\"a\")" (reduce (((T) (")")) ((E2) ("+"))) 0)) - ("(\"(\")" (reduce (((T) (")")) ((E2) ("+"))) 0)) - ) - ) - ("((E2) (\")\"))" - ( - ("(\"+\")" (reduce ("+" ((T) (")")) ((E2) ("+"))) 1)) - ("(\")\")" (reduce (e) 2)) - ) - ) - ("\"a\""(("(\"a\")" pop))) - ("\"+\"" (("(\"+\")" pop))) - ("\"*\"" (("(\"*\")" pop))) - ("\")\"" (("(\")\")" pop))) - ("\"(\"" (("(\"(\")" pop))) - ("$" (("($)" accept))) - ) - ;; (message "parser-generator-ll--parsing-table: %S" parser-generator-ll--parsing-table) (setq parser-generator-lex-analyzer--function (lambda (index) @@ -607,7 +657,6 @@ parser-generator-lex-analyzer--get-function (lambda (token) (car token))) - (parser-generator-ll-parse) (should (equal '(0 3 6 0 3 7 5 2 5) ;; Example is 1-indexed '(1 4 7 1 4 8 5 8 6 3 6 3)