branch: externals/parser-generator commit 04fdc96a4e891e29932770a931311e8eef9f96ca Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Added unit-test for incremental translations --- parser-generator-lex-analyzer.el | 4 ++- test/parser-generator-lr-test.el | 53 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/parser-generator-lex-analyzer.el b/parser-generator-lex-analyzer.el index 3e978c6..b9f30c3 100644 --- a/parser-generator-lex-analyzer.el +++ b/parser-generator-lex-analyzer.el @@ -33,13 +33,14 @@ ;; Functions +;; TODO Catch errors (defun parser-generator-lex-analyzer--get-function (token) "Get information about TOKEN." (unless parser-generator-lex-analyzer--get-function (error "Missing lex-analyzer get function!")) (funcall parser-generator-lex-analyzer--get-function token)) - +;; TODO Catch errors (defun parser-generator-lex-analyzer--peek-next-look-ahead () "Peek next look-ahead number of tokens via lex-analyzer." (unless parser-generator-lex-analyzer--index @@ -70,6 +71,7 @@ (setq index (1+ index))))) (nreverse look-ahead))) +;; TODO Catch errors (defun parser-generator-lex-analyzer--pop-token () "Pop next token via lex-analyzer." (unless parser-generator-lex-analyzer--index diff --git a/test/parser-generator-lr-test.el b/test/parser-generator-lr-test.el index a520347..c087302 100644 --- a/test/parser-generator-lr-test.el +++ b/test/parser-generator-lr-test.el @@ -376,7 +376,7 @@ (parser-generator-lr-test--parse-incremental-vs-regular) - (message "Passed incremental-test with terminals as string") + (message "Passed incremental-tests") (message "Passed tests for (parser-generator-lr--parse)")) @@ -485,6 +485,57 @@ ;; TODO Add incremental translation here + (let ((buffer (generate-new-buffer "*a*"))) + (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) (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) + + (setq + parser-generator-lex-analyzer--function + (lambda (index) + (with-current-buffer "*a*" + (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)))) + (t (error "Invalid syntax! Could not lex-analyze at %s!" (point)))) + token))))) + + (setq + parser-generator-lex-analyzer--get-function + (lambda (token) + (with-current-buffer "*a*" + (let ((start (car (cdr token))) + (end (cdr (cdr token)))) + (when (<= end (point-max)) + (buffer-substring-no-properties start end)))))) + + (parser-generator-lr-test--parse-incremental-vs-regular) + (kill-buffer buffer)) + + (message "Passed incremental tests") + (message "Passed tests for (parser-generator-lr-translate)")) (defun parser-generator-lr-test ()