branch: externals/parser-generator commit 33634ddda5a1a6bae2bf524d0b7fe7aa04059fc9 Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Passing all tests after refactor --- parser-generator-lex-analyzer.el | 40 ++++++++++++++++++------------ test/parser-generator-lex-analyzer-test.el | 8 +++--- test/parser-generator-lr-test.el | 36 ++++++++++++++++++--------- 3 files changed, 53 insertions(+), 31 deletions(-) diff --git a/parser-generator-lex-analyzer.el b/parser-generator-lex-analyzer.el index 6f0609f..e2aa7e4 100644 --- a/parser-generator-lex-analyzer.el +++ b/parser-generator-lex-analyzer.el @@ -58,7 +58,7 @@ (unless parser-generator-lex-analyzer--function (error "Missing lex-analyzer function!")) (unless parser-generator--look-ahead-number - (error "Missing look-ahead number!")) + (error "Missing look-ahead-number!")) (let ((look-ahead) (look-ahead-length 0) (index parser-generator-lex-analyzer--index)) @@ -97,21 +97,29 @@ (error "Missing lex-analyzer index!")) (unless parser-generator-lex-analyzer--function (error "Missing lex-analyzer function!")) - (condition-case error - (progn - (let ((token (funcall - parser-generator-lex-analyzer--function - parser-generator-lex-analyzer--index))) - (unless (listp (car token)) - (setq token (list token))) - (let ((first-token (car token))) - (setq parser-generator-lex-analyzer--index - (cdr (cdr first-token))) - first-token))) - (error (error - "Lex-analyze failed to pop token at %s, error: %s" - parser-generator-lex-analyzer--index - (car (cdr error)))))) + (unless parser-generator--look-ahead-number + (error "Missing look-ahead-number!")) + (let ((iteration 0) + (tokens)) + (while (< iteration parser-generator--look-ahead-number) + (condition-case error + (progn + (let ((token + (funcall + parser-generator-lex-analyzer--function + parser-generator-lex-analyzer--index))) + (unless (listp (car token)) + (setq token (list token))) + (let ((first-token (car token))) + (setq parser-generator-lex-analyzer--index + (cdr (cdr first-token))) + (push first-token tokens)))) + (error (error + "Lex-analyze failed to pop token at %s, error: %s" + parser-generator-lex-analyzer--index + (car (cdr error))))) + (setq iteration (1+ iteration))) + (nreverse tokens))) (defun parser-generator-lex-analyzer--reset () "Reset lex-analyzer." diff --git a/test/parser-generator-lex-analyzer-test.el b/test/parser-generator-lex-analyzer-test.el index e3fcc9c..5cee3f0 100644 --- a/test/parser-generator-lex-analyzer-test.el +++ b/test/parser-generator-lex-analyzer-test.el @@ -113,17 +113,19 @@ (message "Passed failing lex analysis 2") + (setq parser-generator--look-ahead-number 1) + (should (equal - '("a" 1 . 2) + '(("a" 1 . 2)) (parser-generator-lex-analyzer--pop-token))) (should (equal - '("b" 2 . 3) + '(("b" 2 . 3)) (parser-generator-lex-analyzer--pop-token))) (should (equal - nil + '(nil) (parser-generator-lex-analyzer--pop-token))) (message "Ended tests for (parser-generator-lex-analyzer--pop-token)")) diff --git a/test/parser-generator-lr-test.el b/test/parser-generator-lr-test.el index f0327b4..89fe758 100644 --- a/test/parser-generator-lr-test.el +++ b/test/parser-generator-lr-test.el @@ -272,7 +272,6 @@ (parser-generator-set-look-ahead-number 1) (parser-generator-process-grammar) (parser-generator-lr-generate-parser-tables) - (setq parser-generator-lex-analyzer--function (lambda (index) @@ -286,12 +285,10 @@ (push (nth (1- index) string) tokens) (setq index (1+ index))) (nreverse tokens)))) - (should (equal '(2 2 2 1 1) (parser-generator-lr-parse))) - (message "Passed test with terminals as symbols") (setq @@ -307,19 +304,14 @@ (push (nth (1- index) string) tokens) (setq index (1+ index))) (nreverse tokens)))) - (should-error (parser-generator-lr--parse)) - (message "Passed test with terminals as symbols, invalid syntax") - ;; 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-lr-generate-parser-tables) - (setq parser-generator-lex-analyzer--function (lambda (index) @@ -333,12 +325,10 @@ (push (nth (1- index) string) tokens) (setq index (1+ index))) (nreverse tokens)))) - (should (equal '(2 2 2 1 1) (parser-generator-lr-parse))) - (message "Passed test with terminals as string") (setq @@ -354,10 +344,8 @@ (push (nth (1- index) string) tokens) (setq index (1+ index))) (nreverse tokens)))) - (should-error (parser-generator-lr--parse)) - (message "Passed test with terminals as string, invalid syntax") (setq @@ -378,6 +366,30 @@ (message "Passed incremental-tests") + ;; (parser-generator-set-grammar '((Sp S) ("a" "b") ((Sp S) (S (S "a" S "b")) (S e)) Sp)) + ;; (parser-generator-set-look-ahead-number 2) + ;; (parser-generator-process-grammar) + ;; (parser-generator-lr-generate-parser-tables) + ;; (setq + ;; parser-generator-lex-analyzer--function + ;; (lambda (index) + ;; (let* ((string '(("a" 1 . 2) ("a" 2 . 3) ("b" 3 . 4) ("b" 4 . 5))) + ;; (string-length (length string)) + ;; (max-index index) + ;; (tokens)) + ;; (while (and + ;; (< (1- index) string-length) + ;; (< (1- index) max-index)) + ;; (push (nth (1- index) string) tokens) + ;; (setq index (1+ index))) + ;; (nreverse tokens)))) + ;; (should + ;; (equal + ;; '(2 2 2 1 1) + ;; (parser-generator-lr-parse))) + ;; (message "Passed test with terminals as string with look-ahead-number 2") + + (message "Passed tests for (parser-generator-lr--parse)")) (defun parser-generator-lr-test-translate ()