branch: externals/parser-generator commit 1b17ef808b8f5a38c12a92a64857bdc59c7e4bc3 Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Added another unit tests for translations --- parser-generator-lex-analyzer.el | 6 +- test/parser-generator-lex-analyzer-test.el | 20 ++++--- test/parser-generator-lr-test.el | 94 ++++++++++++++++-------------- 3 files changed, 66 insertions(+), 54 deletions(-) diff --git a/parser-generator-lex-analyzer.el b/parser-generator-lex-analyzer.el index 97eee8c..3e978c6 100644 --- a/parser-generator-lex-analyzer.el +++ b/parser-generator-lex-analyzer.el @@ -64,7 +64,7 @@ (when (< look-ahead-length parser-generator--look-ahead-number) (push next-look-ahead-item look-ahead) (setq look-ahead-length (1+ look-ahead-length)) - (setq index (1+ index))))) + (setq index (cdr (cdr next-look-ahead-item)))))) (push (list parser-generator--e-identifier) look-ahead) (setq look-ahead-length (1+ look-ahead-length)) (setq index (1+ index))))) @@ -83,12 +83,12 @@ (setq token (list token))) (let ((first-token (car token))) (setq parser-generator-lex-analyzer--index - (1+ parser-generator-lex-analyzer--index)) + (cdr (cdr first-token))) first-token))) (defun parser-generator-lex-analyzer--reset () "Reset lex-analyzer." - (setq parser-generator-lex-analyzer--index 0) + (setq parser-generator-lex-analyzer--index 1) (when parser-generator-lex-analyzer--reset-function (funcall parser-generator-lex-analyzer--reset-function))) diff --git a/test/parser-generator-lex-analyzer-test.el b/test/parser-generator-lex-analyzer-test.el index ad4df4c..7666a57 100644 --- a/test/parser-generator-lex-analyzer-test.el +++ b/test/parser-generator-lex-analyzer-test.el @@ -25,12 +25,12 @@ (lambda (index) (let* ((string '(("a" 1 . 2) ("b" 2 . 3) ("c" 3 . 4) ("d" 4 . 5))) (string-length (length string)) - (max-index (1+ index)) + (max-index index) (tokens)) (while (and - (< index string-length) - (< index max-index)) - (push (nth index string) tokens) + (< (1- index) string-length) + (< (1- index) max-index)) + (push (nth (1- index) string) tokens) (setq index (1+ index))) (nreverse tokens)))) (should-error @@ -39,6 +39,8 @@ (should-error (parser-generator-lex-analyzer--peek-next-look-ahead)) + (message "Passed failing lex analysis") + (setq parser-generator--look-ahead-number 1) (should (equal @@ -74,18 +76,20 @@ (lambda (index) (let* ((string '(("a" 1 . 2) ("b" 2 . 3))) (string-length (length string)) - (max-index (1+ index)) + (max-index index) (tokens)) (while (and - (< index string-length) - (< index max-index)) - (push (nth index string) tokens) + (< (1- index) string-length) + (< (1- index) max-index)) + (push (nth (1- index) string) tokens) (setq index (1+ index))) (nreverse tokens)))) (should-error (parser-generator-lex-analyzer--pop-token)) (parser-generator-lex-analyzer--reset) + (message "Passed failing lex analysis 2") + (should (equal '("a" 1 . 2) diff --git a/test/parser-generator-lr-test.el b/test/parser-generator-lr-test.el index 0a3215b..ab71d3a 100644 --- a/test/parser-generator-lr-test.el +++ b/test/parser-generator-lr-test.el @@ -237,12 +237,12 @@ (lambda (index) (let* ((string '((a 1 . 2) (a 2 . 3) (b 3 . 4) (b 4 . 5))) (string-length (length string)) - (max-index (1+ index)) + (max-index index) (tokens)) (while (and - (< index string-length) - (< index max-index)) - (push (nth index string) tokens) + (< (1- index) string-length) + (< (1- index) max-index)) + (push (nth (1- index) string) tokens) (setq index (1+ index))) (nreverse tokens)))) @@ -258,12 +258,12 @@ (lambda (index) (let* ((string '((a 1 . 2) (a 2 . 3) (b 3 . 4) (b 4 . 5) (b 5 . 6))) (string-length (length string)) - (max-index (1+ index)) + (max-index index) (tokens)) (while (and - (< index string-length) - (< index max-index)) - (push (nth index string) tokens) + (< (1- index) string-length) + (< (1- index) max-index)) + (push (nth (1- index) string) tokens) (setq index (1+ index))) (nreverse tokens)))) @@ -284,12 +284,12 @@ (lambda (index) (let* ((string '(("a" 1 . 2) ("a" 2 . 3) ("b" 3 . 4) ("b" 4 . 5))) (string-length (length string)) - (max-index (1+ index)) + (max-index index) (tokens)) (while (and - (< index string-length) - (< index max-index)) - (push (nth index string) tokens) + (< (1- index) string-length) + (< (1- index) max-index)) + (push (nth (1- index) string) tokens) (setq index (1+ index))) (nreverse tokens)))) @@ -305,12 +305,12 @@ (lambda (index) (let* ((string '(("a" 1 . 2) ("a" 2 . 3) ("b" 3 . 4) ("b" 4 . 5) ("b" 5 . 6))) (string-length (length string)) - (max-index (1+ index)) + (max-index index) (tokens)) (while (and - (< index string-length) - (< index max-index)) - (push (nth index string) tokens) + (< (1- index) string-length) + (< (1- index) max-index)) + (push (nth (1- index) string) tokens) (setq index (1+ index))) (nreverse tokens)))) @@ -334,9 +334,9 @@ parser-generator-lex-analyzer--function (lambda (index) (with-current-buffer buffer - (when (<= (+ index 2) (point-max)) - (let ((start (+ index 1)) - (end (+ index 2))) + (when (<= (+ index 1) (point-max)) + (let ((start index) + (end (+ index 1))) (let ((token (buffer-substring-no-properties start end))) `(,token ,start . ,end))))))) @@ -361,7 +361,7 @@ (switch-to-buffer buffer) (insert "if (a) { b; }") - (parser-generator-set-grammar '((Sp S) (";" OPEN_ROUND_BRACKET CLOSE_ROUND_BRACKET IF OPEN_CURLY_BRACKET CLOSE_CURLY_BRACKET VARIABLE) ((Sp S) (S (IF OPEN_ROUND_BRACKET VARIABLE CLOSE_ROUND_BRACKET OPEN_CURLY_BRACKET VARIABLE CLOSE_CURLY_BRACKET (lambda(args) (nreverse args))))) Sp)) + (parser-generator-set-grammar '((Sp S) (";" OPEN_ROUND_BRACKET CLOSE_ROUND_BRACKET IF OPEN_CURLY_BRACKET CLOSE_CURLY_BRACKET VARIABLE) ((Sp S) (S (IF OPEN_ROUND_BRACKET VARIABLE CLOSE_ROUND_BRACKET OPEN_CURLY_BRACKET VARIABLE ";" CLOSE_CURLY_BRACKET (lambda(args) (format "(when %s %s)" (nth 2 args) (nth 5 args)))))) Sp)) (parser-generator-set-look-ahead-number 1) (parser-generator-process-grammar) (parser-generator-lr-generate-parser-tables) @@ -370,28 +370,28 @@ parser-generator-lex-analyzer--function (lambda (index) (with-current-buffer buffer - (goto-char index) - (unless (looking-at "[^ \n\t]") - (search-forward-regexp "[^ \n\t]") - (forward-char -1)) - (let ((token)) - (cond - ((looking-at "if") - (setq token `(IF ,(match-beginning 0) . ,(match-end 0)))) - ((looking-at "(") - (setq token `(OPEN_ROUND_BRACKET ,(match-beginning 0) . ,(match-end 0)))) - ((looking-at ")") - (setq token `(CLOSE_ROUND_BRACKET ,(match-beginning 0) . ,(match-end 0)))) - ((looking-at "{") - (setq token `(OPEN_CURLY_BRACKET ,(match-beginning 0) . ,(match-end 0)))) - ((looking-at "}") - (setq token `(CLOSE_CURLY_BRACKET ,(match-beginning 0) . ,(match-end 0)))) - ((looking-at ";") - (setq token `(";" ,(match-beginning 0) . ,(match-end 0)))) - ((looking-at "[a-zA-Z]+") - (setq token `(VARIABLE ,(match-beginning 0) . ,(match-end 0))))) - (message "Token: %s, index: %s, point: %s" token index (point)) - token)))) + (unless (>= index (point-max)) + (goto-char index) + (unless (looking-at "[^ \n\t]") + (search-forward-regexp "[^ \n\t]" nil t nil) + (forward-char -1)) + (let ((token)) + (cond + ((looking-at "if") + (setq token `(IF ,(match-beginning 0) . ,(match-end 0)))) + ((looking-at "(") + (setq token `(OPEN_ROUND_BRACKET ,(match-beginning 0) . ,(match-end 0)))) + ((looking-at ")") + (setq token `(CLOSE_ROUND_BRACKET ,(match-beginning 0) . ,(match-end 0)))) + ((looking-at "{") + (setq token `(OPEN_CURLY_BRACKET ,(match-beginning 0) . ,(match-end 0)))) + ((looking-at "}") + (setq token `(CLOSE_CURLY_BRACKET ,(match-beginning 0) . ,(match-end 0)))) + ((looking-at ";") + (setq token `(";" ,(match-beginning 0) . ,(match-end 0)))) + ((looking-at "[a-zA-Z]+") + (setq token `(VARIABLE ,(match-beginning 0) . ,(match-end 0))))) + token))))) (setq parser-generator-lex-analyzer--get-function @@ -404,9 +404,17 @@ (should (equal - '((2 2 2 1 1) ("b" "a" "b" "a")) + '((1) ("(when a b)")) (parser-generator-lr--parse))) + (switch-to-buffer buffer) + (kill-region (point-min) (point-max)) + (goto-char 1) + (insert "if (a) { b }") + + (should-error + (parser-generator-lr--parse)) + (kill-buffer buffer)) (message "Passed test with translation 2")