branch: externals/parser-generator commit 9d0d9e59d3096272fda58b125d4d04b9f0954c51 Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Various debugging --- parser.el | 52 +++++++++++++++++++++++++++++----------------------- test/parser-test.el | 4 ++-- 2 files changed, 31 insertions(+), 25 deletions(-) diff --git a/parser.el b/parser.el index 82a8358..1d2dab2 100644 --- a/parser.el +++ b/parser.el @@ -385,19 +385,27 @@ (let ((sub-terminal-index 0)) (dolist (sub-terminal-alternative-set sub-terminal-sets) (unless (= sub-terminal-index 0) - (parser--debug (message "Sub-terminal-alternative-set: %s" sub-terminal-alternative-set)) - - ;; When we have a leading terminal and sub-terminal set is empty, don't append it - (when (and - (< input-tape-index (1- input-tape-length)) - (parser--valid-e-p (car sub-terminal-alternative-set))) - (setq sub-terminal-alternative-set nil)) - - (let ((sub-rhs-leading-terminals (append leading-terminals sub-terminal-alternative-set))) - (when (> (length sub-rhs-leading-terminals) k) - (setq sub-rhs-leading-terminals (butlast sub-rhs-leading-terminals (- (length sub-rhs-leading-terminals) k)))) - (push `(,sub-rhs-leading-terminals ,all-leading-terminals-p ,(1+ input-tape-index)) stack))) - (setq sub-terminal-index (1+ sub-terminal-index))))) + (let ((alternative-all-leading-terminals-p all-leading-terminals-p)) + (parser--debug (message "Sub-terminal-alternative-set: %s" sub-terminal-alternative-set)) + + ;; When sub-set only contains the e symbol + (when (parser--valid-e-p (car sub-terminal-alternative-set)) + (parser--debug (message "alternative-set is e symbol")) + (if disallow-e-first + (when (= leading-terminals-count 0) + (setq alternative-all-leading-terminals-p nil)) + (when (or + (> leading-terminals-count 0) + (< input-tape-index (1- input-tape-length))) + (setq sub-terminal-alternative-set nil) + (parser--debug (message "Cleared sub-terminal-alternative-set"))))) + + (let ((sub-rhs-leading-terminals (append leading-terminals sub-terminal-alternative-set))) + (parser--debug (message "sub-rhs-leading-terminals: %s" sub-rhs-leading-terminals)) + (when (> (length sub-rhs-leading-terminals) k) + (setq sub-rhs-leading-terminals (butlast sub-rhs-leading-terminals (- (length sub-rhs-leading-terminals) k)))) + (push `(,sub-rhs-leading-terminals ,alternative-all-leading-terminals-p ,(1+ input-tape-index)) stack))) + (setq sub-terminal-index (1+ sub-terminal-index)))))) (parser--debug (message "Sub-terminal-set: %s" sub-terminal-set)) (when (or @@ -413,16 +421,14 @@ (setq all-leading-terminals-p nil))) ((equal rhs-type 'EMPTY) - (if all-leading-terminals-p - (if disallow-e-first - (when (= leading-terminals-count 0) - (setq all-leading-terminals-p nil)) - (when (and - (= leading-terminals-count 0) - (= input-tape-index (1- input-tape-length))) - (setq leading-terminals (append leading-terminals rhs-element)) - (setq leading-terminals-count (1+ leading-terminals-count)))) - (setq all-leading-terminals-p nil))) + (if disallow-e-first + (when (= leading-terminals-count 0) + (setq all-leading-terminals-p nil)) + (when (and + (= leading-terminals-count 0) + (= input-tape-index (1- input-tape-length))) + (setq leading-terminals (append leading-terminals rhs-element)) + (setq leading-terminals-count (1+ leading-terminals-count))))) ((equal rhs-type 'TERMINAL) (when all-leading-terminals-p diff --git a/test/parser-test.el b/test/parser-test.el index 1b27845..ac865e8 100644 --- a/test/parser-test.el +++ b/test/parser-test.el @@ -99,10 +99,10 @@ (message "Passed first 1 with complex grammar") ;; Example 5.28 p 382 - (parser--set-grammar '((S A B C) ("a" "b" "c") ((S A B) (A (B "a") e) (B (C "b") C) (C "c" e)) S) 2) + (parser--set-grammar '((S A B C) (a b c) ((S (A B)) (A (B a) e) (B (C b) C) (C c e)) S) 2) (should (equal - '(("a") ("a" "b") ("a" "c") ("b") ("b" "a") ("c") ("c" "a") ("c" "b") (e)) + '((a) (a c) (a b) (c a) (b a) (e) (c) (b) (c b)) (parser--first 'S))) (message "Passed first 2 with complex grammar")