branch: externals/parser-generator commit 4f85cc56167dfa590b58e3713cc7067e5214b6e8 Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Passes byte-compilation tests --- parser-generator-ll.el | 68 ++++++++++++++++++++++++++++++++++++++++--- test/parser-generator-test.el | 13 ++++----- 2 files changed, 69 insertions(+), 12 deletions(-) diff --git a/parser-generator-ll.el b/parser-generator-ll.el index e5355bf972..cae577329f 100644 --- a/parser-generator-ll.el +++ b/parser-generator-ll.el @@ -116,7 +116,9 @@ parser-generator--look-ahead-number parser-generator--eof-identifier)) (e-reduction - (list parser-generator--e-identifier))) + (list parser-generator--e-identifier)) + (translation-stack) + (terminal-stack '())) (parser-generator-lex-analyzer--reset) (while (not accept) (let* ((state (car stack)) @@ -191,13 +193,70 @@ ((equal action-type 'pop) (parser-generator--debug (message "pushed: %S" look-ahead)) - (parser-generator-lex-analyzer--pop-token) - (pop stack)) + (let ((popped-tokens + (parser-generator-lex-analyzer--pop-token))) + (pop stack) + + (let ((token-data) + (old-terminal-stack (car terminal-stack))) + (dolist (popped-token popped-tokens) + (let ((token-datum + (parser-generator-lex-analyzer--get-function + popped-token))) + (push + token-datum + token-data))) + (push + token-data + old-terminal-stack) + (setf + (car terminal-stack) + old-terminal-stack)) + + ;; Is it time for SDT? + (when (and + translation-stack + (string= + (format "%S" (car (car translation-stack))) + (format "%S" stack))) + (let ((translation (pop translation-stack)) + (sdt-terminal-stack (pop terminal-stack))) + (message + "Do SDT %S (%S)" + translation + sdt-terminal-stack) + ;; TODO Do something + )))) ((equal action-type 'reduce) (parser-generator--debug (message "reduced: %S -> %S" state (nth 1 action))) (pop stack) + + ;; Is it time for SDT? + (when (and + translation-stack + (string= + (format "%S" (car (car translation-stack))) + (format "%S" stack))) + (let ((translation (pop translation-stack)) + (sdt-terminal-stack (pop terminal-stack))) + (message + "Do SDT %S (%S)" + translation + sdt-terminal-stack) + ;; TODO Do something + )) + + (push + (list + (format "%S" stack) + (nth 2 action)) + translation-stack) + (push + '() + terminal-stack) + (unless (equal (nth 1 action) e-reduction) (dolist (reduce-item (reverse (nth 1 action))) (push reduce-item stack))) @@ -649,7 +708,8 @@ (setq rhs (nth rhss-index rhss)) (let* ((firsts-rhs (parser-generator--first rhs)) (firsts-rhs-length (length firsts-rhs)) - (firsts-index 0)) + (firsts-index 0) + (first-rhs)) (while (and valid (< firsts-index firsts-rhs-length)) diff --git a/test/parser-generator-test.el b/test/parser-generator-test.el index e5869fa554..45dd865238 100644 --- a/test/parser-generator-test.el +++ b/test/parser-generator-test.el @@ -971,22 +971,22 @@ "Test `parser-generator--merge-max-terminal-sets'." (message "Starting tests for (parser-generator--merge-max-terminal-sets)") + (parser-generator-set-eof-identifier '$) + (parser-generator-set-e-identifier 'e) + (parser-generator-set-look-ahead-number 2) (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) ;; Example 5.13 p. 348 - (parser-generator-set-e-identifier 'e) - (parser-generator-set-look-ahead-number 2) (should (equal '((a b) (b) (b a)) (parser-generator--merge-max-terminal-sets '((a b b) (e)) - '((b) (b a b))))) + '((b) (b a b)) + t))) ;; Example 5.14 p. 350 - (parser-generator-set-e-identifier 'e) - (parser-generator-set-look-ahead-number 2) (should (equal '((a a) (a b) (b b)) @@ -994,9 +994,6 @@ '((a b) (a e a) (b b) (b e b)) nil))) - (parser-generator-set-eof-identifier '$) - (parser-generator-set-e-identifier 'e) - (parser-generator-set-look-ahead-number 2) (should (equal '(($ $) (a $) (a a))