branch: externals/parser-generator commit 3e1f2b6875cd23b5a2a75a09fcd4de17ab8bb012 Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Passed first for calculating valid LR-sets for viable prefix γ --- parser.el | 21 +++------------------ test/parser-test.el | 6 +++--- 2 files changed, 6 insertions(+), 21 deletions(-) diff --git a/parser.el b/parser.el index 7986fad..af5ac0d 100644 --- a/parser.el +++ b/parser.el @@ -663,8 +663,6 @@ (push `(,start nil ,rhs (e)) lr-items-e) (puthash `(e ,start nil ,rhs (e)) t lr-item-exists)) - (message "V(e): %s" lr-items-e) - ;; (b) Iterate every item in v-set(e), if [A -> . Bα, u] is an item and B -> β is in P ;; then for each x in FIRST(αu) add [B -> . β, x] to v-set(e), provided it is not already there (let ((found-new t)) @@ -679,22 +677,14 @@ (rhs (nth 2 item)) (suffix (nth 3 item))) - (message "item: %s" item) - (message "prefix: %s" prefix) - (message "rhs: %s" rhs) - (message "suffix: %s" suffix) - ;; Without prefix (unless prefix ;; Check if RHS starts with a non-terminal (let ((rhs-first (car rhs))) (when (parser--valid-non-terminal-p rhs-first) - (message "rhs-first: %s" rhs-first) (let ((rhs-rest (append (cdr rhs) suffix))) - (message "rhs-rest: %s" rhs-rest) (let ((rhs-rest-first (parser--first rhs-rest))) - (message "1b FIRST(%s) = %s" rhs-rest rhs-rest-first) (let ((sub-production (parser--get-grammar-rhs rhs-first))) ;; For each production with B as LHS @@ -704,16 +694,13 @@ (dolist (f rhs-rest-first) ;; Add [B -> . β, x] to v-set(e), provided it is not already there - (message "f: %s" f) (unless (gethash `(e ,rhs-first nil ,sub-rhs ,f) lr-item-exists) - (message "new-item: %s" `(,rhs-first nil ,sub-rhs ,f)) (puthash `(e ,rhs-first nil ,sub-rhs ,f) t lr-item-exists) (push `(,rhs-first nil ,sub-rhs ,f) lr-items-e) ;; (c) Repeat (b) until no more items can be added to v-set(e) (setq found-new t)))))))))))))) - (puthash 'e lr-items-e lr-items) - (message "V(e) = %s" lr-items-e)) + (puthash 'e lr-items-e lr-items)) ;; 2 Suppose that we have constructed V(X1,X2,...,Xi-1) we construct V(X1,X2,...,Xi) as follows: (let ((prefix-acc) @@ -723,7 +710,6 @@ (setq prefix-acc (append prefix-acc prefix)) (unless (listp prefix-acc) (setq prefix-acc (list prefix-acc))) - (message "prefix-acc: %s" prefix-acc) (dolist (lr-item prefix-previous) (let ((lr-item-lhs (nth 0 lr-item)) @@ -737,7 +723,8 @@ (when (eq lr-item-suffix-first prefix) ;; Add [A -> aXi . B, u] to V(X1,...,Xi) - (push `(,lr-item-lhs ,(append lr-item-prefix prefix) ,lr-item-suffix-rest ,lr-item-look-ahead) lr-new-item))))) + (let ((combined-prefix (append lr-item-prefix (list prefix)))) + (push `(,lr-item-lhs ,combined-prefix ,lr-item-suffix-rest ,lr-item-look-ahead) lr-new-item)))))) ;; (c) Repeat step (2b) until no more new items can be added to V(X1,...,Xi) (let ((added-new t)) @@ -753,7 +740,6 @@ (when (parser--valid-non-terminal-p lr-item-suffix-first) (let ((lr-item-suffix-rest-first (parser--first lr-item-suffix-rest))) - (message "2b FIRST(%s) = %s" lr-item-suffix-first lr-item-suffix-rest-first) (let ((sub-production (parser--get-grammar-rhs lr-item-suffix-first))) ;; For each production with B as LHS @@ -769,7 +755,6 @@ (puthash `(,prefix-acc ,lr-item-suffix-first nil ,sub-rhs ,f) t lr-item-exists) (push `(,lr-item-suffix-first nil ,sub-rhs ,f) lr-new-item)))))))))))) - (message "V%s = %s" prefix-acc lr-new-item) (setq prefix-previous prefix-acc) (puthash prefix-acc lr-new-item lr-items)))) diff --git a/test/parser-test.el b/test/parser-test.el index 50c1e2b..44e31ca 100644 --- a/test/parser-test.el +++ b/test/parser-test.el @@ -233,9 +233,9 @@ (message "Loaded grammar") (should (equal - '((Sp (S) nil nil e) - (S (S) nil (a S b) a) - (S (S) nil (a S b) e)) + '((Sp (S) nil (e)) + (S (S) (a S b) (e)) + (S (S) (a S b) (a))) (parser--lr-items 'S))) (message "Passed tests for (parser--lr-items)"))