branch: externals/phps-mode commit e89976c46c38fe4e4f94aee6f40cf5bf14e8fd65 Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Error-handling and presentation of lexer errors --- docs/todo.md | 1 + phps-mode-analyzer.el | 2610 ++++++++++++++++++++++-------------------- phps-mode.el | 6 +- test/phps-mode-test-lexer.el | 6 +- 4 files changed, 1365 insertions(+), 1258 deletions(-) diff --git a/docs/todo.md b/docs/todo.md index d69500b..7746bed 100644 --- a/docs/todo.md +++ b/docs/todo.md @@ -11,5 +11,6 @@ * Eldoc support (0%) * Flymake support (0%) * PSR-2 auto-formatting tool based on lexer tokens (0%) +* Alternative indentation for inline control structures (0%) [Back to start](../../../) diff --git a/phps-mode-analyzer.el b/phps-mode-analyzer.el index 36d5bf1..56176da 100644 --- a/phps-mode-analyzer.el +++ b/phps-mode-analyzer.el @@ -183,7 +183,7 @@ ;; (message "Going back to poppped state %s" old-state) (if old-state (phps-mode-lexer-BEGIN old-state) - (display-warning 'phps-mode "PHPs Lexer Error - Going back to nil?")))) + (signal 'error (list "PHPs Lexer Error - Going back from state to nil?"))))) (defun phps-mode-lexer-MOVE_FORWARD (position) "Move forward to POSITION." @@ -384,17 +384,11 @@ (defun phps-mode-lexer-RETURN_TOKEN (token start end) "Push TOKEN to list with START and END." -(phps-mode-analyzer-emit-token token start end)) + (phps-mode-analyzer-emit-token token start end)) (defun phps-mode-analyzer-emit-token (token start end) "Emit TOKEN with START and END." - ;; Colourize token - (let ((token-syntax-color (phps-mode-lexer-get-token-syntax-color token))) - (if token-syntax-color - (phps-mode-lexer-set-region-syntax-color start end token-syntax-color) - (phps-mode-lexer-clear-region-syntax-color start end))) - ;; (when (and ;; (equal token 'T_INLINE_HTML) ;; phps-mode-inline-mmm-submode @@ -442,14 +436,12 @@ ;; (message "Found match %s" phps-mode-lexer-re2c-matching-data) (set-match-data phps-mode-lexer-re2c-matching-data) (funcall phps-mode-lexer-re2c-matching-body)) - (error "Failed to lex input"))) + (signal 'error (list "Found no matching lexer rule to execute")))) ;; LEXERS -;; If multiple rules match, re2c prefers the longest match. If rules match the same string, the earlier rule has priority. -;; @see http://re2c.org/manual/syntax/syntax.html -(define-lex-analyzer phps-mode-lexer-lex-analyzer +(define-lex-analyzer phps-mode-analyzer-lexer "Elisp port of original Zend re2c lexer." t @@ -467,1264 +459,1284 @@ (let ((start (car (cdr token))) (end (cdr (cdr token))) (token-name (car token))) + + ;; Apply syntax color on token + (let ((token-syntax-color (phps-mode-lexer-get-token-syntax-color token-name))) + (if token-syntax-color + (phps-mode-lexer-set-region-syntax-color start end token-syntax-color) + (phps-mode-lexer-clear-region-syntax-color start end))) + (semantic-lex-push-token (semantic-lex-token token-name start end)))) (phps-mode-lexer-MOVE_FORWARD (point-max))) - (phps-mode-debug-message (message "Running lexer from %s" old-start)) - - (let ((heredoc_label (car phps-mode-lexer-heredoc_label_stack)) - (SHEBANG (equal phps-mode-lexer-STATE 'SHEBANG)) - (ST_IN_SCRIPTING (equal phps-mode-lexer-STATE 'ST_IN_SCRIPTING)) - (ST_INITIAL (equal phps-mode-lexer-STATE 'ST_INITIAL)) - (ST_LOOKING_FOR_PROPERTY (equal phps-mode-lexer-STATE 'ST_LOOKING_FOR_PROPERTY)) - (ST_DOUBLE_QUOTES (equal phps-mode-lexer-STATE 'ST_DOUBLE_QUOTES)) - (ST_BACKQUOTE (equal phps-mode-lexer-STATE 'ST_BACKQUOTE)) - (ST_HEREDOC (equal phps-mode-lexer-STATE 'ST_HEREDOC)) - (ST_NOWDOC (equal phps-mode-lexer-STATE 'ST_NOWDOC)) - (ST_LOOKING_FOR_VARNAME (equal phps-mode-lexer-STATE 'ST_LOOKING_FOR_VARNAME)) - (ST_END_HEREDOC (equal phps-mode-lexer-STATE 'ST_END_HEREDOC)) - (ST_VAR_OFFSET (equal phps-mode-lexer-STATE 'ST_VAR_OFFSET))) - - ;; Reset re2c flags - (setq phps-mode-lexer-re2c-matching-body nil) - (setq phps-mode-lexer-re2c-matching-length nil) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "exit")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_EXIT (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "die")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_DIE (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "fn")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_FN (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "function")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_FUNCTION (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "const")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_CONST (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "return")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_RETURN (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING - (looking-at - (concat "yield" phps-mode-lexer-WHITESPACE "from" "[^a-zA-Z0-9_\x80-\xff]"))) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_YIELD_FROM (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "yield")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_YIELD (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "try")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_TRY (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "catch")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_CATCH (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "finally")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_FINALLY (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "throw")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_THROW (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "if")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_IF (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "elseif")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_ELSEIF (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "endif")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_ENDIF (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "else")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_ELSE (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "while")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_WHILE (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "endwhile")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_ENDWHILE (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "do")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_DO (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "for")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_FOR (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "endfor")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_ENDFOR (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "foreach")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_FOREACH (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "endforeach")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_ENDFOREACH (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "declare")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_DECLARE (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "enddeclare")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_ENDDECLARE (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "instanceof")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_INSTANCEOF (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "as")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_AS (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "switch")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_SWITCH (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "endswitch")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_ENDSWITCH (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "case")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_CASE (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "default")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_DEFAULT (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "break")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_BREAK (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "continue")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_CONTINUE (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "goto")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_GOTO (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "echo")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_ECHO (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "print")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_PRINT (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "class")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_CLASS (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "interface")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_INTERFACE (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "trait")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_TRAIT (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "extends")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_EXTENDS (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "implements")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_IMPLEMENTS (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "->")) - (lambda() - (phps-mode-lexer-yy_push_state 'ST_LOOKING_FOR_PROPERTY) - (phps-mode-lexer-RETURN_TOKEN 'T_OBJECT_OPERATOR (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and (or ST_IN_SCRIPTING ST_LOOKING_FOR_PROPERTY) - (looking-at phps-mode-lexer-WHITESPACE)) - (lambda() - (let* ((start (match-beginning 0)) - (end (match-end 0)) - (data (buffer-substring-no-properties start end))) - (if (phps-mode-wy-macros-CG 'PARSER_MODE) - (phps-mode-lexer-MOVE_FORWARD end) - (phps-mode-lexer-RETURN_TOKEN data start end))))) - - (phps-mode-lexer-re2c-rule - (and ST_LOOKING_FOR_PROPERTY (looking-at "->")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_OBJECT_OPERATOR (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_LOOKING_FOR_PROPERTY (looking-at phps-mode-lexer-LABEL)) - (lambda() - (let ((start (match-beginning 0)) - (end (match-end 0))) - (phps-mode-lexer-yy_pop_state) - (phps-mode-lexer-RETURN_TOKEN 'T_STRING start end)))) - - (phps-mode-lexer-re2c-rule - (and ST_LOOKING_FOR_PROPERTY (looking-at phps-mode-lexer-ANY_CHAR)) - (lambda() - (let ((end (match-end 0))) - (phps-mode-lexer-yy_pop_state) - ;; TODO goto restart here? - ;; (message "Restart here") - (phps-mode-lexer-MOVE_FORWARD end)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "::")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_PAAMAYIM_NEKUDOTAYIM (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "\\\\")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_NS_SEPARATOR (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "\\.\\.\\.")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_ELLIPSIS (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "\\?\\?")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_COALESCE (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "new")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_NEW (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "clone")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_CLONE (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "var")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_VAR (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING - (looking-at - (concat - "(" - phps-mode-lexer-TABS_AND_SPACES - "\\(int\\|integer\\)" - phps-mode-lexer-TABS_AND_SPACES - ")"))) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_INT_CAST (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING - (looking-at - (concat - "(" - phps-mode-lexer-TABS_AND_SPACES - "\\(double\\|float\\)" - phps-mode-lexer-TABS_AND_SPACES - ")"))) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_DOUBLE_CAST (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING - (looking-at - (concat - "(" - phps-mode-lexer-TABS_AND_SPACES - "\\(real\\)" - phps-mode-lexer-TABS_AND_SPACES - ")"))) - (lambda() - (when (phps-mode-wy-macros-CG 'PARSER_MODE) - (display-warning 'phps-mode "PHPs Lexer Error - The (real) cast is deprecated, use (float) instead")) - (phps-mode-lexer-RETURN_TOKEN 'T_DOUBLE_CAST (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING - (looking-at - (concat - "(" - phps-mode-lexer-TABS_AND_SPACES - "\\(string\\|binary\\)" - phps-mode-lexer-TABS_AND_SPACES - ")"))) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_STRING_CAST (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING - (looking-at - (concat - "(" - phps-mode-lexer-TABS_AND_SPACES - "array" - phps-mode-lexer-TABS_AND_SPACES - ")"))) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_ARRAY_CAST (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING - (looking-at - (concat - "(" - phps-mode-lexer-TABS_AND_SPACES - "object" - phps-mode-lexer-TABS_AND_SPACES - ")"))) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_OBJECT_CAST (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES "\\(bool\\|boolean\\)" phps-mode-lexer-TABS_AND_SPACES ")"))) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_BOOL_CAST (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING - (looking-at - (concat - "(" - phps-mode-lexer-TABS_AND_SPACES - "unset" - phps-mode-lexer-TABS_AND_SPACES ")"))) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_UNSET_CAST (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "eval")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_EVAL (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "include")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_INCLUDE (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "include_once")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_INCLUDE_ONCE (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "require")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_REQUIRE (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "require_once")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_REQUIRE_ONCE (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "namespace")) - (lambda() - (setq phps-mode-lexer-declaring_namespace t) - (phps-mode-lexer-RETURN_TOKEN 'T_NAMESPACE (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "use")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_USE (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "insteadof")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_INSTEADOF (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "global")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_GLOBAL (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "isset")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_ISSET (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "empty")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_EMPTY (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "__halt_compiler")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_HALT_COMPILER (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "static")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_STATIC (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "abstract")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_ABSTRACT (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "final")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_FINAL (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "private")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_PRIVATE (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "protected")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_PROTECTED (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "public")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_PUBLIC (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "unset")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_UNSET (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "=>")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_DOUBLE_ARROW (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "list")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_LIST (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "array")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_ARRAY (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "callable")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_CALLABLE (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "\\+\\+")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_INC (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "--")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_DEC (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "===")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_IS_IDENTICAL (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "!==")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_IS_NOT_IDENTICAL (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "==")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_IS_EQUAL (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "\\(!=\\|<>\\)")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_IS_NOT_EQUAL (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "<=>")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_SPACESHIP (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "<=")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_IS_SMALLER_OR_EQUAL (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at ">=")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_IS_GREATER_OR_EQUAL (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "\\+=")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_PLUS_EQUAL (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "-=")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_MINUS_EQUAL (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "\\*=")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_MUL_EQUAL (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "\\*\\\\\\*=")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_POW_EQUAL (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "\\*\\\\\\*")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_POW (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "/=")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_DIV_EQUAL (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "\\.=")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_CONCAT_EQUAL (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "%=")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_MOD_EQUAL (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "<<=")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_SL_EQUAL (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at ">>=")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_SR_EQUAL (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "&=")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_AND_EQUAL (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "|=")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_OR_EQUAL (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "\\^=")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_XOR_EQUAL (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "\\?\\?=")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_COALESCE_EQUAL (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "||")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_BOOLEAN_OR (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "&&")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_BOOLEAN_AND (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "OR")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_OR (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "AND")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_AND (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "XOR")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_XOR (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "<<")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_SL (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at ">>")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_SR (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at phps-mode-lexer-TOKENS)) - (lambda() - (let* ((start (match-beginning 0)) - (end (match-end 0)) - (data (buffer-substring-no-properties start end)) - (use-brace nil)) - ;; (message "Found token '%s'" data) - (when phps-mode-lexer-declaring_namespace - (when (string= data ";") - (setq phps-mode-lexer-prepend_trailing_brace t) - ;; (message "Set flag prepend trailing brace") - ;; (setq use-brace t) - ) - (setq phps-mode-lexer-declaring_namespace nil)) - (if use-brace - (phps-mode-lexer-RETURN_TOKEN "{" start end) - (phps-mode-lexer-RETURN_TOKEN data start end))))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "{")) - (lambda() - (phps-mode-lexer-yy_push_state 'ST_IN_SCRIPTING) + (phps-mode-lexer-set-region-syntax-color + (point-min) + (point-max) + (list 'font-lock-face 'font-lock-warning-face)) + + (semantic-lex-push-token + (semantic-lex-token 'T_ERROR (point-min) (point-max)))))) + +;; If multiple rules match, re2c prefers the longest match. If rules match the same string, the earlier rule has priority. +;; @see http://re2c.org/manual/syntax/syntax.html +(define-lex-analyzer phps-mode-analyzer-re2c-lexer + "Elisp port of original Zend re2c lexer." + t + + (let ((old-start (point))) + + (phps-mode-debug-message (message "Running lexer from %s" old-start)) + + (let ((heredoc_label (car phps-mode-lexer-heredoc_label_stack)) + (SHEBANG (equal phps-mode-lexer-STATE 'SHEBANG)) + (ST_IN_SCRIPTING (equal phps-mode-lexer-STATE 'ST_IN_SCRIPTING)) + (ST_INITIAL (equal phps-mode-lexer-STATE 'ST_INITIAL)) + (ST_LOOKING_FOR_PROPERTY (equal phps-mode-lexer-STATE 'ST_LOOKING_FOR_PROPERTY)) + (ST_DOUBLE_QUOTES (equal phps-mode-lexer-STATE 'ST_DOUBLE_QUOTES)) + (ST_BACKQUOTE (equal phps-mode-lexer-STATE 'ST_BACKQUOTE)) + (ST_HEREDOC (equal phps-mode-lexer-STATE 'ST_HEREDOC)) + (ST_NOWDOC (equal phps-mode-lexer-STATE 'ST_NOWDOC)) + (ST_LOOKING_FOR_VARNAME (equal phps-mode-lexer-STATE 'ST_LOOKING_FOR_VARNAME)) + (ST_END_HEREDOC (equal phps-mode-lexer-STATE 'ST_END_HEREDOC)) + (ST_VAR_OFFSET (equal phps-mode-lexer-STATE 'ST_VAR_OFFSET))) + + ;; Reset re2c flags + (setq phps-mode-lexer-re2c-matching-body nil) + (setq phps-mode-lexer-re2c-matching-length nil) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "exit")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_EXIT (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "die")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_DIE (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "fn")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_FN (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "function")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_FUNCTION (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "const")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_CONST (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "return")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_RETURN (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING + (looking-at + (concat "yield" phps-mode-lexer-WHITESPACE "from" "[^a-zA-Z0-9_\x80-\xff]"))) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_YIELD_FROM (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "yield")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_YIELD (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "try")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_TRY (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "catch")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_CATCH (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "finally")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_FINALLY (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "throw")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_THROW (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "if")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_IF (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "elseif")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_ELSEIF (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "endif")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_ENDIF (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "else")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_ELSE (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "while")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_WHILE (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "endwhile")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_ENDWHILE (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "do")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_DO (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "for")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_FOR (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "endfor")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_ENDFOR (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "foreach")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_FOREACH (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "endforeach")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_ENDFOREACH (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "declare")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_DECLARE (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "enddeclare")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_ENDDECLARE (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "instanceof")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_INSTANCEOF (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "as")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_AS (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "switch")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_SWITCH (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "endswitch")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_ENDSWITCH (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "case")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_CASE (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "default")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_DEFAULT (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "break")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_BREAK (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "continue")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_CONTINUE (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "goto")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_GOTO (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "echo")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_ECHO (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "print")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_PRINT (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "class")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_CLASS (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "interface")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_INTERFACE (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "trait")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_TRAIT (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "extends")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_EXTENDS (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "implements")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_IMPLEMENTS (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "->")) + (lambda() + (phps-mode-lexer-yy_push_state 'ST_LOOKING_FOR_PROPERTY) + (phps-mode-lexer-RETURN_TOKEN 'T_OBJECT_OPERATOR (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and (or ST_IN_SCRIPTING ST_LOOKING_FOR_PROPERTY) + (looking-at phps-mode-lexer-WHITESPACE)) + (lambda() + (let* ((start (match-beginning 0)) + (end (match-end 0)) + (data (buffer-substring-no-properties start end))) + (if (phps-mode-wy-macros-CG 'PARSER_MODE) + (phps-mode-lexer-MOVE_FORWARD end) + (phps-mode-lexer-RETURN_TOKEN data start end))))) + + (phps-mode-lexer-re2c-rule + (and ST_LOOKING_FOR_PROPERTY (looking-at "->")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_OBJECT_OPERATOR (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_LOOKING_FOR_PROPERTY (looking-at phps-mode-lexer-LABEL)) + (lambda() + (let ((start (match-beginning 0)) + (end (match-end 0))) + (phps-mode-lexer-yy_pop_state) + (phps-mode-lexer-RETURN_TOKEN 'T_STRING start end)))) + + (phps-mode-lexer-re2c-rule + (and ST_LOOKING_FOR_PROPERTY (looking-at phps-mode-lexer-ANY_CHAR)) + (lambda() + (let ((end (match-end 0))) + (phps-mode-lexer-yy_pop_state) + ;; TODO goto restart here? + ;; (message "Restart here") + (phps-mode-lexer-MOVE_FORWARD end)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "::")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_PAAMAYIM_NEKUDOTAYIM (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "\\\\")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_NS_SEPARATOR (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "\\.\\.\\.")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_ELLIPSIS (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "\\?\\?")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_COALESCE (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "new")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_NEW (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "clone")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_CLONE (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "var")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_VAR (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING + (looking-at + (concat + "(" + phps-mode-lexer-TABS_AND_SPACES + "\\(int\\|integer\\)" + phps-mode-lexer-TABS_AND_SPACES + ")"))) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_INT_CAST (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING + (looking-at + (concat + "(" + phps-mode-lexer-TABS_AND_SPACES + "\\(double\\|float\\)" + phps-mode-lexer-TABS_AND_SPACES + ")"))) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_DOUBLE_CAST (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING + (looking-at + (concat + "(" + phps-mode-lexer-TABS_AND_SPACES + "\\(real\\)" + phps-mode-lexer-TABS_AND_SPACES + ")"))) + (lambda() + (when (phps-mode-wy-macros-CG 'PARSER_MODE) + (signal 'phps-mode (list "PHPs Lexer Error - The (real) cast is deprecated, use (float) instead"))) + (phps-mode-lexer-RETURN_TOKEN 'T_DOUBLE_CAST (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING + (looking-at + (concat + "(" + phps-mode-lexer-TABS_AND_SPACES + "\\(string\\|binary\\)" + phps-mode-lexer-TABS_AND_SPACES + ")"))) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_STRING_CAST (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING + (looking-at + (concat + "(" + phps-mode-lexer-TABS_AND_SPACES + "array" + phps-mode-lexer-TABS_AND_SPACES + ")"))) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_ARRAY_CAST (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING + (looking-at + (concat + "(" + phps-mode-lexer-TABS_AND_SPACES + "object" + phps-mode-lexer-TABS_AND_SPACES + ")"))) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_OBJECT_CAST (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES "\\(bool\\|boolean\\)" phps-mode-lexer-TABS_AND_SPACES ")"))) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_BOOL_CAST (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING + (looking-at + (concat + "(" + phps-mode-lexer-TABS_AND_SPACES + "unset" + phps-mode-lexer-TABS_AND_SPACES ")"))) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_UNSET_CAST (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "eval")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_EVAL (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "include")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_INCLUDE (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "include_once")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_INCLUDE_ONCE (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "require")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_REQUIRE (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "require_once")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_REQUIRE_ONCE (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "namespace")) + (lambda() + (setq phps-mode-lexer-declaring_namespace t) + (phps-mode-lexer-RETURN_TOKEN 'T_NAMESPACE (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "use")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_USE (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "insteadof")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_INSTEADOF (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "global")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_GLOBAL (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "isset")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_ISSET (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "empty")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_EMPTY (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "__halt_compiler")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_HALT_COMPILER (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "static")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_STATIC (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "abstract")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_ABSTRACT (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "final")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_FINAL (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "private")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_PRIVATE (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "protected")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_PROTECTED (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "public")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_PUBLIC (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "unset")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_UNSET (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "=>")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_DOUBLE_ARROW (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "list")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_LIST (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "array")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_ARRAY (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "callable")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_CALLABLE (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "\\+\\+")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_INC (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "--")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_DEC (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "===")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_IS_IDENTICAL (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "!==")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_IS_NOT_IDENTICAL (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "==")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_IS_EQUAL (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "\\(!=\\|<>\\)")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_IS_NOT_EQUAL (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "<=>")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_SPACESHIP (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "<=")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_IS_SMALLER_OR_EQUAL (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at ">=")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_IS_GREATER_OR_EQUAL (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "\\+=")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_PLUS_EQUAL (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "-=")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_MINUS_EQUAL (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "\\*=")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_MUL_EQUAL (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "\\*\\\\\\*=")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_POW_EQUAL (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "\\*\\\\\\*")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_POW (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "/=")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_DIV_EQUAL (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "\\.=")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_CONCAT_EQUAL (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "%=")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_MOD_EQUAL (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "<<=")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_SL_EQUAL (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at ">>=")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_SR_EQUAL (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "&=")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_AND_EQUAL (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "|=")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_OR_EQUAL (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "\\^=")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_XOR_EQUAL (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "\\?\\?=")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_COALESCE_EQUAL (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "||")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_BOOLEAN_OR (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "&&")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_BOOLEAN_AND (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "OR")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_OR (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "AND")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_AND (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "XOR")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_XOR (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "<<")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_SL (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at ">>")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_SR (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at phps-mode-lexer-TOKENS)) + (lambda() + (let* ((start (match-beginning 0)) + (end (match-end 0)) + (data (buffer-substring-no-properties start end)) + (use-brace nil)) + ;; (message "Found token '%s'" data) (when phps-mode-lexer-declaring_namespace + (when (string= data ";") + (setq phps-mode-lexer-prepend_trailing_brace t) + ;; (message "Set flag prepend trailing brace") + ;; (setq use-brace t) + ) (setq phps-mode-lexer-declaring_namespace nil)) - (phps-mode-lexer-RETURN_TOKEN "{" (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and (or ST_DOUBLE_QUOTES ST_BACKQUOTE ST_HEREDOC) (looking-at "\\${")) - (lambda() - (phps-mode-lexer-yy_push_state 'ST_LOOKING_FOR_VARNAME) - (phps-mode-lexer-RETURN_TOKEN 'T_DOLLAR_OPEN_CURLY_BRACES (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "}")) - (lambda() - (when phps-mode-lexer-state_stack - (phps-mode-lexer-yy_pop_state)) - (phps-mode-lexer-RETURN_TOKEN "}" (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_LOOKING_FOR_VARNAME (looking-at (concat phps-mode-lexer-LABEL "[\\[}]"))) - (lambda() - (let ((start (match-beginning 0)) - (end (- (match-end 0) 1))) - ;; (message "Stopped here") - (phps-mode-lexer-yy_pop_state) - (phps-mode-lexer-yy_push_state 'ST_IN_SCRIPTING) - (phps-mode-lexer-RETURN_TOKEN 'T_STRING_VARNAME start end)))) - - (phps-mode-lexer-re2c-rule - (and ST_LOOKING_FOR_VARNAME (looking-at phps-mode-lexer-ANY_CHAR)) - (lambda() + (if use-brace + (phps-mode-lexer-RETURN_TOKEN "{" start end) + (phps-mode-lexer-RETURN_TOKEN data start end))))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "{")) + (lambda() + (phps-mode-lexer-yy_push_state 'ST_IN_SCRIPTING) + (when phps-mode-lexer-declaring_namespace + (setq phps-mode-lexer-declaring_namespace nil)) + (phps-mode-lexer-RETURN_TOKEN "{" (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and (or ST_DOUBLE_QUOTES ST_BACKQUOTE ST_HEREDOC) (looking-at "\\${")) + (lambda() + (phps-mode-lexer-yy_push_state 'ST_LOOKING_FOR_VARNAME) + (phps-mode-lexer-RETURN_TOKEN 'T_DOLLAR_OPEN_CURLY_BRACES (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "}")) + (lambda() + (when phps-mode-lexer-state_stack + (phps-mode-lexer-yy_pop_state)) + (phps-mode-lexer-RETURN_TOKEN "}" (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_LOOKING_FOR_VARNAME (looking-at (concat phps-mode-lexer-LABEL "[\\[}]"))) + (lambda() + (let ((start (match-beginning 0)) + (end (- (match-end 0) 1))) + ;; (message "Stopped here") (phps-mode-lexer-yy_pop_state) - (phps-mode-lexer-yy_push_state 'ST_IN_SCRIPTING))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at phps-mode-lexer-BNUM)) - (lambda() - (let* ((start (match-beginning 0)) - (end (match-end 0)) - (data (buffer-substring-no-properties (+ start 2) end)) - (long-number (string-to-number data 2))) - ;; (message "Binary number %s from %s" long-number data) - (if (> long-number phps-mode-lexer-long-limit) - (phps-mode-lexer-RETURN_TOKEN 'T_DNUMBER start end) - (phps-mode-lexer-RETURN_TOKEN 'T_LNUMBER start end))))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at phps-mode-lexer-LNUM)) - (lambda() - (let* ((start (match-beginning 0)) - (end (match-end 0)) - (data (string-to-number (buffer-substring-no-properties start end)))) - ;; (message "Long number: %d" data) - (if (> data phps-mode-lexer-long-limit) - (phps-mode-lexer-RETURN_TOKEN 'T_DNUMBER start end) - (phps-mode-lexer-RETURN_TOKEN 'T_LNUMBER start end))))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at phps-mode-lexer-HNUM)) - (lambda() - (let* ((start (match-beginning 0)) - (end (match-end 0)) - (data (buffer-substring-no-properties (+ start 2) end)) - (long-number (string-to-number data 16))) - ;; (message "Hexadecimal number %s from %s" long-number data) - (if (> long-number phps-mode-lexer-long-limit) - (phps-mode-lexer-RETURN_TOKEN 'T_DNUMBER start end) - (phps-mode-lexer-RETURN_TOKEN 'T_LNUMBER start end))))) - - (phps-mode-lexer-re2c-rule - (and ST_VAR_OFFSET (looking-at "\\([0]\\|[1-9][0-9]*\\)")) - (lambda() - (let ((start (match-beginning 0)) - (end (match-end 0))) - (phps-mode-lexer-RETURN_TOKEN 'T_NUM_STRING start end)))) - - (phps-mode-lexer-re2c-rule - (and ST_VAR_OFFSET (looking-at (concat "\\(" - phps-mode-lexer-LNUM "\\|" - phps-mode-lexer-HNUM "\\|" - phps-mode-lexer-BNUM "\\)"))) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_NUM_STRING (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (or (looking-at phps-mode-lexer-EXPONENT_DNUM) - (looking-at phps-mode-lexer-DNUM))) - (lambda() - (let* ((start (match-beginning 0)) - (end (match-end 0)) - (_data (buffer-substring-no-properties start end))) - ;; (message "Exponent/double at: %s" _data) - (phps-mode-lexer-RETURN_TOKEN 'T_DNUMBER start end)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "__CLASS__")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_CLASS_C (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "__TRAIT__")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_TRAIT_C (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "__FUNCTION__")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_FUNC_C (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "__METHOD__")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_METHOD_C (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "__LINE__")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_LINE (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "__FILE__")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_FILE (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "__DIR__")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_DIR (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "__NAMESPACE__")) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_NS_C (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and SHEBANG (looking-at (concat "#!.*" phps-mode-lexer-NEWLINE))) - (lambda() - (phps-mode-lexer-BEGIN 'ST_INITIAL))) - - (phps-mode-lexer-re2c-rule - (and SHEBANG (looking-at phps-mode-lexer-ANY_CHAR)) - (lambda() - (phps-mode-lexer-BEGIN 'ST_INITIAL))) - - (phps-mode-lexer-re2c-rule - (and ST_INITIAL (looking-at "<\\?=")) - (lambda() - (let ((start (match-beginning 0)) - (end (match-end 0))) - (phps-mode-lexer-BEGIN 'ST_IN_SCRIPTING) - (when (phps-mode-wy-macros-CG 'PARSER_MODE) - (phps-mode-lexer-RETURN_TOKEN 'T_ECHO start end)) - (phps-mode-lexer-RETURN_TOKEN 'T_OPEN_TAG_WITH_ECHO start end)))) + (phps-mode-lexer-yy_push_state 'ST_IN_SCRIPTING) + (phps-mode-lexer-RETURN_TOKEN 'T_STRING_VARNAME start end)))) + + (phps-mode-lexer-re2c-rule + (and ST_LOOKING_FOR_VARNAME (looking-at phps-mode-lexer-ANY_CHAR)) + (lambda() + (phps-mode-lexer-yy_pop_state) + (phps-mode-lexer-yy_push_state 'ST_IN_SCRIPTING))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at phps-mode-lexer-BNUM)) + (lambda() + (let* ((start (match-beginning 0)) + (end (match-end 0)) + (data (buffer-substring-no-properties (+ start 2) end)) + (long-number (string-to-number data 2))) + ;; (message "Binary number %s from %s" long-number data) + (if (> long-number phps-mode-lexer-long-limit) + (phps-mode-lexer-RETURN_TOKEN 'T_DNUMBER start end) + (phps-mode-lexer-RETURN_TOKEN 'T_LNUMBER start end))))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at phps-mode-lexer-LNUM)) + (lambda() + (let* ((start (match-beginning 0)) + (end (match-end 0)) + (data (string-to-number (buffer-substring-no-properties start end)))) + ;; (message "Long number: %d" data) + (if (> data phps-mode-lexer-long-limit) + (phps-mode-lexer-RETURN_TOKEN 'T_DNUMBER start end) + (phps-mode-lexer-RETURN_TOKEN 'T_LNUMBER start end))))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at phps-mode-lexer-HNUM)) + (lambda() + (let* ((start (match-beginning 0)) + (end (match-end 0)) + (data (buffer-substring-no-properties (+ start 2) end)) + (long-number (string-to-number data 16))) + ;; (message "Hexadecimal number %s from %s" long-number data) + (if (> long-number phps-mode-lexer-long-limit) + (phps-mode-lexer-RETURN_TOKEN 'T_DNUMBER start end) + (phps-mode-lexer-RETURN_TOKEN 'T_LNUMBER start end))))) + + (phps-mode-lexer-re2c-rule + (and ST_VAR_OFFSET (looking-at "\\([0]\\|[1-9][0-9]*\\)")) + (lambda() + (let ((start (match-beginning 0)) + (end (match-end 0))) + (phps-mode-lexer-RETURN_TOKEN 'T_NUM_STRING start end)))) + + (phps-mode-lexer-re2c-rule + (and ST_VAR_OFFSET (looking-at (concat "\\(" + phps-mode-lexer-LNUM "\\|" + phps-mode-lexer-HNUM "\\|" + phps-mode-lexer-BNUM "\\)"))) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_NUM_STRING (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (or (looking-at phps-mode-lexer-EXPONENT_DNUM) + (looking-at phps-mode-lexer-DNUM))) + (lambda() + (let* ((start (match-beginning 0)) + (end (match-end 0)) + (_data (buffer-substring-no-properties start end))) + ;; (message "Exponent/double at: %s" _data) + (phps-mode-lexer-RETURN_TOKEN 'T_DNUMBER start end)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "__CLASS__")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_CLASS_C (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "__TRAIT__")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_TRAIT_C (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "__FUNCTION__")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_FUNC_C (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "__METHOD__")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_METHOD_C (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "__LINE__")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_LINE (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "__FILE__")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_FILE (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "__DIR__")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_DIR (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "__NAMESPACE__")) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_NS_C (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and SHEBANG (looking-at (concat "#!.*" phps-mode-lexer-NEWLINE))) + (lambda() + (phps-mode-lexer-BEGIN 'ST_INITIAL))) + + (phps-mode-lexer-re2c-rule + (and SHEBANG (looking-at phps-mode-lexer-ANY_CHAR)) + (lambda() + (phps-mode-lexer-BEGIN 'ST_INITIAL))) + + (phps-mode-lexer-re2c-rule + (and ST_INITIAL (looking-at "<\\?=")) + (lambda() + (let ((start (match-beginning 0)) + (end (match-end 0))) + (phps-mode-lexer-BEGIN 'ST_IN_SCRIPTING) + (when (phps-mode-wy-macros-CG 'PARSER_MODE) + (phps-mode-lexer-RETURN_TOKEN 'T_ECHO start end)) + (phps-mode-lexer-RETURN_TOKEN 'T_OPEN_TAG_WITH_ECHO start end)))) + + (phps-mode-lexer-re2c-rule + (and ST_INITIAL (looking-at (concat "<\\?php\\([ \t]\\|" phps-mode-lexer-NEWLINE "\\)"))) + (lambda() + (let ((start (match-beginning 0)) + (end (match-end 0))) + (phps-mode-lexer-BEGIN 'ST_IN_SCRIPTING) + ;; (message "Starting scripting after <?php") + (when phps-mode-lexer-EXPECTED + (phps-mode-lexer-SKIP_TOKEN 'T_OPEN_TAG start end)) + (phps-mode-lexer-RETURN_TOKEN 'T_OPEN_TAG start end)))) + + (phps-mode-lexer-re2c-rule + (and ST_INITIAL (looking-at "<\\?php")) + (lambda() + (let ((start (match-beginning 0)) + (end (match-end 0))) - (phps-mode-lexer-re2c-rule - (and ST_INITIAL (looking-at (concat "<\\?php\\([ \t]\\|" phps-mode-lexer-NEWLINE "\\)"))) - (lambda() + ;; Allow <?php followed by end of file. + (cond + + ((equal end (point-max)) + (phps-mode-lexer-BEGIN 'ST_IN_SCRIPTING) + (phps-mode-lexer-RETURN_OR_SKIP_TOKEN + 'T_OPEN_TAG + start + end)) + + ((phps-mode-wy-macros-CG 'SHORT_TAGS) + (phps-mode-lexer-yyless 3) + (setq end (- end 3)) + (phps-mode-lexer-BEGIN 'ST_IN_SCRIPTING) + (phps-mode-lexer-RETURN_OR_SKIP_TOKEN + 'T_OPEN_TAG + start + end)) + + (t + (phps-mode-anaylzer-inline-char-handler)))))) + + (phps-mode-lexer-re2c-rule + (and ST_INITIAL (looking-at "<\\?")) + (lambda() + (when (phps-mode-wy-macros-CG 'SHORT_TAGS) (let ((start (match-beginning 0)) (end (match-end 0))) (phps-mode-lexer-BEGIN 'ST_IN_SCRIPTING) - ;; (message "Starting scripting after <?php") (when phps-mode-lexer-EXPECTED (phps-mode-lexer-SKIP_TOKEN 'T_OPEN_TAG start end)) - (phps-mode-lexer-RETURN_TOKEN 'T_OPEN_TAG start end)))) - - (phps-mode-lexer-re2c-rule - (and ST_INITIAL (looking-at "<\\?php")) - (lambda() - (let ((start (match-beginning 0)) - (end (match-end 0))) - - ;; Allow <?php followed by end of file. - (cond - - ((equal end (point-max)) - (phps-mode-lexer-BEGIN 'ST_IN_SCRIPTING) - (phps-mode-lexer-RETURN_OR_SKIP_TOKEN - 'T_OPEN_TAG - start - end)) - - ((phps-mode-wy-macros-CG 'SHORT_TAGS) - (phps-mode-lexer-yyless 3) - (setq end (- end 3)) - (phps-mode-lexer-BEGIN 'ST_IN_SCRIPTING) - (phps-mode-lexer-RETURN_OR_SKIP_TOKEN - 'T_OPEN_TAG - start - end)) - - (t - (phps-mode-anaylzer-inline-char-handler)))))) - - (phps-mode-lexer-re2c-rule - (and ST_INITIAL (looking-at "<\\?")) - (lambda() - (when (phps-mode-wy-macros-CG 'SHORT_TAGS) - (let ((start (match-beginning 0)) - (end (match-end 0))) - (phps-mode-lexer-BEGIN 'ST_IN_SCRIPTING) - (when phps-mode-lexer-EXPECTED - (phps-mode-lexer-SKIP_TOKEN 'T_OPEN_TAG start end)) - ;; (message "Starting scripting after <?") - (phps-mode-lexer-RETURN_TOKEN 'T_OPEN_TAG start end))))) - - (phps-mode-lexer-re2c-rule - (and ST_INITIAL (looking-at phps-mode-lexer-ANY_CHAR)) - (lambda() - (phps-mode-anaylzer-inline-char-handler))) - - (phps-mode-lexer-re2c-rule - (and (or ST_DOUBLE_QUOTES ST_HEREDOC ST_BACKQUOTE) - (looking-at - (concat - "\\$" - phps-mode-lexer-LABEL - "->" - "[a-zA-Z_\x80-\xff]"))) - (lambda() - (phps-mode-lexer-yy_push_state 'ST_LOOKING_FOR_PROPERTY) - (forward-char -3) - (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (- (match-end 0) 3)))) - - (phps-mode-lexer-re2c-rule - (and (or ST_DOUBLE_QUOTES ST_HEREDOC ST_BACKQUOTE) - (looking-at - (concat - "\\$" - phps-mode-lexer-LABEL - "\\["))) - (lambda() - (phps-mode-lexer-yy_push_state 'ST_VAR_OFFSET) - (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and (or ST_IN_SCRIPTING ST_DOUBLE_QUOTES ST_HEREDOC ST_BACKQUOTE ST_VAR_OFFSET) - (looking-at - (concat - "\\$" - phps-mode-lexer-LABEL))) - (lambda() - (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_VAR_OFFSET (looking-at "\\]")) - (lambda() + ;; (message "Starting scripting after <?") + (phps-mode-lexer-RETURN_TOKEN 'T_OPEN_TAG start end))))) + + (phps-mode-lexer-re2c-rule + (and ST_INITIAL (looking-at phps-mode-lexer-ANY_CHAR)) + (lambda() + (phps-mode-anaylzer-inline-char-handler))) + + (phps-mode-lexer-re2c-rule + (and (or ST_DOUBLE_QUOTES ST_HEREDOC ST_BACKQUOTE) + (looking-at + (concat + "\\$" + phps-mode-lexer-LABEL + "->" + "[a-zA-Z_\x80-\xff]"))) + (lambda() + (phps-mode-lexer-yy_push_state 'ST_LOOKING_FOR_PROPERTY) + (forward-char -3) + (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (- (match-end 0) 3)))) + + (phps-mode-lexer-re2c-rule + (and (or ST_DOUBLE_QUOTES ST_HEREDOC ST_BACKQUOTE) + (looking-at + (concat + "\\$" + phps-mode-lexer-LABEL + "\\["))) + (lambda() + (phps-mode-lexer-yy_push_state 'ST_VAR_OFFSET) + (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and (or ST_IN_SCRIPTING ST_DOUBLE_QUOTES ST_HEREDOC ST_BACKQUOTE ST_VAR_OFFSET) + (looking-at + (concat + "\\$" + phps-mode-lexer-LABEL))) + (lambda() + (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_VAR_OFFSET (looking-at "\\]")) + (lambda() + (phps-mode-lexer-yy_pop_state) + (phps-mode-lexer-RETURN_TOKEN "]" (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_VAR_OFFSET (looking-at (concat "\\(" phps-mode-lexer-TOKENS + "\\|[{}\"`]\\)"))) + (lambda() + (let* ((start (match-beginning 0)) + (end (match-end 0)) + (data (buffer-substring-no-properties start end))) + (phps-mode-lexer-RETURN_TOKEN data start end)))) + + (phps-mode-lexer-re2c-rule + (and ST_VAR_OFFSET (looking-at (concat "[ \n\r\t'#]"))) + (lambda() + (let* ((start (match-beginning 0)) + (end (- (match-end 0) 1))) (phps-mode-lexer-yy_pop_state) - (phps-mode-lexer-RETURN_TOKEN "]" (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_VAR_OFFSET (looking-at (concat "\\(" phps-mode-lexer-TOKENS - "\\|[{}\"`]\\)"))) - (lambda() - (let* ((start (match-beginning 0)) - (end (match-end 0)) - (data (buffer-substring-no-properties start end))) - (phps-mode-lexer-RETURN_TOKEN data start end)))) - - (phps-mode-lexer-re2c-rule - (and ST_VAR_OFFSET (looking-at (concat "[ \n\r\t'#]"))) - (lambda() - (let* ((start (match-beginning 0)) - (end (- (match-end 0) 1))) - (phps-mode-lexer-yy_pop_state) - (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE start end)))) - - (phps-mode-lexer-re2c-rule - (and (or ST_IN_SCRIPTING ST_VAR_OFFSET) (looking-at phps-mode-lexer-LABEL)) - (lambda() - ;; (message "Adding T_STRING from %s to %s" (match-beginning 0) (match-end 0)) - (phps-mode-lexer-RETURN_TOKEN 'T_STRING (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "\\(#\\|//\\)")) - (lambda() - (let* ((start (match-beginning 0)) - (end (match-end 0)) - (_data (buffer-substring-no-properties start end)) - (line (buffer-substring-no-properties end (line-end-position)))) - (if (string-match "\\?>" line) - (progn - (phps-mode-lexer-RETURN_TOKEN 'T_COMMENT start (+ end (match-beginning 0)))) + (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE start end)))) + + (phps-mode-lexer-re2c-rule + (and (or ST_IN_SCRIPTING ST_VAR_OFFSET) (looking-at phps-mode-lexer-LABEL)) + (lambda() + ;; (message "Adding T_STRING from %s to %s" (match-beginning 0) (match-end 0)) + (phps-mode-lexer-RETURN_TOKEN 'T_STRING (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "\\(#\\|//\\)")) + (lambda() + (let* ((start (match-beginning 0)) + (end (match-end 0)) + (_data (buffer-substring-no-properties start end)) + (line (buffer-substring-no-properties end (line-end-position)))) + (if (string-match "\\?>" line) (progn - ;; TODO Handle expecting values here - ;; (message "Found comment 2 from %s to %s" start (line-end-position)) - (phps-mode-lexer-RETURN_TOKEN 'T_COMMENT start (line-end-position))))))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING - (looking-at - (concat - "\\(/\\*\\|/\\*\\*" - phps-mode-lexer-WHITESPACE - "\\)"))) - (lambda() - (let* ((start (match-beginning 0)) - (end (match-end 0)) - (_data (buffer-substring-no-properties start end)) - (doc-com (looking-at-p (concat "/\\*\\*" phps-mode-lexer-WHITESPACE)))) - (let ((string-start (search-forward "*/" nil t))) - (if string-start - (if doc-com - (phps-mode-lexer-RETURN_TOKEN 'T_DOC_COMMENT start (match-end 0)) - (phps-mode-lexer-RETURN_TOKEN 'T_COMMENT start (match-end 0))) - (progn - (display-warning 'phps-mode - (format - "PHPs Lexer Error - Unterminated comment starting at %s" - (point))) - (phps-mode-lexer-MOVE_FORWARD (point-max)))))))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at (concat "\\?>" phps-mode-lexer-NEWLINE "?"))) - (lambda() - (let ((start (match-beginning 0)) - (end (match-end 0))) - (when (= (- end start) 3) - (setq end (1- end))) - (phps-mode-lexer-BEGIN 'ST_INITIAL) - (when (phps-mode-wy-macros-CG 'PARSER_MODE) - (phps-mode-lexer-RETURN_TOKEN ";" start end)) - (phps-mode-lexer-RETURN_TOKEN 'T_CLOSE_TAG start end)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "'")) - (lambda() - (let* ((start (match-beginning 0)) - (end (match-end 0)) - (_data (buffer-substring-no-properties start end)) - (un-escaped-end (phps-mode-lexer--get-next-unescaped "'"))) - (if un-escaped-end - (progn - (phps-mode-lexer-RETURN_TOKEN 'T_CONSTANT_ENCAPSED_STRING start un-escaped-end)) + (phps-mode-lexer-RETURN_TOKEN 'T_COMMENT start (+ end (match-beginning 0)))) + (progn + ;; TODO Handle expecting values here + ;; (message "Found comment 2 from %s to %s" start (line-end-position)) + (phps-mode-lexer-RETURN_TOKEN 'T_COMMENT start (line-end-position))))))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING + (looking-at + (concat + "\\(/\\*\\|/\\*\\*" + phps-mode-lexer-WHITESPACE + "\\)"))) + (lambda() + (let* ((start (match-beginning 0)) + (end (match-end 0)) + (_data (buffer-substring-no-properties start end)) + (doc-com (looking-at-p (concat "/\\*\\*" phps-mode-lexer-WHITESPACE)))) + (let ((string-start (search-forward "*/" nil t))) + (if string-start + (if doc-com + (phps-mode-lexer-RETURN_TOKEN 'T_DOC_COMMENT start (match-end 0)) + (phps-mode-lexer-RETURN_TOKEN 'T_COMMENT start (match-end 0))) (progn - ;; Unclosed single quotes - (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE start (point-max)) - (phps-mode-lexer-MOVE_FORWARD (point-max))))))) - - ;; Double quoted string - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "\"")) - (lambda() - (let* ((start (match-beginning 0)) - (end (match-end 0)) - (_data (buffer-substring-no-properties start end)) - (open-quote t)) - - ;; Move forward from the double-quote - (forward-char) - - (while open-quote - (let ((string-start - (search-forward-regexp - (concat - "\\(\"" - "\\|\\$" phps-mode-lexer-LABEL - "\\|\\${" phps-mode-lexer-LABEL - "\\|{\\$" phps-mode-lexer-LABEL "\\)") - nil t))) - - ;; Do we find a ending double quote or starting variable? - (if string-start - (let ((string-start (match-beginning 0)) - (is-escaped nil)) - - ;; Go to character before match start - (goto-char (1- string-start)) - - ;; Store whether character is escaped or not - (setq is-escaped (looking-at-p "\\\\")) - - ;; Do we find variable inside quote? - (goto-char string-start) - - ;; Process character if it's not escaped - (if is-escaped - (forward-char 1) - (setq open-quote nil) - (if (looking-at "\"") - (let ((_double-quoted-string (buffer-substring-no-properties start (+ string-start 1)))) - ;; (message "Double quoted string: %s" _double-quoted-string) - (phps-mode-lexer-RETURN_TOKEN 'T_CONSTANT_ENCAPSED_STRING start (+ string-start 1))) - ;; (message "Found variable after '%s'" (buffer-substring-no-properties start string-start)) - (phps-mode-lexer-BEGIN 'ST_DOUBLE_QUOTES) - (phps-mode-lexer-RETURN_TOKEN "\"" start (1+ start)) - (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE (1+ start) string-start)))) - (progn - (display-warning 'phps-mode (format "Found no ending of quote at %s-%s" start (point))) - (phps-mode-lexer-MOVE_FORWARD (point-max)) - (setq open-quote nil)))))))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING - (looking-at - (concat - "<<<" - phps-mode-lexer-TABS_AND_SPACES - "\\(" - phps-mode-lexer-LABEL - "\\|'" - phps-mode-lexer-LABEL - "'\\|\"" - phps-mode-lexer-LABEL - "\"\\)" - phps-mode-lexer-NEWLINE))) - (lambda() - (let* ((start (match-beginning 0)) - (end (match-end 0)) - (data (buffer-substring-no-properties (match-beginning 1) (match-end 1))) - (heredoc_label)) - - ;; Determine if it's HEREDOC or NOWDOC and extract label here - (if (string= (substring data 0 1) "'") - (progn - (setq heredoc_label (substring data 1 (- (length data) 1))) - (phps-mode-lexer-BEGIN 'ST_NOWDOC)) + (signal 'phps-mode (list (format + "PHPs Lexer Error - Unterminated comment starting at %s" + (point)))))))))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at (concat "\\?>" phps-mode-lexer-NEWLINE "?"))) + (lambda() + (let ((start (match-beginning 0)) + (end (match-end 0))) + (when (= (- end start) 3) + (setq end (1- end))) + (phps-mode-lexer-BEGIN 'ST_INITIAL) + (when (phps-mode-wy-macros-CG 'PARSER_MODE) + (phps-mode-lexer-RETURN_TOKEN ";" start end)) + (phps-mode-lexer-RETURN_TOKEN 'T_CLOSE_TAG start end)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "'")) + (lambda() + (let* ((start (match-beginning 0)) + (end (match-end 0)) + (_data (buffer-substring-no-properties start end)) + (un-escaped-end (phps-mode-lexer--get-next-unescaped "'"))) + (if un-escaped-end (progn - (if (string= (substring data 0 1) "\"") - (setq heredoc_label (substring data 1 (- (length data) 1))) - (setq heredoc_label data)) - (phps-mode-lexer-BEGIN 'ST_HEREDOC))) - - ;; Check for ending label on the next line - (when (string= (buffer-substring-no-properties end (+ end (length heredoc_label))) heredoc_label) - (phps-mode-lexer-BEGIN 'ST_END_HEREDOC)) - - (push heredoc_label phps-mode-lexer-heredoc_label_stack) - ;; (message "Found heredoc or nowdoc at %s with label %s" data heredoc_label) - - (phps-mode-lexer-RETURN_TOKEN 'T_START_HEREDOC start end)))) - - (phps-mode-lexer-re2c-rule - (and ST_IN_SCRIPTING (looking-at "[`]")) - (lambda() - ;; (message "Begun backquote at %s-%s" (match-beginning 0) (match-end 0)) - (phps-mode-lexer-BEGIN 'ST_BACKQUOTE) - (phps-mode-lexer-RETURN_TOKEN "`" (match-beginning 0) (match-end 0)))) - - (phps-mode-lexer-re2c-rule - (and ST_END_HEREDOC (looking-at (concat phps-mode-lexer-ANY_CHAR))) - (lambda() - (let* ((start (match-beginning 0)) - (end (+ start (length heredoc_label) 1)) - (_data (buffer-substring-no-properties start end))) - ;; (message "Found ending heredoc at %s, %s of %s" _data (thing-at-point 'line) heredoc_label) - (pop phps-mode-lexer-heredoc_label_stack) - (phps-mode-lexer-BEGIN 'ST_IN_SCRIPTING) - (phps-mode-lexer-RETURN_TOKEN 'T_END_HEREDOC start end)))) - - (phps-mode-lexer-re2c-rule - (and (or ST_DOUBLE_QUOTES ST_BACKQUOTE ST_HEREDOC) (looking-at (concat "{\\$"))) - (lambda() - (phps-mode-lexer-yy_push_state 'ST_IN_SCRIPTING) - (phps-mode-lexer-RETURN_TOKEN 'T_CURLY_OPEN (match-beginning 0) (- (match-end 0) 1)))) + (phps-mode-lexer-RETURN_TOKEN 'T_CONSTANT_ENCAPSED_STRING start un-escaped-end)) + (progn + ;; Unclosed single quotes + (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE start (point-max)) + (phps-mode-lexer-MOVE_FORWARD (point-max))))))) + + ;; Double quoted string + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "\"")) + (lambda() + (let* ((start (match-beginning 0)) + (end (match-end 0)) + (_data (buffer-substring-no-properties start end)) + (open-quote t)) + + ;; Move forward from the double-quote + (forward-char) + + (while open-quote + (let ((string-start + (search-forward-regexp + (concat + "\\(\"" + "\\|\\$" phps-mode-lexer-LABEL + "\\|\\${" phps-mode-lexer-LABEL + "\\|{\\$" phps-mode-lexer-LABEL "\\)") + nil t))) + + ;; Do we find a ending double quote or starting variable? + (if string-start + (let ((string-start (match-beginning 0)) + (is-escaped nil)) - (phps-mode-lexer-re2c-rule - (and ST_DOUBLE_QUOTES (looking-at "[\"]")) - (lambda() - (phps-mode-lexer-BEGIN 'ST_IN_SCRIPTING) - ;; (message "Ended double-quote at %s" (match-beginning 0)) - (phps-mode-lexer-RETURN_TOKEN "\"" (match-beginning 0) (match-end 0)))) + ;; Go to character before match start + (goto-char (1- string-start)) - (phps-mode-lexer-re2c-rule - (and ST_BACKQUOTE (looking-at "[`]")) - (lambda() - (phps-mode-lexer-BEGIN 'ST_IN_SCRIPTING) - (phps-mode-lexer-RETURN_TOKEN "`" (match-beginning 0) (match-end 0)))) + ;; Store whether character is escaped or not + (setq is-escaped (looking-at-p "\\\\")) - (phps-mode-lexer-re2c-rule - (and ST_DOUBLE_QUOTES (looking-at phps-mode-lexer-ANY_CHAR)) - (lambda() - (let ((start (point))) - (let ((string-start (search-forward-regexp "[^\\\\]\"" nil t))) - (if string-start - (let* ((end (- (match-end 0) 1)) - (double-quoted-string (buffer-substring-no-properties start end))) ;; Do we find variable inside quote? - (if (or (string-match (concat "\\${" phps-mode-lexer-LABEL) double-quoted-string) - (string-match (concat "{\\$" phps-mode-lexer-LABEL) double-quoted-string) - (string-match (concat "\\$" phps-mode-lexer-LABEL) double-quoted-string)) - (progn - (let ((variable-start (+ start (match-beginning 0)))) - - ;; (message "Found starting expression inside double-quoted string at: %s %s" start variable-start) - (phps-mode-lexer-RETURN_TOKEN 'T_CONSTANT_ENCAPSED_STRING start variable-start) - )) - (progn - (phps-mode-lexer-RETURN_TOKEN 'T_CONSTANT_ENCAPSED_STRING start end) - ;; (message "Found end of quote at %s-%s, moving ahead after '%s'" start end (buffer-substring-no-properties start end)) - ))) + (goto-char string-start) + + ;; Process character if it's not escaped + (if is-escaped + (forward-char 1) + (setq open-quote nil) + (if (looking-at "\"") + (let ((_double-quoted-string (buffer-substring-no-properties start (+ string-start 1)))) + ;; (message "Double quoted string: %s" _double-quoted-string) + (phps-mode-lexer-RETURN_TOKEN 'T_CONSTANT_ENCAPSED_STRING start (+ string-start 1))) + ;; (message "Found variable after '%s'" (buffer-substring-no-properties start string-start)) + (phps-mode-lexer-BEGIN 'ST_DOUBLE_QUOTES) + (phps-mode-lexer-RETURN_TOKEN "\"" start (1+ start)) + (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE (1+ start) string-start)))) (progn - (display-warning 'phps-mode (format "Found no ending of double quoted region starting at %s" start)) - (phps-mode-lexer-MOVE_FORWARD (point-max)))))))) - - (phps-mode-lexer-re2c-rule - (and ST_BACKQUOTE (looking-at phps-mode-lexer-ANY_CHAR)) - (lambda() - (let ((string-start (search-forward-regexp "\\([^\\\\]`\\|\\$\\|{\\)" nil t))) - (if string-start - (let ((start (- (match-end 0) 1))) - ;; (message "Skipping backquote forward over %s" (buffer-substring-no-properties old-start start)) - (phps-mode-lexer-RETURN_TOKEN 'T_CONSTANT_ENCAPSED_STRING old-start start) - ) + (signal 'error (list (format "Found no ending of quote at %s-%s" start (point)))) + (setq open-quote nil)))))))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING + (looking-at + (concat + "<<<" + phps-mode-lexer-TABS_AND_SPACES + "\\(" + phps-mode-lexer-LABEL + "\\|'" + phps-mode-lexer-LABEL + "'\\|\"" + phps-mode-lexer-LABEL + "\"\\)" + phps-mode-lexer-NEWLINE))) + (lambda() + (let* ((start (match-beginning 0)) + (end (match-end 0)) + (data (buffer-substring-no-properties (match-beginning 1) (match-end 1))) + (heredoc_label)) + + ;; Determine if it's HEREDOC or NOWDOC and extract label here + (if (string= (substring data 0 1) "'") (progn - (display-warning 'phps-mode (format "Found no ending of backquoted string starting at %s" (point))) - (phps-mode-lexer-MOVE_FORWARD (point-max))))))) - - (phps-mode-lexer-re2c-rule - (and ST_HEREDOC (looking-at phps-mode-lexer-ANY_CHAR)) - (lambda() - ;; Check for $, ${ and {$ forward - (let ((string-start - (search-forward-regexp - (concat - "\\(\n" - heredoc_label - ";?\n\\|\\$" - phps-mode-lexer-LABEL - "\\|{\\$" - phps-mode-lexer-LABEL - "\\|\\${" - phps-mode-lexer-LABEL - "\\)" - ) nil t))) + (setq heredoc_label (substring data 1 (- (length data) 1))) + (phps-mode-lexer-BEGIN 'ST_NOWDOC)) + (progn + (if (string= (substring data 0 1) "\"") + (setq heredoc_label (substring data 1 (- (length data) 1))) + (setq heredoc_label data)) + (phps-mode-lexer-BEGIN 'ST_HEREDOC))) + + ;; Check for ending label on the next line + (when (string= (buffer-substring-no-properties end (+ end (length heredoc_label))) heredoc_label) + (phps-mode-lexer-BEGIN 'ST_END_HEREDOC)) + + (push heredoc_label phps-mode-lexer-heredoc_label_stack) + ;; (message "Found heredoc or nowdoc at %s with label %s" data heredoc_label) + + (phps-mode-lexer-RETURN_TOKEN 'T_START_HEREDOC start end)))) + + (phps-mode-lexer-re2c-rule + (and ST_IN_SCRIPTING (looking-at "[`]")) + (lambda() + ;; (message "Begun backquote at %s-%s" (match-beginning 0) (match-end 0)) + (phps-mode-lexer-BEGIN 'ST_BACKQUOTE) + (phps-mode-lexer-RETURN_TOKEN "`" (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_END_HEREDOC (looking-at (concat phps-mode-lexer-ANY_CHAR))) + (lambda() + (let* ((start (match-beginning 0)) + (end (+ start (length heredoc_label) 1)) + (_data (buffer-substring-no-properties start end))) + ;; (message "Found ending heredoc at %s, %s of %s" _data (thing-at-point 'line) heredoc_label) + (pop phps-mode-lexer-heredoc_label_stack) + (phps-mode-lexer-BEGIN 'ST_IN_SCRIPTING) + (phps-mode-lexer-RETURN_TOKEN 'T_END_HEREDOC start end)))) + + (phps-mode-lexer-re2c-rule + (and (or ST_DOUBLE_QUOTES ST_BACKQUOTE ST_HEREDOC) (looking-at (concat "{\\$"))) + (lambda() + (phps-mode-lexer-yy_push_state 'ST_IN_SCRIPTING) + (phps-mode-lexer-RETURN_TOKEN 'T_CURLY_OPEN (match-beginning 0) (- (match-end 0) 1)))) + + (phps-mode-lexer-re2c-rule + (and ST_DOUBLE_QUOTES (looking-at "[\"]")) + (lambda() + (phps-mode-lexer-BEGIN 'ST_IN_SCRIPTING) + ;; (message "Ended double-quote at %s" (match-beginning 0)) + (phps-mode-lexer-RETURN_TOKEN "\"" (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_BACKQUOTE (looking-at "[`]")) + (lambda() + (phps-mode-lexer-BEGIN 'ST_IN_SCRIPTING) + (phps-mode-lexer-RETURN_TOKEN "`" (match-beginning 0) (match-end 0)))) + + (phps-mode-lexer-re2c-rule + (and ST_DOUBLE_QUOTES (looking-at phps-mode-lexer-ANY_CHAR)) + (lambda() + (let ((start (point))) + (let ((string-start (search-forward-regexp "[^\\\\]\"" nil t))) (if string-start - (let* ((start (match-beginning 0)) - (end (match-end 0)) - (data (buffer-substring-no-properties start end))) - ;; (message "Found something ending at %s" data) - - (cond - - ((string-match (concat "\n" heredoc_label ";?\n") data) - ;, (message "Found heredoc end at %s-%s" start end) - (phps-mode-lexer-BEGIN 'ST_END_HEREDOC) - (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE old-start start)) - - (t - ;; (message "Found variable at '%s'.. Skipping forward to %s" data start) - (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE old-start start) - ) - - )) + (let* ((end (- (match-end 0) 1)) + (double-quoted-string (buffer-substring-no-properties start end))) + ;; Do we find variable inside quote? + (if (or (string-match (concat "\\${" phps-mode-lexer-LABEL) double-quoted-string) + (string-match (concat "{\\$" phps-mode-lexer-LABEL) double-quoted-string) + (string-match (concat "\\$" phps-mode-lexer-LABEL) double-quoted-string)) + (progn + (let ((variable-start (+ start (match-beginning 0)))) + + ;; (message "Found starting expression inside double-quoted string at: %s %s" start variable-start) + (phps-mode-lexer-RETURN_TOKEN 'T_CONSTANT_ENCAPSED_STRING start variable-start) + )) + (progn + (phps-mode-lexer-RETURN_TOKEN 'T_CONSTANT_ENCAPSED_STRING start end) + ;; (message "Found end of quote at %s-%s, moving ahead after '%s'" start end (buffer-substring-no-properties start end)) + ))) (progn - (display-warning 'phps-mode (format "Found no ending of heredoc at %s" (point))) - (phps-mode-lexer-MOVE_FORWARD (point-max))))))) - - (phps-mode-lexer-re2c-rule - (and ST_NOWDOC (looking-at phps-mode-lexer-ANY_CHAR)) - (lambda() - (let ((string-start (search-forward-regexp (concat "\n" heredoc_label ";?\\\n") nil t))) - (if string-start - (let* ((start (match-beginning 0)) - (end (match-end 0)) - (_data (buffer-substring-no-properties start end))) - ;; (message "Found something ending at %s" _data) - ;; (message "Found nowdoc end at %s-%s" start end) + (signal 'error (list (format "Found no ending of double quoted region starting at %s" start))))))))) + + (phps-mode-lexer-re2c-rule + (and ST_BACKQUOTE (looking-at phps-mode-lexer-ANY_CHAR)) + (lambda() + (let ((string-start (search-forward-regexp "\\([^\\\\]`\\|\\$\\|{\\)" nil t))) + (if string-start + (let ((start (- (match-end 0) 1))) + ;; (message "Skipping backquote forward over %s" (buffer-substring-no-properties old-start start)) + (phps-mode-lexer-RETURN_TOKEN 'T_CONSTANT_ENCAPSED_STRING old-start start) + ) + (progn + (signal 'error (list (format "Found no ending of backquoted string starting at %s" (point))))))))) + + (phps-mode-lexer-re2c-rule + (and ST_HEREDOC (looking-at phps-mode-lexer-ANY_CHAR)) + (lambda() + ;; Check for $, ${ and {$ forward + (let ((string-start + (search-forward-regexp + (concat + "\\(\n" + heredoc_label + ";?\n\\|\\$" + phps-mode-lexer-LABEL + "\\|{\\$" + phps-mode-lexer-LABEL + "\\|\\${" + phps-mode-lexer-LABEL + "\\)" + ) nil t))) + (if string-start + (let* ((start (match-beginning 0)) + (end (match-end 0)) + (data (buffer-substring-no-properties start end))) + ;; (message "Found something ending at %s" data) + + (cond + + ((string-match (concat "\n" heredoc_label ";?\n") data) + ;, (message "Found heredoc end at %s-%s" start end) (phps-mode-lexer-BEGIN 'ST_END_HEREDOC) + (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE old-start start)) + + (t + ;; (message "Found variable at '%s'.. Skipping forward to %s" data start) (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE old-start start) ) - (progn - (display-warning 'phps-mode (format "Found no ending of newdoc starting at %s" (point))) - (phps-mode-lexer-MOVE_FORWARD (point-max))))))) - (phps-mode-lexer-re2c-rule - (and (or ST_IN_SCRIPTING ST_VAR_OFFSET) (looking-at phps-mode-lexer-ANY_CHAR)) - (lambda() - (display-warning 'phps-mode (format "Unexpected character at %s" (point))) - (phps-mode-lexer-MOVE_FORWARD (point-max)))) + )) + (progn + (signal 'error (list (format "Found no ending of heredoc at %s" (point))))))))) + + (phps-mode-lexer-re2c-rule + (and ST_NOWDOC (looking-at phps-mode-lexer-ANY_CHAR)) + (lambda() + (let ((string-start (search-forward-regexp (concat "\n" heredoc_label ";?\\\n") nil t))) + (if string-start + (let* ((start (match-beginning 0)) + (end (match-end 0)) + (_data (buffer-substring-no-properties start end))) + ;; (message "Found something ending at %s" _data) + ;; (message "Found nowdoc end at %s-%s" start end) + (phps-mode-lexer-BEGIN 'ST_END_HEREDOC) + (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE old-start start) + ) + (progn + (signal 'error (list (format "Found no ending of newdoc starting at %s" (point))))))))) + + (phps-mode-lexer-re2c-rule + (and (or ST_IN_SCRIPTING ST_VAR_OFFSET) (looking-at phps-mode-lexer-ANY_CHAR)) + (lambda() + (signal 'error (list (format "Unexpected character at %s" (point)))))) + + (phps-mode-lexer-re2c-execute)))) - (phps-mode-lexer-re2c-execute))))) +(define-lex phps-mode-analyzer-lex + "Call lexer analyzer action." + phps-mode-analyzer-lexer + semantic-lex-default-action) -(define-lex phps-mode-lexer-lex +(define-lex phps-mode-analyzer-re2c-lex "Call lexer analyzer action." - phps-mode-lexer-lex-analyzer + phps-mode-analyzer-re2c-lexer semantic-lex-default-action) (defun phps-mode-lexer--get-next-unescaped (character) @@ -1757,10 +1769,79 @@ (phps-mode-debug-message (message "Lexer run")) (setq-local phps-mode-lexer-buffer-length (1- (point-max))) (setq-local phps-mode-lexer-buffer-contents (buffer-substring-no-properties (point-min) (point-max))) - (setq-local phps-mode-lexer-STATE nil) - (setq-local phps-mode-lexer-state_stack nil) - (setq-local phps-mode-lexer-states nil) - (setq-local phps-mode-lexer-tokens (semantic-lex-buffer))) + + (let ((result (phps-mode-analyzer-lex-string phps-mode-lexer-buffer-contents))) + + ;; Move variables into this buffers variables + (setq phps-mode-lexer-tokens (nth 0 result)) + (setq phps-mode-lexer-states (nth 1 result)) + (setq phps-mode-lexer-STATE (nth 2 result)) + (setq phps-mode-lexer-state_stack (nth 3 result)) + + ;; Apply syntax color on tokens + (dolist (token phps-mode-lexer-tokens) + (let ((start (car (cdr token))) + (end (cdr (cdr token))) + (token-name (car token))) + (let ((token-syntax-color (phps-mode-lexer-get-token-syntax-color token-name))) + (if token-syntax-color + (phps-mode-lexer-set-region-syntax-color start end token-syntax-color) + (phps-mode-lexer-clear-region-syntax-color start end))))) + + + (let ((errors (nth 4 result))) + (when errors + (display-warning 'phps-mode (format "Lex Errors: %s" errors)))))) + +(defun phps-mode-analyzer-lex-string (contents &optional start end states state state-stack tokens) + "Run lexer on CONTENTS." + ;; Create a separate buffer, run lexer inside of it, catch errors and return them + ;; to enable nice presentation + (let ((errors)) + (let ((buffer (generate-new-buffer "*PHPs Lexer*"))) + + ;; Create temporary buffer and run lexer in it + (save-excursion + (switch-to-buffer buffer) + (insert contents) + + (if states + (setq-local phps-mode-lexer-states states) + (setq-local phps-mode-lexer-states nil)) + (if state-stack + (setq-local phps-mode-lexer-state_stack state-stack) + (setq-local phps-mode-lexer-state_stack nil)) + (if state + (setq-local phps-mode-lexer-STATE state) + (phps-mode-lexer-BEGIN 'ST_INITIAL)) + + (when (boundp 'phps-mode-syntax-table) + (setq-local semantic-lex-syntax-table phps-mode-syntax-table)) + (when (fboundp 'phps-mode-analyzer-re2c-lex) + (setq-local semantic-lex-analyzer #'phps-mode-analyzer-re2c-lex)) + + ;; Catch any potential errors + (condition-case conditions + (progn + (if (and start end) + (progn + (phps-mode-debug-message + (message "Running (semantic-lex %s %s)" start end)) + (let ((incremental-tokens (semantic-lex start end))) + (setq-local phps-mode-lexer-tokens (append tokens incremental-tokens)))) + (phps-mode-debug-message + (message "Running (semantic-lex-buffer)")) + (setq-local phps-mode-lexer-tokens (semantic-lex-buffer)))) + (error + (setq errors (car (cdr conditions))))) + + ;; Move variables outside of buffer + (setq state phps-mode-lexer-STATE) + (setq state-stack phps-mode-lexer-state_stack) + (setq states phps-mode-lexer-states) + (setq tokens phps-mode-lexer-tokens) + (kill-buffer))) + (list tokens states state state-stack errors))) (defun phps-mode-lexer-move-states (start diff) "Move lexer states after (or equal to) START with modification DIFF." @@ -1915,20 +1996,44 @@ ;; Do partial lex from previous-token-end to change-stop - ;; Rewind lexer state here - (setq-local phps-mode-lexer-states head-states) - (setq-local phps-mode-lexer-STATE incremental-state) - (setq-local phps-mode-lexer-state_stack incremental-state-stack) + (let ((result (phps-mode-analyzer-lex-string + (buffer-substring-no-properties (point-min) (point-max)) + incremental-start-new-buffer + (point-max) + head-states + incremental-state + incremental-state-stack + head-tokens))) - ;; Generate new tokens - (setq incremental-tokens (semantic-lex incremental-start-new-buffer (point-max))) + (phps-mode-debug-message + (message "Incrementally-lexed-string: %s" result)) - (setq-local phps-mode-lexer-tokens (append head-tokens incremental-tokens)) + (setq phps-mode-lexer-tokens (nth 0 result)) + (setq phps-mode-lexer-states (nth 1 result)) + (setq phps-mode-lexer-STATE (nth 2 result)) + (setq phps-mode-lexer-state_stack (nth 3 result)) - (push (list 'INCREMENTAL-LEX incremental-start-new-buffer) log) + ;; Apply syntax color on token + (dolist (token phps-mode-lexer-tokens) + (let ((start (car (cdr token))) + (end (cdr (cdr token))) + (token-name (car token))) - (phps-mode-debug-message - (message "Incremental tokens: %s" incremental-tokens))) + ;; Apply syntax color on token + (let ((token-syntax-color (phps-mode-lexer-get-token-syntax-color token-name))) + (if token-syntax-color + (phps-mode-lexer-set-region-syntax-color start end token-syntax-color) + (phps-mode-lexer-clear-region-syntax-color start end))))) + + + (let ((errors (nth 4 result))) + (when errors + (display-warning 'phps-mode (format "Incremental Lex Errors: %s" errors)))) + + (push (list 'INCREMENTAL-LEX incremental-start-new-buffer) log) + + (phps-mode-debug-message + (message "Incremental tokens: %s" incremental-tokens)))) (push (list 'FOUND-NO-HEAD-STATES incremental-start-new-buffer) log) (phps-mode-debug-message (message "Found no head states")) @@ -1947,6 +2052,7 @@ (phps-mode-debug-message (message "Running full lexer")) (phps-mode-lexer-run)) + log))) (defun phps-mode-functions-get-processed-buffer () @@ -3322,7 +3428,7 @@ SQUARE-BRACKET-LEVEL and ROUND-BRACKET-LEVEL." (setq new-indentation (1- new-indentation))) (when (and (= bracket-level 0) - line-starts-with-closing-bracket) + line-starts-with-closing-bracket) (setq new-indentation (+ new-indentation tab-width))) (when current-line-starts-with-closing-bracket diff --git a/phps-mode.el b/phps-mode.el index 8601856..3d743f9 100644 --- a/phps-mode.el +++ b/phps-mode.el @@ -5,8 +5,8 @@ ;; Author: Christian Johansson <christ...@cvj.se> ;; Maintainer: Christian Johansson <christ...@cvj.se> ;; Created: 3 Mar 2018 -;; Modified: 13 Dec 2019 -;; Version: 0.3.25 +;; Modified: 19 Dec 2019 +;; Version: 0.3.26 ;; Keywords: tools, convenience ;; URL: https://github.com/cjohansson/emacs-phps-mode @@ -217,7 +217,7 @@ (setq-local semantic-lex-syntax-table phps-mode-syntax-table) ;; Semantic - (setq-local semantic-lex-analyzer #'phps-mode-lexer-lex) + (setq-local semantic-lex-analyzer #'phps-mode-analyzer-lex) ;; Set semantic-lex initializer function (add-hook 'semantic-lex-reset-functions #'phps-mode-lexer-setup 0 t) diff --git a/test/phps-mode-test-lexer.el b/test/phps-mode-test-lexer.el index a24b4cc..1437e06 100644 --- a/test/phps-mode-test-lexer.el +++ b/test/phps-mode-test-lexer.el @@ -336,19 +336,19 @@ "<?php\necho \"My neverending double quotation\n" "Neverending double quotation" (should (equal phps-mode-lexer-tokens - '((T_OPEN_TAG 1 . 7) (T_ECHO 7 . 11))))) + nil))) (phps-mode-test-with-buffer "<?php\n`My neverending backquotes\n" "Neverending backquotes" (should (equal phps-mode-lexer-tokens - '((T_OPEN_TAG 1 . 7) ("`" 7 . 8))))) + nil))) (phps-mode-test-with-buffer "<?php\n<<<LABEL\nMy neverending heredoc\ngoes on forever\n" "Neverending heredoc" (should (equal phps-mode-lexer-tokens - '((T_OPEN_TAG 1 . 7) (T_START_HEREDOC 7 . 16))))) + nil))) )