branch: externals/parser-generator commit 8cda060c76194349e2975c982912572b54a7e172 Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Made some functions public --- .../Deterministic-Right-Parser-for-LRk-Grammars.md | 18 +-- docs/Syntax-Analysis.md | 22 +-- parser-generator.el | 6 +- test/parser-generator-lr-test.el | 42 +++--- test/parser-generator-test.el | 154 ++++++++++----------- 5 files changed, 121 insertions(+), 121 deletions(-) diff --git a/docs/Deterministic-Right-Parser-for-LRk-Grammars.md b/docs/Deterministic-Right-Parser-for-LRk-Grammars.md index 5dd03ff..4837347 100644 --- a/docs/Deterministic-Right-Parser-for-LRk-Grammars.md +++ b/docs/Deterministic-Right-Parser-for-LRk-Grammars.md @@ -23,9 +23,9 @@ Calculate the set of LR items valid for any viable prefix S. ``` emacs-lisp (require 'ert) -(parser--set-grammar '((Sp S) (a b) ((Sp S) (S (S a S b)) (S e)) Sp)) -(parser--set-look-ahead-number 1) -(parser--process-grammar) +(parser-set-grammar '((Sp S) (a b) ((Sp S) (S (S a S b)) (S e)) Sp)) +(parser-set-look-ahead-number 1) +(parser-process-grammar) (should (equal @@ -40,9 +40,9 @@ Calculate the set of LR items valid for any viable prefix S. ``` emacs-lisp (require 'ert) -(parser--set-grammar '((Sp S) (a b) ((Sp S) (S (S a S b)) (S e)) Sp)) -(parser--set-look-ahead-number 1) -(parser--process-grammar) +(parser-set-grammar '((Sp S) (a b) ((Sp S) (S (S a S b)) (S e)) Sp)) +(parser-set-look-ahead-number 1) +(parser-process-grammar) (should (equal @@ -59,9 +59,9 @@ Perform a right-parse of input-stream. ```emacs-lisp (require 'ert) -(parser-generator--set-grammar '((Sp S) (a b) ((Sp S) (S (S a S b)) (S e)) Sp)) -(parser-generator--set-look-ahead-number 1) -(parser-generator--process-grammar) +(parser-generator-set-grammar '((Sp S) (a b) ((Sp S) (S (S a S b)) (S e)) Sp)) +(parser-generator-set-look-ahead-number 1) +(parser-generator-process-grammar) (setq parser-generator-lex-analyzer--function diff --git a/docs/Syntax-Analysis.md b/docs/Syntax-Analysis.md index eb7ce9b..fc1b0f1a 100644 --- a/docs/Syntax-Analysis.md +++ b/docs/Syntax-Analysis.md @@ -33,7 +33,7 @@ Grammar consists of `N`, `T`, `P` and `S`, where `N` is non-terminals, `T` is te * S = `'S` ``` emacs-lisp -(parser-generator--set-grammar '((S A B C) (a b c) ((S (A B)) (A (B a) e) (B (C b) C) (C c e)) S)) +(parser-generator-set-grammar '((S A B C) (a b c) ((S (A B)) (A (B a) e) (B (C b) C) (C c e)) S)) ``` ### e @@ -74,7 +74,7 @@ The start symbol is the entry-point of the grammar and should be either a string ### Look-ahead number -Is a simple integer above zero. You set it like this: `(parser-generator--set-look-ahead-number 1)` for `1` number look-ahead. +Is a simple integer above zero. You set it like this: `(parser-generator-set-look-ahead-number 1)` for `1` number look-ahead. ### Syntax-directed-translation (SDT) @@ -93,9 +93,9 @@ Calculate the first look-ahead number of terminals of the sentential-form `S`, e ``` emacs-lisp (require 'ert) -(parser-generator--set-grammar '((S A B C) (a b c) ((S (A B)) (A (B a) e) (B (C b) C) (C c e)) S)) -(parser-generator--set-look-ahead-number 2) -(parser-generator--process-grammar) +(parser-generator-set-grammar '((S A B C) (a b c) ((S (A B)) (A (B a) e) (B (C b) C) (C c e)) S)) +(parser-generator-set-look-ahead-number 2) +(parser-generator-process-grammar) (should (equal @@ -110,9 +110,9 @@ Calculate the e-free-first look-ahead number of terminals of sentential-form `S` ``` emacs-lisp (require 'ert) -(parser-generator--set-grammar '((S A B C) (a b c) ((S (A B)) (A (B a) e) (B (C b) C) (C c e)) S)) -(parser-generator--set-look-ahead-number 2) -(parser-generator--process-grammar) +(parser-generator-set-grammar '((S A B C) (a b c) ((S (A B)) (A (B a) e) (B (C b) C) (C c e)) S)) +(parser-generator-set-look-ahead-number 2) +(parser-generator-process-grammar) (should (equal @@ -127,9 +127,9 @@ Calculate the look-ahead number of terminals possibly following S. ``` emacs-lisp (require 'ert) -(parser-generator--set-grammar '((S A B) (a c d f) ((S (A a)) (A B) (B (c f) d)) S)) -(parser-generator--set-look-ahead-number 2) -(parser-generator--process-grammar) +(parser-generator-set-grammar '((S A B) (a c d f) ((S (A a)) (A B) (B (c f) d)) S)) +(parser-generator-set-look-ahead-number 2) +(parser-generator-process-grammar) (should (equal diff --git a/parser-generator.el b/parser-generator.el index fd29fc1..6a37f3a 100644 --- a/parser-generator.el +++ b/parser-generator.el @@ -269,7 +269,7 @@ (dolist (look-ahead look-aheads) (puthash look-ahead t parser-generator--table-look-aheads-p)))) -(defun parser-generator--set-look-ahead-number (k) +(defun parser-generator-set-look-ahead-number (k) "Set look-ahead number K." (unless (parser-generator--valid-look-ahead-number-p k) (error "Invalid look-ahead number k!")) @@ -279,13 +279,13 @@ "Set FLAG whether e-productions is allowed or not." (setq parser-generator--allow-e-productions flag)) -(defun parser-generator--set-grammar (G) +(defun parser-generator-set-grammar (G) "Set grammar G.." (unless (parser-generator--valid-grammar-p G) (error "Invalid grammar G!")) (setq parser-generator--grammar G)) -(defun parser-generator--process-grammar () +(defun parser-generator-process-grammar () "Process grammar." (parser-generator--clear-cache) (parser-generator--load-symbols)) diff --git a/test/parser-generator-lr-test.el b/test/parser-generator-lr-test.el index 7a873a0..4b2e12e 100644 --- a/test/parser-generator-lr-test.el +++ b/test/parser-generator-lr-test.el @@ -15,9 +15,9 @@ (message "Starting tests for (parser-generator-lr--generate-action-tables)") ;; Example 5.32 p. 393 - (parser-generator--set-grammar '((Sp S) (a b) ((Sp S) (S (S a S b)) (S e)) Sp)) - (parser-generator--set-look-ahead-number 1) - (parser-generator--process-grammar) + (parser-generator-set-grammar '((Sp S) (a b) ((Sp S) (S (S a S b)) (S e)) Sp)) + (parser-generator-set-look-ahead-number 1) + (parser-generator-process-grammar) (parser-generator-lr-generate-parser-tables) ;; Fig. 5.9 p. 374 @@ -40,9 +40,9 @@ (message "Starting tests for (parser-generator-lr--generate-goto-tables)") ;; Example 5.30, p. 389 - (parser-generator--set-grammar '((Sp S) (a b) ((Sp S) (S (S a S b)) (S e)) Sp)) - (parser-generator--set-look-ahead-number 1) - (parser-generator--process-grammar) + (parser-generator-set-grammar '((Sp S) (a b) ((Sp S) (S (S a S b)) (S e)) Sp)) + (parser-generator-set-look-ahead-number 1) + (parser-generator-process-grammar) (let ((table-lr-items (parser-generator-lr-generate-parser-tables))) ;; (message "GOTO-table: %s" parser-generator-lr--goto-tables) @@ -75,9 +75,9 @@ (message "Passed LR-items for example 5.30") ;; Example 5.30, p. 389 but with terminals as strings - (parser-generator--set-grammar '((Sp S) ("a" "b") ((Sp S) (S (S "a" S "b")) (S e)) Sp)) - (parser-generator--set-look-ahead-number 1) - (parser-generator--process-grammar) + (parser-generator-set-grammar '((Sp S) ("a" "b") ((Sp S) (S (S "a" S "b")) (S e)) Sp)) + (parser-generator-set-look-ahead-number 1) + (parser-generator-process-grammar) (let ((table-lr-items (parser-generator-lr-generate-parser-tables))) @@ -117,9 +117,9 @@ (message "Starting tests for (parser-generator-lr--items-for-prefix)") ;; Example 5.29 p 387 - (parser-generator--set-grammar '((Sp S) (a b) ((Sp S) (S (S a S b)) (S e)) Sp)) - (parser-generator--set-look-ahead-number 1) - (parser-generator--process-grammar) + (parser-generator-set-grammar '((Sp S) (a b) ((Sp S) (S (S a S b)) (S e)) Sp)) + (parser-generator-set-look-ahead-number 1) + (parser-generator-process-grammar) (should (equal @@ -202,11 +202,11 @@ "Test `parser-generator-lr--items-valid-p'." (message "Started tests for (parser-generator-lr--items-valid-p)") - (parser-generator--set-grammar '((Sp S) (a b) ((Sp S) (S (S a S b)) (S e)) Sp)) - (parser-generator--set-look-ahead-number 1) + (parser-generator-set-grammar '((Sp S) (a b) ((Sp S) (S (S a S b)) (S e)) Sp)) + (parser-generator-set-look-ahead-number 1) - (let ((table-lr-items (parser-generator--process-grammar))) + (let ((table-lr-items (parser-generator-process-grammar))) (should (equal @@ -227,9 +227,9 @@ "Test `parser-generator-lr--parse'." (message "Started tests for (parser-generator-lr--parse)") - (parser-generator--set-grammar '((Sp S) (a b) ((Sp S) (S (S a S b)) (S e)) Sp)) - (parser-generator--set-look-ahead-number 1) - (parser-generator--process-grammar) + (parser-generator-set-grammar '((Sp S) (a b) ((Sp S) (S (S a S b)) (S e)) Sp)) + (parser-generator-set-look-ahead-number 1) + (parser-generator-process-grammar) (parser-generator-lr-generate-parser-tables) (setq @@ -274,9 +274,9 @@ ;; Test with terminals as strings here - (parser-generator--set-grammar '((Sp S) ("a" "b") ((Sp S) (S (S "a" S "b")) (S e)) Sp)) - (parser-generator--set-look-ahead-number 1) - (parser-generator--process-grammar) + (parser-generator-set-grammar '((Sp S) ("a" "b") ((Sp S) (S (S "a" S "b")) (S e)) Sp)) + (parser-generator-set-look-ahead-number 1) + (parser-generator-process-grammar) (parser-generator-lr-generate-parser-tables) (setq diff --git a/test/parser-generator-test.el b/test/parser-generator-test.el index 554ed82..2699ebc 100644 --- a/test/parser-generator-test.el +++ b/test/parser-generator-test.el @@ -14,9 +14,9 @@ "Test `parser-generator--valid-look-ahead-p'." (message "Starting tests for (parser-generator--valid-look-ahead-p)") - (parser-generator--set-look-ahead-number 1) - (parser-generator--set-grammar '((S A) ("a" "b") ((S A) (A ("b" "a"))) S)) - (parser-generator--process-grammar) + (parser-generator-set-look-ahead-number 1) + (parser-generator-set-grammar '((S A) ("a" "b") ((S A) (A ("b" "a"))) S)) + (parser-generator-process-grammar) (should (equal @@ -45,9 +45,9 @@ "Test `parser-generator--get-look-aheads'." (message "Starting tests for (parser-generator--get-grammar-look-aheads)") - (parser-generator--set-look-ahead-number 1) - (parser-generator--set-grammar '((S A) ("a" "b") ((S A) (A ("b" "a"))) S)) - (parser-generator--process-grammar) + (parser-generator-set-look-ahead-number 1) + (parser-generator-set-grammar '((S A) ("a" "b") ((S A) (A ("b" "a"))) S)) + (parser-generator-process-grammar) (should (equal @@ -55,7 +55,7 @@ (parser-generator--get-grammar-look-aheads))) (message "Passed ((a) (b) (e))") - (parser-generator--set-look-ahead-number 2) + (parser-generator-set-look-ahead-number 2) (should (equal @@ -109,9 +109,9 @@ "Test `parser-generator--follow'." (message "Starting tests for (parser-generator--follow)") - (parser-generator--set-grammar '((S A) (b) ((S A) (A b)) S)) - (parser-generator--set-look-ahead-number 2) - (parser-generator--process-grammar) + (parser-generator-set-grammar '((S A) (b) ((S A) (A b)) S)) + (parser-generator-set-look-ahead-number 2) + (parser-generator-process-grammar) (should (equal @@ -119,9 +119,9 @@ (parser-generator--follow 'A))) (message "Passed follow 1 with intermediate grammar") - (parser-generator--set-grammar '((S A B) (a c d f) ((S (A a)) (A B) (B (c f) d)) S)) - (parser-generator--set-look-ahead-number 2) - (parser-generator--process-grammar) + (parser-generator-set-grammar '((S A B) (a c d f) ((S (A a)) (A B) (B (c f) d)) S)) + (parser-generator-set-look-ahead-number 2) + (parser-generator-process-grammar) (should (equal @@ -129,9 +129,9 @@ (parser-generator--follow 'A))) (message "Passed follow 2 with intermediate grammar") - (parser-generator--set-grammar '((S A B) (a c d f) ((S (A a)) (A (B c d)) (B (c f) d)) S)) - (parser-generator--set-look-ahead-number 2) - (parser-generator--process-grammar) + (parser-generator-set-grammar '((S A B) (a c d f) ((S (A a)) (A (B c d)) (B (c f) d)) S)) + (parser-generator-set-look-ahead-number 2) + (parser-generator-process-grammar) (should (equal @@ -145,9 +145,9 @@ "Test `parser-generator--first'." (message "Starting tests for (parser-generator--first)") - (parser-generator--set-grammar '((S) (a) ((S a)) S)) - (parser-generator--set-look-ahead-number 1) - (parser-generator--process-grammar) + (parser-generator-set-grammar '((S) (a) ((S a)) S)) + (parser-generator-set-look-ahead-number 1) + (parser-generator-process-grammar) (should (equal @@ -155,9 +155,9 @@ (parser-generator--first 'S))) (message "Passed first 1 with rudimentary grammar") - (parser-generator--set-grammar '((S) (a) ((S a)) S)) - (parser-generator--set-look-ahead-number 1) - (parser-generator--process-grammar) + (parser-generator-set-grammar '((S) (a) ((S a)) S)) + (parser-generator-set-look-ahead-number 1) + (parser-generator-process-grammar) (should (equal @@ -165,9 +165,9 @@ (parser-generator--first '(S a)))) (message "Passed first 1b with rudimentary grammar") - (parser-generator--set-grammar '((S) (a) ((S a)) S)) - (parser-generator--set-look-ahead-number 2) - (parser-generator--process-grammar) + (parser-generator-set-grammar '((S) (a) ((S a)) S)) + (parser-generator-set-look-ahead-number 2) + (parser-generator-process-grammar) (should (equal @@ -175,9 +175,9 @@ (parser-generator--first '(S a)))) (message "Passed first 1c with rudimentary grammar") - (parser-generator--set-grammar '((S) (a) ((S a)) S)) - (parser-generator--set-look-ahead-number 2) - (parser-generator--process-grammar) + (parser-generator-set-grammar '((S) (a) ((S a)) S)) + (parser-generator-set-look-ahead-number 2) + (parser-generator-process-grammar) (should (equal @@ -185,9 +185,9 @@ (parser-generator--first '(a)))) (message "Passed first 1d with rudimentary grammar") - (parser-generator--set-grammar '((S) ("a" "b" "c") ((S ("a" "b" "c"))) S)) - (parser-generator--set-look-ahead-number 2) - (parser-generator--process-grammar) + (parser-generator-set-grammar '((S) ("a" "b" "c") ((S ("a" "b" "c"))) S)) + (parser-generator-set-look-ahead-number 2) + (parser-generator-process-grammar) (should (equal @@ -195,9 +195,9 @@ (parser-generator--first 'S))) (message "Passed first 2 with rudimentary grammar") - (parser-generator--set-grammar '((S) ("a" b "c") ((S ("a" b "c"))) S)) - (parser-generator--set-look-ahead-number 3) - (parser-generator--process-grammar) + (parser-generator-set-grammar '((S) ("a" b "c") ((S ("a" b "c"))) S)) + (parser-generator-set-look-ahead-number 3) + (parser-generator-process-grammar) (should (equal @@ -205,9 +205,9 @@ (parser-generator--first 'S))) (message "Passed first 3 with rudimentary grammar") - (parser-generator--set-grammar '((S A) (b) ((S A) (A b)) S)) - (parser-generator--set-look-ahead-number 2) - (parser-generator--process-grammar) + (parser-generator-set-grammar '((S A) (b) ((S A) (A b)) S)) + (parser-generator-set-look-ahead-number 2) + (parser-generator-process-grammar) (should (equal @@ -215,9 +215,9 @@ (parser-generator--first 'S))) (message "Passed first 1 with intermediate grammar") - (parser-generator--set-grammar '((S A) ("a" "b") ((S A) (A ("b" "a"))) S)) - (parser-generator--set-look-ahead-number 2) - (parser-generator--process-grammar) + (parser-generator-set-grammar '((S A) ("a" "b") ((S A) (A ("b" "a"))) S)) + (parser-generator-set-look-ahead-number 2) + (parser-generator-process-grammar) (should (equal @@ -225,9 +225,9 @@ (parser-generator--first 'S))) (message "Passed first 2 with intermediate grammar") - (parser-generator--set-grammar '((S A) ("a" "b" "c" "d") ((S A) (A ("b" "a" "c" "d"))) S)) - (parser-generator--set-look-ahead-number 3) - (parser-generator--process-grammar) + (parser-generator-set-grammar '((S A) ("a" "b" "c" "d") ((S A) (A ("b" "a" "c" "d"))) S)) + (parser-generator-set-look-ahead-number 3) + (parser-generator-process-grammar) (should (equal @@ -235,9 +235,9 @@ (parser-generator--first 'S))) (message "Passed first 3 with intermediate grammar") - (parser-generator--set-grammar '((S A B) ("c" "d") ((S A) (A B) (B "c" "d")) S)) - (parser-generator--set-look-ahead-number 1) - (parser-generator--process-grammar) + (parser-generator-set-grammar '((S A B) ("c" "d") ((S A) (A B) (B "c" "d")) S)) + (parser-generator-set-look-ahead-number 1) + (parser-generator-process-grammar) (should (equal @@ -245,9 +245,9 @@ (parser-generator--first 'S))) (message "Passed first 1 with semi-complex grammar") - (parser-generator--set-grammar '((S A B) (a c d f) ((S (A a)) (A B) (B (c f) d)) S)) - (parser-generator--set-look-ahead-number 2) - (parser-generator--process-grammar) + (parser-generator-set-grammar '((S A B) (a c d f) ((S (A a)) (A B) (B (c f) d)) S)) + (parser-generator-set-look-ahead-number 2) + (parser-generator-process-grammar) (should (equal @@ -255,9 +255,9 @@ (parser-generator--first 'S))) (message "Passed first 2 with semi-complex grammar") - (parser-generator--set-grammar '((S A B) ("a" "c" "d" "m") ((S A) (A (B "a" "m")) (B "c" "d")) S)) - (parser-generator--set-look-ahead-number 3) - (parser-generator--process-grammar) + (parser-generator-set-grammar '((S A B) ("a" "c" "d" "m") ((S A) (A (B "a" "m")) (B "c" "d")) S)) + (parser-generator-set-look-ahead-number 3) + (parser-generator-process-grammar) (should (equal @@ -265,9 +265,9 @@ (parser-generator--first 'S))) (message "Passed first 3 with semi-complex grammar") - (parser-generator--set-grammar '((S A B C) (a b c) ((S A B) (A (B a) e) (B (C b) C) (C c e)) S)) - (parser-generator--set-look-ahead-number 1) - (parser-generator--process-grammar) + (parser-generator-set-grammar '((S A B C) (a b c) ((S A B) (A (B a) e) (B (C b) C) (C c e)) S)) + (parser-generator-set-look-ahead-number 1) + (parser-generator-process-grammar) (should (equal @@ -276,9 +276,9 @@ (message "Passed first 1 with complex grammar") ;; Example 5.28 p 382 - (parser-generator--set-grammar '((S A B C) (a b c) ((S (A B)) (A (B a) e) (B (C b) C) (C c e)) S)) - (parser-generator--set-look-ahead-number 2) - (parser-generator--process-grammar) + (parser-generator-set-grammar '((S A B C) (a b c) ((S (A B)) (A (B a) e) (B (C b) C) (C c e)) S)) + (parser-generator-set-look-ahead-number 2) + (parser-generator-process-grammar) (should (equal @@ -286,9 +286,9 @@ (parser-generator--first 'S))) (message "Passed first 2 with complex grammar") - (parser-generator--set-grammar '((S A B C) (a b c) ((S (A B)) (A (B a) e) (B (C b) C) (C c e)) S)) - (parser-generator--set-look-ahead-number 3) - (parser-generator--process-grammar) + (parser-generator-set-grammar '((S A B C) (a b c) ((S (A B)) (A (B a) e) (B (C b) C) (C c e)) S)) + (parser-generator-set-look-ahead-number 3) + (parser-generator-process-grammar) (should (equal @@ -304,9 +304,9 @@ (message "Starting tests for (parser-generator--e-free-first)") ;; Example 5.28 p 402 - (parser-generator--set-grammar '((S A B C) (a b c) ((S (A B)) (A (B a) e) (B (C b) C) (C c e)) S)) - (parser-generator--set-look-ahead-number 2) - (parser-generator--process-grammar) + (parser-generator-set-grammar '((S A B C) (a b c) ((S (A B)) (A (B a) e) (B (C b) C) (C c e)) S)) + (parser-generator-set-look-ahead-number 2) + (parser-generator-process-grammar) (should (equal @@ -314,17 +314,17 @@ (parser-generator--e-free-first 'S))) (message "Passed empty-free-first 2 with complex grammar") - (parser-generator--set-look-ahead-number 1) - (parser-generator--process-grammar) + (parser-generator-set-look-ahead-number 1) + (parser-generator-process-grammar) (should (equal '((c)) (parser-generator--e-free-first '(S b a)))) (message "Passed empty-free-first 1 with complex grammar") - (parser-generator--set-grammar '((Sp S) (a b) ((Sp S) (S (S a S b)) (S e)) Sp)) - (parser-generator--set-look-ahead-number 1) - (parser-generator--process-grammar) + (parser-generator-set-grammar '((Sp S) (a b) ((Sp S) (S (S a S b)) (S e)) Sp)) + (parser-generator-set-look-ahead-number 1) + (parser-generator-process-grammar) (should (equal nil @@ -435,8 +435,8 @@ "Test `parser-generator--get-grammar-rhs'." (message "Started tests for (parser-generator--get-grammar-rhs)") - (parser-generator--set-grammar '((S A) ("a" "b") ((S A) (A ("b" "a"))) S)) - (parser-generator--process-grammar) + (parser-generator-set-grammar '((S A) ("a" "b") ((S A) (A ("b" "a"))) S)) + (parser-generator-process-grammar) (should (equal '((A)) @@ -445,8 +445,8 @@ '(("b" "a")) (parser-generator--get-grammar-rhs 'A))) - (parser-generator--set-grammar '((S A B) ("a" "b") ((S A) (S (B)) (B "a") (A "a") (A ("b" "a"))) S)) - (parser-generator--process-grammar) + (parser-generator-set-grammar '((S A B) ("a" "b") ((S A) (S (B)) (B "a") (A "a") (A ("b" "a"))) S)) + (parser-generator-process-grammar) (should (equal '((A) (B)) @@ -461,8 +461,8 @@ "Test `parser-generator--valid-non-terminal-p'." (message "Starting tests for (parser-generator--valid-non-terminal-p)") - (parser-generator--set-grammar '((S A B) ("a" "b") ((S A) (S (B)) (B "a") (A "a") (A ("b" "a"))) S)) - (parser-generator--process-grammar) + (parser-generator-set-grammar '((S A B) ("a" "b") ((S A) (S (B)) (B "a") (A "a") (A ("b" "a"))) S)) + (parser-generator-process-grammar) (should (equal @@ -491,8 +491,8 @@ "Test `parser-generator--valid-terminal-p'." (message "Starting tests for (parser-generator--valid-terminal-p)") - (parser-generator--set-grammar '((S A B) ("a" "b") ((S A) (S (B)) (B "a") (A "a") (A ("b" "a"))) S)) - (parser-generator--process-grammar) + (parser-generator-set-grammar '((S A B) ("a" "b") ((S A) (S (B)) (B "a") (A "a") (A ("b" "a"))) S)) + (parser-generator-process-grammar) (should (equal