branch: externals/phps-mode commit ab56c9994176ce9a2686a3184b4e665a42c39f6a Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
More work on debugging parser-lexer --- phps-mode-parser.el | 67 +++---------------------------------------- test/phps-mode-test-parser.el | 15 ++++++---- 2 files changed, 13 insertions(+), 69 deletions(-) diff --git a/phps-mode-parser.el b/phps-mode-parser.el index 58a1eb7..de5abb5 100644 --- a/phps-mode-parser.el +++ b/phps-mode-parser.el @@ -62,64 +62,7 @@ (defconst phps-mode-parser-lex-analyzer--function - (lambda (index) - (save-current-buffer - (set-buffer "*phps-mode-lex-analyzer*") - (unless (= (point) index) - (goto-char index)) - - (when (< index (point-max)) - - ;; Only lex if we have not lexed this position recently - (unless (and - phps-mode-lexer--generated-new-tokens-index - (= - phps-mode-lexer--generated-new-tokens-index - index)) - (phps-mode-lexer--re2c)) - - (let ((first (car (nreverse phps-mode-lexer--generated-new-tokens)))) - - (cond - - ;; Lexer has moved forward - lex again - ((and - (not first) - (not (equal index semantic-lex-end-point))) - (setq - phps-mode-parser-lex-analyzer--index - semantic-lex-end-point) - (setq - first - (funcall - phps-mode-parser-lex-analyzer--function - phps-mode-parser-lex-analyzer--index))) - - ;; Skip open and close tag - ((or - (equal (car first) 'T_OPEN_TAG) - (equal (car first) 'T_CLOSE_TAG)) - (setq - phps-mode-parser-lex-analyzer--index - (cdr (cdr first))) - (setq - first - (funcall - phps-mode-parser-lex-analyzer--function - phps-mode-parser-lex-analyzer--index))) - - ;; Open tag with echo is replaced with echo - ((equal (car first) 'T_OPEN_TAG_WITH_ECHO) - (setf - (car first) - 'T_ECHO) - (setq - phps-mode-parser-lex-analyzer--index - (cdr (cdr first)))) - - ) - - first)))) + (lambda (index) (save-current-buffer (set-buffer "*phps-mode-lex-analyzer*") (if (= (point) index) nil (goto-char index)) (if (< index (point-max)) (progn (if (and phps-mode-lexer--generated-new-tokens-index (= phps-mode-lexer--generated-new-tokens-index index)) nil (phps-mode-lexer--re2c)) (let ((first (car (reverse phps-mode-lexer--generated-new-tokens)))) (cond ((and (not first) (not (equal index semantic-lex-end-point))) (setq phps-mode-parser-lex-analyzer--index semantic-lex-end-p [...] "The lex-analyzer function.") (defconst @@ -226,7 +169,7 @@ "Lex-analyze failed to peek next look-ahead at %s, error: %s" index error)))) - (nreverse look-ahead))) + (reverse look-ahead))) (defun phps-mode-parser-lex-analyzer--pop-token () @@ -461,11 +404,8 @@ ;; (c) If f(u) = error, we halt parsing (and, in practice ;; transfer to an error recovery routine). (error - (format "Invalid syntax! Expected one of %s found %s at %s" - possible-look-aheads - look-ahead - phps-mode-parser-lex-analyzer--index) + possible-look-aheads look-ahead phps-mode-parser-lex-analyzer--index)) @@ -722,6 +662,7 @@ translation translation-symbol-table-list history))))) + (defun phps-mode-parser-parse (&optional input-tape-index diff --git a/test/phps-mode-test-parser.el b/test/phps-mode-test-parser.el index f219182..5ed4db0 100644 --- a/test/phps-mode-test-parser.el +++ b/test/phps-mode-test-parser.el @@ -30,12 +30,15 @@ (require 'phps-mode-lexer) (require 'phps-mode-parser) -(defun phps-mode-test-parser--buffer-contentes (buffer-contents name logic) +(defun phps-mode-test-parser--buffer-contents (buffer-contents name logic) (generate-new-buffer "*phps-mode-lex-analyzer*") (with-current-buffer "*phps-mode-lex-analyzer*" (kill-region (point-min) (point-max)) (insert buffer-contents) - (message "Testing buffer '%S' with buffer-contents:\n%S\n" name (buffer-substring-no-properties (point-min) (point-max))) + (message + "Testing buffer %S with buffer-contents:\n%S\n" + name + (buffer-substring-no-properties (point-min) (point-max))) ;; Reset lexer (setq-local @@ -69,7 +72,7 @@ (message "-- Running all tests for parser... --\n") ;; TODO Verify parse below - (phps-mode-test-parser--buffer-contentes + (phps-mode-test-parser--buffer-contents "<?php echo 'hello';" "Basic echo test" (lambda() @@ -78,16 +81,16 @@ '(80 459 466 411 333 332 154 102 79) (phps-mode-parser-parse))))) -(phps-mode-test-parser--buffer-contentes + (phps-mode-test-parser--buffer-contents "<? echo 'hello'; ?>" - "Basic echo test 2 with short open tag" + "Basic echo test 2 with short open tag and close tag" (lambda() (should (equal '(80 459 466 411 333 332 154 102 79) (phps-mode-parser-parse))))) - (phps-mode-test-parser--buffer-contentes + (phps-mode-test-parser--buffer-contents "<?= 'hello';" "Basic echo test 3 with open tag with echo" (lambda()