branch: externals/phps-mode commit 974885311f7ca661bbcdffc649e71fbdcaec1e44 Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Merged all lexer analysis into one to better match re2c lexer --- phps-mode-lexer.el | 1598 +++++++++++++++++++++++++--------------------------- 1 file changed, 773 insertions(+), 825 deletions(-) diff --git a/phps-mode-lexer.el b/phps-mode-lexer.el index e8a03d2..f4b8923 100644 --- a/phps-mode-lexer.el +++ b/phps-mode-lexer.el @@ -407,663 +407,622 @@ ;; LEXERS -(define-lex-analyzer phps-mode-lexer-lex--INITIAL - "<?=,<?php,<?,end|inline_char_handler" - (= phps-mode-lexer-STATE phps-mode-lexer-ST_INITIAL) +(define-lex-analyzer phps-mode-lexer-lex-analyzer + "Elisp port of original Zend re2c lexer." + t (cond - ((looking-at "<\\?=") - (let ((start (match-beginning 0)) - (end (match-end 0))) - (phps-mode-lexer-BEGIN phps-mode-lexer-ST_IN_SCRIPTING) - ;; (message "Starting scripting after <?=") - (when phps-mode-lexer-PARSER_MODE - (phps-mode-lexer-RETURN_TOKEN 'T_ECHO start end)) - (phps-mode-lexer-RETURN_TOKEN 'T_OPEN_TAG_WITH_ECHO start end))) - - ((looking-at "<\\?php\\([ \t]\\|\n\\)") - (let ((start (match-beginning 0)) - (end (match-end 0))) - (phps-mode-lexer-BEGIN phps-mode-lexer-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))) - - ((looking-at "<\\?") - (when phps-mode-lexer-SHORT_TAGS - (let ((start (match-beginning 0)) - (end (match-end 0))) - (phps-mode-lexer-BEGIN phps-mode-lexer-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)))) - - ;; NOTE: mimics inline_char_handler - ((looking-at phps-mode-lexer-ANY_CHAR) - (let ((start (match-beginning 0))) - (let ((string-start (search-forward "<?" nil t))) - (if string-start - (phps-mode-lexer-RETURN_TOKEN 'T_INLINE_HTML start (- string-start 2)) - (phps-mode-lexer-RETURN_TOKEN 'T_INLINE_HTML start (point-max)))))) - - )) - -(defun phps-mode-lexer-get-tokens () - "Get tokens." - phps-mode-lexer-tokens) - -(defun phps-mode-lexer--get-next-unescaped (character) - "Find where next un-escaped CHARACTER comes, if none is found return nil." - ;; (message "phps-mode-lexer--get-next-unescaped(%s)" character) - (let ((escaped nil) - (pos nil)) - (while (and (not pos) - (< (point) (point-max))) - (progn - ;; (message "Setting forward one %s vs %s" (point) (point-max)) - (forward-char) - (if (and (not escaped) - (looking-at-p character)) - (setq pos (1+ (point))) - (if (looking-at-p "\\\\") - (setq escaped (not escaped)) - (setq escaped nil))))) - pos)) + ;; ST_INITIAL + ((= phps-mode-lexer-STATE phps-mode-lexer-ST_INITIAL) + (cond -(define-lex-analyzer phps-mode-lexer-lex--ST_IN_SCRIPTING - "<ST_IN_SCRIPTING>" - (= phps-mode-lexer-STATE phps-mode-lexer-ST_IN_SCRIPTING) - (cond - - ((looking-at (concat "exit" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_EXIT (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "die" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_DIE (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "function" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_FUNCTION (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "const" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_CONST (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "return" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_RETURN (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "yield" phps-mode-lexer-WHITESPACE "from" "[^a-zA-Z0-9_\x80-\xff]")) - (phps-mode-lexer-RETURN_TOKEN 'T_YIELD_FROM (match-beginning 0) (match-end 0))) - ((looking-at (concat "yield" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_YIELD (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "try" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_TRY (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "catch" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_CATCH (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "finally" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_FINALLY (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "throw" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_THROW (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "if" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_IF (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "elseif" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_ELSEIF (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "endif" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_ENDIF (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "else" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_ELSE (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "while" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_WHILE (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "endwhile" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_ENDWHILE (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "do" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_DO (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "foreach" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_FOREACH (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "endforeach" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_ENDFOREACH (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "for" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_FOR (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "endfor" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_ENDFOR (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "declare" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_DECLARE (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "enddeclare" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_ENDDECLARE (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "instanceof" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_INSTANCEOF (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "as" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_AS (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "switch" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_SWITCH (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "endswitch" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_ENDSWITCH (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "case" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_CASE (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "default" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_DEFAULT (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "break" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_BREAK (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "continue" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_CONTINUE (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "goto" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_GOTO (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "echo" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_ECHO (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "print" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_PRINT (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "class" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_CLASS (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "interface" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_INTERFACE (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "trait" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_TRAIT (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "extends" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_EXTENDS (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "implements" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_IMPLEMENTS (match-beginning 0) (1- (match-end 0)))) - - ((looking-at "->") - (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_LOOKING_FOR_PROPERTY) - (phps-mode-lexer-RETURN_TOKEN 'T_OBJECT_OPERATOR (match-beginning 0) (match-end 0))) - - ((looking-at "\\?>\n?") - (let ((start (match-beginning 0)) - (end (match-end 0))) - (when (= (- end start) 3) - (setq end (1- end))) - (phps-mode-lexer-BEGIN phps-mode-lexer-ST_INITIAL) - (when phps-mode-lexer-PARSER_MODE - (phps-mode-lexer-RETURN_TOKEN ";" start end)) - (phps-mode-lexer-RETURN_TOKEN 'T_CLOSE_TAG start end))) - - ;; HEREDOC and NOWDOC - ((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)) - (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 phps-mode-lexer-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 phps-mode-lexer-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 phps-mode-lexer-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))) - - ((looking-at "::") - (phps-mode-lexer-RETURN_TOKEN 'T_PAAMAYIM_NEKUDOTAYIM (match-beginning 0) (match-end 0))) - ((looking-at "\\\\") - (phps-mode-lexer-RETURN_TOKEN 'T_NS_SEPARATOR (match-beginning 0) (match-end 0))) - ((looking-at "\\.\\.\\.") - (phps-mode-lexer-RETURN_TOKEN 'T_ELLIPSIS (match-beginning 0) (match-end 0))) - ((looking-at "\\?\\?") - (phps-mode-lexer-RETURN_TOKEN 'T_COALESCE (match-beginning 0) (match-end 0))) - ((looking-at (concat "new" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_NEW (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "clone" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_CLONE (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "var" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_VAR (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES "\\(integer\\|int\\)" phps-mode-lexer-TABS_AND_SPACES ")")) - (phps-mode-lexer-RETURN_TOKEN 'T_INT_CAST (match-beginning 0) (match-end 0))) - ((looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES "\\(real\\|double\\|float\\)" phps-mode-lexer-TABS_AND_SPACES ")")) - (phps-mode-lexer-RETURN_TOKEN 'T_DOUBLE_CAST (match-beginning 0) (match-end 0))) - ((looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES "\\(string\\|binary\\)" phps-mode-lexer-TABS_AND_SPACES ")")) - (phps-mode-lexer-RETURN_TOKEN 'T_STRING_CAST (match-beginning 0) (match-end 0))) - ((looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES "array" phps-mode-lexer-TABS_AND_SPACES ")")) - (phps-mode-lexer-RETURN_TOKEN 'T_ARRAY_CAST (match-beginning 0) (match-end 0))) - ((looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES "object" phps-mode-lexer-TABS_AND_SPACES ")")) - (phps-mode-lexer-RETURN_TOKEN 'T_OBJECT_CAST (match-beginning 0) (match-end 0))) - ((looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES "\\(boolean\\|bool\\)" phps-mode-lexer-TABS_AND_SPACES ")")) - (phps-mode-lexer-RETURN_TOKEN 'T_BOOL_CAST (match-beginning 0) (match-end 0))) - ((looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES "unset" phps-mode-lexer-TABS_AND_SPACES ")")) - (phps-mode-lexer-RETURN_TOKEN 'T_UNSET_CAST (match-beginning 0) (match-end 0))) - ((looking-at (concat "eval" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_EVAL (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "include_once" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_INCLUDE_ONCE (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "include" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_INCLUDE (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "require_once" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_REQUIRE_ONCE (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "require" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_REQUIRE (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "namespace" phps-mode-lexer-NOT-LABEL)) - (setq phps-mode-lexer-declaring_namespace t) - (phps-mode-lexer-RETURN_TOKEN 'T_NAMESPACE (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "use" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_USE (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "insteadof" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_INSTEADOF (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "global" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_GLOBAL (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "isset" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_ISSET (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "empty" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_EMPTY (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "__halt_compiler" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_HALT_COMPILER (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "static" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_STATIC (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "abstract" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_ABSTRACT (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "final" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_FINAL (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "private" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_PRIVATE (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "protected" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_PROTECTED (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "public" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_PUBLIC (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "unset" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_UNSET (match-beginning 0) (1- (match-end 0)))) - ((looking-at "=>") - (phps-mode-lexer-RETURN_TOKEN 'T_DOUBLE_ARROW (match-beginning 0) (match-end 0))) - ((looking-at (concat "list" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_LIST (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "array" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_ARRAY (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "callable" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_CALLABLE (match-beginning 0) (1- (match-end 0)))) - ((looking-at "\\+\\+") - (phps-mode-lexer-RETURN_TOKEN 'T_INC (match-beginning 0) (match-end 0))) - ((looking-at "--") - (phps-mode-lexer-RETURN_TOKEN 'T_DEC (match-beginning 0) (match-end 0))) - ((looking-at "===") - (phps-mode-lexer-RETURN_TOKEN 'T_IS_IDENTICAL (match-beginning 0) (match-end 0))) - ((looking-at "!==") - (phps-mode-lexer-RETURN_TOKEN 'T_IS_NOT_IDENTICAL (match-beginning 0) (match-end 0))) - ((looking-at "==") - (phps-mode-lexer-RETURN_TOKEN 'T_IS_EQUAL (match-beginning 0) (match-end 0))) - ((looking-at "\\(!=\\|<>\\)") - (phps-mode-lexer-RETURN_TOKEN 'T_IS_NOT_EQUAL (match-beginning 0) (match-end 0))) - ((looking-at "<=>") - (phps-mode-lexer-RETURN_TOKEN 'T_SPACESHIP (match-beginning 0) (match-end 0))) - ((looking-at "<=") - (phps-mode-lexer-RETURN_TOKEN 'T_IS_SMALLER_OR_EQUAL (match-beginning 0) (match-end 0))) - ((looking-at ">=") - (phps-mode-lexer-RETURN_TOKEN 'T_IS_GREATER_OR_EQUAL (match-beginning 0) (match-end 0))) - ((looking-at "\\+=") - (phps-mode-lexer-RETURN_TOKEN 'T_PLUS_EQUAL (match-beginning 0) (match-end 0))) - ((looking-at "-=") - (phps-mode-lexer-RETURN_TOKEN 'T_MINUS_EQUAL (match-beginning 0) (match-end 0))) - ((looking-at "\\*=") - (phps-mode-lexer-RETURN_TOKEN 'T_MUL_EQUAL (match-beginning 0) (match-end 0))) - ((looking-at "\\*\\\\\\*=") - (phps-mode-lexer-RETURN_TOKEN 'T_POW_EQUAL (match-beginning 0) (match-end 0))) - ((looking-at "\\*\\\\\\*") - (phps-mode-lexer-RETURN_TOKEN 'T_POW (match-beginning 0) (match-end 0))) - ((looking-at "/=") - (phps-mode-lexer-RETURN_TOKEN 'T_DIV_EQUAL (match-beginning 0) (match-end 0))) - ((looking-at "\\.=") - (phps-mode-lexer-RETURN_TOKEN 'T_CONCAT_EQUAL (match-beginning 0) (match-end 0))) - ((looking-at "%=") - (phps-mode-lexer-RETURN_TOKEN 'T_MOD_EQUAL (match-beginning 0) (match-end 0))) - ((looking-at "<<=") - (phps-mode-lexer-RETURN_TOKEN 'T_SL_EQUAL (match-beginning 0) (match-end 0))) - ((looking-at ">>=") - (phps-mode-lexer-RETURN_TOKEN 'T_SR_EQUAL (match-beginning 0) (match-end 0))) - ((looking-at "&=") - (phps-mode-lexer-RETURN_TOKEN 'T_AND_EQUAL (match-beginning 0) (match-end 0))) - ((looking-at "|=") - (phps-mode-lexer-RETURN_TOKEN 'T_OR_EQUAL (match-beginning 0) (match-end 0))) - ((looking-at "\\^=") - (phps-mode-lexer-RETURN_TOKEN 'T_XOR_EQUAL (match-beginning 0) (match-end 0))) - ((looking-at "||") - (phps-mode-lexer-RETURN_TOKEN 'T_BOOLEAN_OR (match-beginning 0) (match-end 0))) - ((looking-at "&&") - (phps-mode-lexer-RETURN_TOKEN 'T_BOOLEAN_AND (match-beginning 0) (match-end 0))) - ((looking-at (concat "XOR" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_XOR (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "OR" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_OR (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "AND" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_AND (match-beginning 0) (1- (match-end 0)))) - ((looking-at "<<") - (phps-mode-lexer-RETURN_TOKEN 'T_SL (match-beginning 0) (match-end 0))) - ((looking-at ">>") - (phps-mode-lexer-RETURN_TOKEN 'T_SR (match-beginning 0) (match-end 0))) - - ((looking-at "{") - (phps-mode-lexer-yy_push_state phps-mode-lexer-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))) - - ((looking-at "}") - (when phps-mode-lexer-state_stack - ;; (message "State stack %s" phps-mode-lexer-state_stack) - ;; (message "popping state from } %s at %s-%s" (length phps-mode-lexer-state_stack) (match-beginning 0) (match-end 0)) - (phps-mode-lexer-yy_pop_state) - ;; (message "New state: %s" phps-mode-lexer-STATE) - ) - (phps-mode-lexer-RETURN_TOKEN "}" (match-beginning 0) (match-end 0))) - - ((looking-at phps-mode-lexer-BNUM) - (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)))) - - ((looking-at phps-mode-lexer-HNUM) - (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)))) - - ((or (looking-at phps-mode-lexer-EXPONENT_DNUM) - (looking-at phps-mode-lexer-DNUM)) - (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))) - - ((looking-at phps-mode-lexer-LNUM) - (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)))) - - ((looking-at (concat "__CLASS__" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_CLASS_C (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "__TRAIT__" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_TRAIT_C (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "__FUNCTION__" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_FUNC_C (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "__METHOD__" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_METHOD_C (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "__LINE__" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_LINE (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "__FILE__" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_FILE (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "__DIR__" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_DIR (match-beginning 0) (1- (match-end 0)))) - ((looking-at (concat "__NAMESPACE__" phps-mode-lexer-NOT-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_NS_C (match-beginning 0) (1- (match-end 0)))) - - ((looking-at "\\(//\\|#\\)") - (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 - ;; (message "Found comment 1 from %s to %s %s in %s" end (+ end (match-beginning 0)) (match-beginning 0) line) - (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)) - )))) - - ((looking-at (concat "/\\*\\*" phps-mode-lexer-WHITESPACE)) - (let* ((start (match-beginning 0)) - (end (match-end 0)) - (_data (buffer-substring-no-properties start end))) - (let ((string-start (search-forward "*/" nil t)) - position) - (if string-start - (setq position string-start) - (progn - (setq position (point-max)) - (phps-mode-lexer-MOVE_FORWARD (point-max)))) - (phps-mode-lexer-RETURN_TOKEN 'T_DOC_COMMENT start position) - ))) - - ((looking-at "/\\*") - (let* ((start (match-beginning 0)) - (end (match-end 0)) - (_data (buffer-substring-no-properties start end))) - (let ((string-start (search-forward "*/" nil t)) - position) - (if string-start - (setq position string-start) - (progn - (setq position (point-max)) - (phps-mode-lexer-MOVE_FORWARD (point-max)))) - (phps-mode-lexer-RETURN_TOKEN 'T_COMMENT start position) - ))) - - ((looking-at (concat "\\$" phps-mode-lexer-LABEL)) - (let ((start (match-beginning 0)) - (end (match-end 0))) - (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE start end))) - - ((looking-at phps-mode-lexer-TOKENS) - (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) + ((looking-at "<\\?=") + (let ((start (match-beginning 0)) + (end (match-end 0))) + (phps-mode-lexer-BEGIN phps-mode-lexer-ST_IN_SCRIPTING) + ;; (message "Starting scripting after <?=") + (when phps-mode-lexer-PARSER_MODE + (phps-mode-lexer-RETURN_TOKEN 'T_ECHO start end)) + (phps-mode-lexer-RETURN_TOKEN 'T_OPEN_TAG_WITH_ECHO start end))) + + ((looking-at "<\\?php\\([ \t]\\|\n\\)") + (let ((start (match-beginning 0)) + (end (match-end 0))) + (phps-mode-lexer-BEGIN phps-mode-lexer-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))) + + ((looking-at "<\\?") + (when phps-mode-lexer-SHORT_TAGS + (let ((start (match-beginning 0)) + (end (match-end 0))) + (phps-mode-lexer-BEGIN phps-mode-lexer-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)))) + + ;; NOTE: mimics inline_char_handler + ((looking-at phps-mode-lexer-ANY_CHAR) + (let ((start (match-beginning 0))) + (let ((string-start (search-forward "<?" nil t))) + (if string-start + (phps-mode-lexer-RETURN_TOKEN 'T_INLINE_HTML start (- string-start 2)) + (phps-mode-lexer-RETURN_TOKEN 'T_INLINE_HTML start (point-max)))))) + + )) + + ;; ST_IN_SCRIPTING + ((= phps-mode-lexer-STATE phps-mode-lexer-ST_IN_SCRIPTING) + (cond + + ((looking-at (concat "exit" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_EXIT (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "die" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_DIE (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "function" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_FUNCTION (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "const" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_CONST (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "return" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_RETURN (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "yield" phps-mode-lexer-WHITESPACE "from" "[^a-zA-Z0-9_\x80-\xff]")) + (phps-mode-lexer-RETURN_TOKEN 'T_YIELD_FROM (match-beginning 0) (match-end 0))) + ((looking-at (concat "yield" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_YIELD (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "try" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_TRY (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "catch" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_CATCH (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "finally" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_FINALLY (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "throw" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_THROW (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "if" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_IF (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "elseif" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_ELSEIF (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "endif" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_ENDIF (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "else" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_ELSE (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "while" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_WHILE (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "endwhile" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_ENDWHILE (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "do" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_DO (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "foreach" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_FOREACH (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "endforeach" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_ENDFOREACH (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "for" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_FOR (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "endfor" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_ENDFOR (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "declare" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_DECLARE (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "enddeclare" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_ENDDECLARE (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "instanceof" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_INSTANCEOF (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "as" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_AS (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "switch" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_SWITCH (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "endswitch" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_ENDSWITCH (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "case" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_CASE (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "default" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_DEFAULT (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "break" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_BREAK (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "continue" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_CONTINUE (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "goto" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_GOTO (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "echo" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_ECHO (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "print" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_PRINT (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "class" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_CLASS (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "interface" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_INTERFACE (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "trait" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_TRAIT (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "extends" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_EXTENDS (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "implements" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_IMPLEMENTS (match-beginning 0) (1- (match-end 0)))) + + ((looking-at "->") + (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_LOOKING_FOR_PROPERTY) + (phps-mode-lexer-RETURN_TOKEN 'T_OBJECT_OPERATOR (match-beginning 0) (match-end 0))) + + ((looking-at "\\?>\n?") + (let ((start (match-beginning 0)) + (end (match-end 0))) + (when (= (- end start) 3) + (setq end (1- end))) + (phps-mode-lexer-BEGIN phps-mode-lexer-ST_INITIAL) + (when phps-mode-lexer-PARSER_MODE + (phps-mode-lexer-RETURN_TOKEN ";" start end)) + (phps-mode-lexer-RETURN_TOKEN 'T_CLOSE_TAG start end))) + + ;; HEREDOC and NOWDOC + ((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)) + (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 phps-mode-lexer-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 phps-mode-lexer-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 phps-mode-lexer-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))) + + ((looking-at "::") + (phps-mode-lexer-RETURN_TOKEN 'T_PAAMAYIM_NEKUDOTAYIM (match-beginning 0) (match-end 0))) + ((looking-at "\\\\") + (phps-mode-lexer-RETURN_TOKEN 'T_NS_SEPARATOR (match-beginning 0) (match-end 0))) + ((looking-at "\\.\\.\\.") + (phps-mode-lexer-RETURN_TOKEN 'T_ELLIPSIS (match-beginning 0) (match-end 0))) + ((looking-at "\\?\\?") + (phps-mode-lexer-RETURN_TOKEN 'T_COALESCE (match-beginning 0) (match-end 0))) + ((looking-at (concat "new" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_NEW (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "clone" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_CLONE (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "var" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_VAR (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES "\\(integer\\|int\\)" phps-mode-lexer-TABS_AND_SPACES ")")) + (phps-mode-lexer-RETURN_TOKEN 'T_INT_CAST (match-beginning 0) (match-end 0))) + ((looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES "\\(real\\|double\\|float\\)" phps-mode-lexer-TABS_AND_SPACES ")")) + (phps-mode-lexer-RETURN_TOKEN 'T_DOUBLE_CAST (match-beginning 0) (match-end 0))) + ((looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES "\\(string\\|binary\\)" phps-mode-lexer-TABS_AND_SPACES ")")) + (phps-mode-lexer-RETURN_TOKEN 'T_STRING_CAST (match-beginning 0) (match-end 0))) + ((looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES "array" phps-mode-lexer-TABS_AND_SPACES ")")) + (phps-mode-lexer-RETURN_TOKEN 'T_ARRAY_CAST (match-beginning 0) (match-end 0))) + ((looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES "object" phps-mode-lexer-TABS_AND_SPACES ")")) + (phps-mode-lexer-RETURN_TOKEN 'T_OBJECT_CAST (match-beginning 0) (match-end 0))) + ((looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES "\\(boolean\\|bool\\)" phps-mode-lexer-TABS_AND_SPACES ")")) + (phps-mode-lexer-RETURN_TOKEN 'T_BOOL_CAST (match-beginning 0) (match-end 0))) + ((looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES "unset" phps-mode-lexer-TABS_AND_SPACES ")")) + (phps-mode-lexer-RETURN_TOKEN 'T_UNSET_CAST (match-beginning 0) (match-end 0))) + ((looking-at (concat "eval" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_EVAL (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "include_once" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_INCLUDE_ONCE (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "include" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_INCLUDE (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "require_once" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_REQUIRE_ONCE (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "require" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_REQUIRE (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "namespace" phps-mode-lexer-NOT-LABEL)) + (setq phps-mode-lexer-declaring_namespace t) + (phps-mode-lexer-RETURN_TOKEN 'T_NAMESPACE (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "use" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_USE (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "insteadof" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_INSTEADOF (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "global" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_GLOBAL (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "isset" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_ISSET (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "empty" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_EMPTY (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "__halt_compiler" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_HALT_COMPILER (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "static" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_STATIC (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "abstract" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_ABSTRACT (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "final" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_FINAL (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "private" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_PRIVATE (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "protected" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_PROTECTED (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "public" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_PUBLIC (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "unset" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_UNSET (match-beginning 0) (1- (match-end 0)))) + ((looking-at "=>") + (phps-mode-lexer-RETURN_TOKEN 'T_DOUBLE_ARROW (match-beginning 0) (match-end 0))) + ((looking-at (concat "list" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_LIST (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "array" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_ARRAY (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "callable" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_CALLABLE (match-beginning 0) (1- (match-end 0)))) + ((looking-at "\\+\\+") + (phps-mode-lexer-RETURN_TOKEN 'T_INC (match-beginning 0) (match-end 0))) + ((looking-at "--") + (phps-mode-lexer-RETURN_TOKEN 'T_DEC (match-beginning 0) (match-end 0))) + ((looking-at "===") + (phps-mode-lexer-RETURN_TOKEN 'T_IS_IDENTICAL (match-beginning 0) (match-end 0))) + ((looking-at "!==") + (phps-mode-lexer-RETURN_TOKEN 'T_IS_NOT_IDENTICAL (match-beginning 0) (match-end 0))) + ((looking-at "==") + (phps-mode-lexer-RETURN_TOKEN 'T_IS_EQUAL (match-beginning 0) (match-end 0))) + ((looking-at "\\(!=\\|<>\\)") + (phps-mode-lexer-RETURN_TOKEN 'T_IS_NOT_EQUAL (match-beginning 0) (match-end 0))) + ((looking-at "<=>") + (phps-mode-lexer-RETURN_TOKEN 'T_SPACESHIP (match-beginning 0) (match-end 0))) + ((looking-at "<=") + (phps-mode-lexer-RETURN_TOKEN 'T_IS_SMALLER_OR_EQUAL (match-beginning 0) (match-end 0))) + ((looking-at ">=") + (phps-mode-lexer-RETURN_TOKEN 'T_IS_GREATER_OR_EQUAL (match-beginning 0) (match-end 0))) + ((looking-at "\\+=") + (phps-mode-lexer-RETURN_TOKEN 'T_PLUS_EQUAL (match-beginning 0) (match-end 0))) + ((looking-at "-=") + (phps-mode-lexer-RETURN_TOKEN 'T_MINUS_EQUAL (match-beginning 0) (match-end 0))) + ((looking-at "\\*=") + (phps-mode-lexer-RETURN_TOKEN 'T_MUL_EQUAL (match-beginning 0) (match-end 0))) + ((looking-at "\\*\\\\\\*=") + (phps-mode-lexer-RETURN_TOKEN 'T_POW_EQUAL (match-beginning 0) (match-end 0))) + ((looking-at "\\*\\\\\\*") + (phps-mode-lexer-RETURN_TOKEN 'T_POW (match-beginning 0) (match-end 0))) + ((looking-at "/=") + (phps-mode-lexer-RETURN_TOKEN 'T_DIV_EQUAL (match-beginning 0) (match-end 0))) + ((looking-at "\\.=") + (phps-mode-lexer-RETURN_TOKEN 'T_CONCAT_EQUAL (match-beginning 0) (match-end 0))) + ((looking-at "%=") + (phps-mode-lexer-RETURN_TOKEN 'T_MOD_EQUAL (match-beginning 0) (match-end 0))) + ((looking-at "<<=") + (phps-mode-lexer-RETURN_TOKEN 'T_SL_EQUAL (match-beginning 0) (match-end 0))) + ((looking-at ">>=") + (phps-mode-lexer-RETURN_TOKEN 'T_SR_EQUAL (match-beginning 0) (match-end 0))) + ((looking-at "&=") + (phps-mode-lexer-RETURN_TOKEN 'T_AND_EQUAL (match-beginning 0) (match-end 0))) + ((looking-at "|=") + (phps-mode-lexer-RETURN_TOKEN 'T_OR_EQUAL (match-beginning 0) (match-end 0))) + ((looking-at "\\^=") + (phps-mode-lexer-RETURN_TOKEN 'T_XOR_EQUAL (match-beginning 0) (match-end 0))) + ((looking-at "||") + (phps-mode-lexer-RETURN_TOKEN 'T_BOOLEAN_OR (match-beginning 0) (match-end 0))) + ((looking-at "&&") + (phps-mode-lexer-RETURN_TOKEN 'T_BOOLEAN_AND (match-beginning 0) (match-end 0))) + ((looking-at (concat "XOR" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_XOR (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "OR" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_OR (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "AND" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_AND (match-beginning 0) (1- (match-end 0)))) + ((looking-at "<<") + (phps-mode-lexer-RETURN_TOKEN 'T_SL (match-beginning 0) (match-end 0))) + ((looking-at ">>") + (phps-mode-lexer-RETURN_TOKEN 'T_SR (match-beginning 0) (match-end 0))) + + ((looking-at "{") + (phps-mode-lexer-yy_push_state phps-mode-lexer-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))) + + ((looking-at "}") + (when phps-mode-lexer-state_stack + ;; (message "State stack %s" phps-mode-lexer-state_stack) + ;; (message "popping state from } %s at %s-%s" (length phps-mode-lexer-state_stack) (match-beginning 0) (match-end 0)) + (phps-mode-lexer-yy_pop_state) + ;; (message "New state: %s" phps-mode-lexer-STATE) ) - (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)))) - - ((looking-at "'") - (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 - ;; (message "Single quoted string %s" (buffer-substring-no-properties start un-escaped-end)) - (phps-mode-lexer-RETURN_TOKEN 'T_CONSTANT_ENCAPSED_STRING start un-escaped-end)) - (progn - ;; Unclosed single quotes - ;; (message "Single quoted string never ends..") - (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE start (point-max)) - (phps-mode-lexer-MOVE_FORWARD (point-max)))))) - - ;; Double quoted string - ((looking-at "\"") - (let* ((start (match-beginning 0)) - (end (match-end 0)) - (_data (buffer-substring-no-properties start end))) - (forward-char) - ;; Handle the "" case - (if (looking-at-p "\"") - (progn - ;; (message "Empty double quoted string from %s to %s" start (+ start 2)) - (phps-mode-lexer-RETURN_TOKEN 'T_CONSTANT_ENCAPSED_STRING start (+ start 2)) - (forward-char)) - (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))) - ;; (message "Double quoted string %s" double-quoted-string) - ;; Do we find variable inside quote? - (goto-char string-start) - (if (looking-at "[^\\\\]\"") - (progn - (let ((_double-quoted-string (buffer-substring-no-properties start (+ string-start 2)))) - ;; (message "Double quoted string: %s" _double-quoted-string) - (phps-mode-lexer-RETURN_TOKEN 'T_CONSTANT_ENCAPSED_STRING start (+ string-start 2)))) - (progn - ;; (message "Found variable after '%s'" (buffer-substring-no-properties start string-start)) - (phps-mode-lexer-BEGIN phps-mode-lexer-ST_DOUBLE_QUOTES) - (phps-mode-lexer-RETURN_TOKEN "\"" start (1+ start)) - (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE (1+ start) string-start)))) + (phps-mode-lexer-RETURN_TOKEN "}" (match-beginning 0) (match-end 0))) + + ((looking-at phps-mode-lexer-BNUM) + (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)))) + + ((looking-at phps-mode-lexer-HNUM) + (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)))) + + ((or (looking-at phps-mode-lexer-EXPONENT_DNUM) + (looking-at phps-mode-lexer-DNUM)) + (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))) + + ((looking-at phps-mode-lexer-LNUM) + (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)))) + + ((looking-at (concat "__CLASS__" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_CLASS_C (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "__TRAIT__" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_TRAIT_C (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "__FUNCTION__" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_FUNC_C (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "__METHOD__" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_METHOD_C (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "__LINE__" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_LINE (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "__FILE__" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_FILE (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "__DIR__" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_DIR (match-beginning 0) (1- (match-end 0)))) + ((looking-at (concat "__NAMESPACE__" phps-mode-lexer-NOT-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_NS_C (match-beginning 0) (1- (match-end 0)))) + + ((looking-at "\\(//\\|#\\)") + (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 + ;; (message "Found comment 1 from %s to %s %s in %s" end (+ end (match-beginning 0)) (match-beginning 0) line) + (phps-mode-lexer-RETURN_TOKEN 'T_COMMENT start (+ end (match-beginning 0))) + ) (progn - ;; (message "Found no ending quote, skipping to end") - (phps-mode-lexer-RETURN_TOKEN 'T_ERROR start (point-max)) - (phps-mode-lexer-MOVE_FORWARD (point-max)))))))) - - ((looking-at "[`]") - ;; (message "Begun backquote at %s-%s" (match-beginning 0) (match-end 0)) - (phps-mode-lexer-BEGIN phps-mode-lexer-ST_BACKQUOTE) - (phps-mode-lexer-RETURN_TOKEN "`" (match-beginning 0) (match-end 0))) - - ((looking-at phps-mode-lexer-WHITESPACE) - (let* ((start (match-beginning 0)) - (end (match-end 0)) - (data (buffer-substring-no-properties start end))) - (if phps-mode-lexer-PARSER_MODE - (phps-mode-lexer-MOVE_FORWARD end) - (phps-mode-lexer-RETURN_TOKEN data start end)))) - - ((looking-at phps-mode-lexer-LABEL) - ;; (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))) - - ((looking-at phps-mode-lexer-TOKENS) - (phps-mode-lexer-RETURN_TOKEN (match-string 0) (match-beginning 0) (match-end 0))) - - ((looking-at phps-mode-lexer-ANY_CHAR) - ;; Unexpected character - ;; (message "Unexpected character '%s'" (buffer-substring-no-properties (match-beginning 0) (match-end 0))) - (phps-mode-lexer-RETURN_TOKEN 'T_ERROR (match-beginning 0) (point-max)) - (phps-mode-lexer-MOVE_FORWARD (point-max))) - - )) - -(define-lex-analyzer phps-mode-lexer-lex--ST_LOOKING_FOR_PROPERTY " -{WHITESPACE}+ --> -{LABEL} -{ANY_CHAR} -" - (= phps-mode-lexer-STATE phps-mode-lexer-ST_LOOKING_FOR_PROPERTY) - - (cond - - ((looking-at phps-mode-lexer-WHITESPACE) - (let* ((start (match-beginning 0)) - (end (match-end 0)) - (_data (buffer-substring-no-properties start end))) - (if phps-mode-lexer-PARSER_MODE - (phps-mode-lexer-MOVE_FORWARD end) - (phps-mode-lexer-RETURN_TOKEN 'T_WHITESPACE start end)))) - - ((looking-at "->") - (phps-mode-lexer-RETURN_TOKEN 'T_OBJECT_OPERATOR (match-beginning 0) (match-end 0))) - - ((looking-at phps-mode-lexer-LABEL) - (let ((start (match-beginning 0)) - (end (match-end 0))) - (phps-mode-lexer-yy_pop_state) - (phps-mode-lexer-RETURN_TOKEN 'T_STRING start end))) - - ((looking-at phps-mode-lexer-ANY_CHAR) - (let ((_start (match-beginning 0)) - (end (match-end 0))) - (phps-mode-lexer-yy_pop_state) - ;; TODO goto restart here? - ;; (message "Restart here") - (phps-mode-lexer-MOVE_FORWARD end))) - - )) - -(define-lex-analyzer phps-mode-lexer-lex--ST_DOUBLE_QUOTES " -<ST_DOUBLE_QUOTES> -\"${\" -\"$\"{LABEL}\"->\"[a-zA-Z_\x80-\xff] -\"$\"{LABEL}\"[\" -\"$\"{LABEL} -\"{$\" -[\"] -{ANY_CHAR} -" - (= phps-mode-lexer-STATE phps-mode-lexer-ST_DOUBLE_QUOTES) - (cond - - ((looking-at "\\${") - (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_LOOKING_FOR_VARNAME) - (phps-mode-lexer-RETURN_TOKEN 'T_DOLLAR_OPEN_CURLY_BRACES (match-beginning 0) (match-end 0))) - - ((looking-at (concat "\\$" phps-mode-lexer-LABEL "->" "[a-zA-Z_\x80-\xff]")) - (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_LOOKING_FOR_PROPERTY) - (forward-char -3) - (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (- (match-end 0) 3))) - - ((looking-at (concat "\\$" phps-mode-lexer-LABEL "\\[")) - (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_VAR_OFFSET) - (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (match-end 0))) - - ((looking-at (concat "\\$" phps-mode-lexer-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (match-end 0))) - - ((looking-at "{\\$") - (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_IN_SCRIPTING) - ;; (message "Starting ST_IN_SCRIPTING from double-quoted string at %s-%s" (match-beginning 0) (- (match-end 0) 1)) - (phps-mode-lexer-RETURN_TOKEN 'T_CURLY_OPEN (match-beginning 0) (- (match-end 0) 1))) - - ((looking-at "[\"]") - (phps-mode-lexer-BEGIN phps-mode-lexer-ST_IN_SCRIPTING) - ;; (message "Ended double-quote at %s" (match-beginning 0)) - (phps-mode-lexer-RETURN_TOKEN "\"" (match-beginning 0) (match-end 0))) - - ((looking-at phps-mode-lexer-ANY_CHAR) - (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) - )) + ;; 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)) + )))) + + ((looking-at (concat "/\\*\\*" phps-mode-lexer-WHITESPACE)) + (let* ((start (match-beginning 0)) + (end (match-end 0)) + (_data (buffer-substring-no-properties start end))) + (let ((string-start (search-forward "*/" nil t)) + position) + (if string-start + (setq position string-start) + (progn + (setq position (point-max)) + (phps-mode-lexer-MOVE_FORWARD (point-max)))) + (phps-mode-lexer-RETURN_TOKEN 'T_DOC_COMMENT start position) + ))) + + ((looking-at "/\\*") + (let* ((start (match-beginning 0)) + (end (match-end 0)) + (_data (buffer-substring-no-properties start end))) + (let ((string-start (search-forward "*/" nil t)) + position) + (if string-start + (setq position string-start) + (progn + (setq position (point-max)) + (phps-mode-lexer-MOVE_FORWARD (point-max)))) + (phps-mode-lexer-RETURN_TOKEN 'T_COMMENT start position) + ))) + + ((looking-at (concat "\\$" phps-mode-lexer-LABEL)) + (let ((start (match-beginning 0)) + (end (match-end 0))) + (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE start end))) + + ((looking-at phps-mode-lexer-TOKENS) + (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)))) + + ((looking-at "'") + (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 + ;; (message "Single quoted string %s" (buffer-substring-no-properties start un-escaped-end)) + (phps-mode-lexer-RETURN_TOKEN 'T_CONSTANT_ENCAPSED_STRING start un-escaped-end)) + (progn + ;; Unclosed single quotes + ;; (message "Single quoted string never ends..") + (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE start (point-max)) + (phps-mode-lexer-MOVE_FORWARD (point-max)))))) + + ;; Double quoted string + ((looking-at "\"") + (let* ((start (match-beginning 0)) + (end (match-end 0)) + (_data (buffer-substring-no-properties start end))) + (forward-char) + ;; Handle the "" case + (if (looking-at-p "\"") + (progn + ;; (message "Empty double quoted string from %s to %s" start (+ start 2)) + (phps-mode-lexer-RETURN_TOKEN 'T_CONSTANT_ENCAPSED_STRING start (+ start 2)) + (forward-char)) + (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))) + ;; (message "Double quoted string %s" double-quoted-string) + ;; Do we find variable inside quote? + (goto-char string-start) + (if (looking-at "[^\\\\]\"") + (progn + (let ((_double-quoted-string (buffer-substring-no-properties start (+ string-start 2)))) + ;; (message "Double quoted string: %s" _double-quoted-string) + (phps-mode-lexer-RETURN_TOKEN 'T_CONSTANT_ENCAPSED_STRING start (+ string-start 2)))) + (progn + ;; (message "Found variable after '%s'" (buffer-substring-no-properties start string-start)) + (phps-mode-lexer-BEGIN phps-mode-lexer-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 - (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 - ;; "Found no end of double-quoted region - (phps-mode-lexer-RETURN_TOKEN 'T_ERROR start (point-max)) - (phps-mode-lexer-MOVE_FORWARD (point-max))))))) + ;; (message "Found no ending quote, skipping to end") + (phps-mode-lexer-RETURN_TOKEN 'T_ERROR start (point-max)) + (phps-mode-lexer-MOVE_FORWARD (point-max)))))))) + + ((looking-at "[`]") + ;; (message "Begun backquote at %s-%s" (match-beginning 0) (match-end 0)) + (phps-mode-lexer-BEGIN phps-mode-lexer-ST_BACKQUOTE) + (phps-mode-lexer-RETURN_TOKEN "`" (match-beginning 0) (match-end 0))) + + ((looking-at phps-mode-lexer-WHITESPACE) + (let* ((start (match-beginning 0)) + (end (match-end 0)) + (data (buffer-substring-no-properties start end))) + (if phps-mode-lexer-PARSER_MODE + (phps-mode-lexer-MOVE_FORWARD end) + (phps-mode-lexer-RETURN_TOKEN data start end)))) + + ((looking-at phps-mode-lexer-LABEL) + ;; (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))) + + ((looking-at phps-mode-lexer-TOKENS) + (phps-mode-lexer-RETURN_TOKEN (match-string 0) (match-beginning 0) (match-end 0))) + + ((looking-at phps-mode-lexer-ANY_CHAR) + ;; Unexpected character + ;; (message "Unexpected character '%s'" (buffer-substring-no-properties (match-beginning 0) (match-end 0))) + (phps-mode-lexer-RETURN_TOKEN 'T_ERROR (match-beginning 0) (point-max)) + (phps-mode-lexer-MOVE_FORWARD (point-max))) + + )) + + ;; ST_LOOKING_FOR_PROPERTY + ((= phps-mode-lexer-STATE phps-mode-lexer-ST_LOOKING_FOR_PROPERTY) + + (cond + + ((looking-at phps-mode-lexer-WHITESPACE) + (let* ((start (match-beginning 0)) + (end (match-end 0)) + (_data (buffer-substring-no-properties start end))) + (if phps-mode-lexer-PARSER_MODE + (phps-mode-lexer-MOVE_FORWARD end) + (phps-mode-lexer-RETURN_TOKEN 'T_WHITESPACE start end)))) + + ((looking-at "->") + (phps-mode-lexer-RETURN_TOKEN 'T_OBJECT_OPERATOR (match-beginning 0) (match-end 0))) + + ((looking-at phps-mode-lexer-LABEL) + (let ((start (match-beginning 0)) + (end (match-end 0))) + (phps-mode-lexer-yy_pop_state) + (phps-mode-lexer-RETURN_TOKEN 'T_STRING start end))) + + ((looking-at phps-mode-lexer-ANY_CHAR) + (let ((_start (match-beginning 0)) + (end (match-end 0))) + (phps-mode-lexer-yy_pop_state) + ;; TODO goto restart here? + ;; (message "Restart here") + (phps-mode-lexer-MOVE_FORWARD end))) + + )) + + ;; ST_DOUBLE_QUOTES + ((= phps-mode-lexer-STATE phps-mode-lexer-ST_DOUBLE_QUOTES) + (cond + + ((looking-at "\\${") + (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_LOOKING_FOR_VARNAME) + (phps-mode-lexer-RETURN_TOKEN 'T_DOLLAR_OPEN_CURLY_BRACES (match-beginning 0) (match-end 0))) + + ((looking-at (concat "\\$" phps-mode-lexer-LABEL "->" "[a-zA-Z_\x80-\xff]")) + (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_LOOKING_FOR_PROPERTY) + (forward-char -3) + (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (- (match-end 0) 3))) + + ((looking-at (concat "\\$" phps-mode-lexer-LABEL "\\[")) + (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_VAR_OFFSET) + (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (match-end 0))) + + ((looking-at (concat "\\$" phps-mode-lexer-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (match-end 0))) + + ((looking-at "{\\$") + (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_IN_SCRIPTING) + ;; (message "Starting ST_IN_SCRIPTING from double-quoted string at %s-%s" (match-beginning 0) (- (match-end 0) 1)) + (phps-mode-lexer-RETURN_TOKEN 'T_CURLY_OPEN (match-beginning 0) (- (match-end 0) 1))) + + ((looking-at "[\"]") + (phps-mode-lexer-BEGIN phps-mode-lexer-ST_IN_SCRIPTING) + ;; (message "Ended double-quote at %s" (match-beginning 0)) + (phps-mode-lexer-RETURN_TOKEN "\"" (match-beginning 0) (match-end 0))) - )) + ((looking-at phps-mode-lexer-ANY_CHAR) + (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)) + ))) + (progn + ;; "Found no end of double-quoted region + (phps-mode-lexer-RETURN_TOKEN 'T_ERROR start (point-max)) + (phps-mode-lexer-MOVE_FORWARD (point-max))))))) + + )) -(define-lex-analyzer phps-mode-lexer-lex--ST_BACKQUOTE " -\"{$\" -\"$\"{LABEL}\"->\"[a-zA-Z_\x80-\xff] -\"$\"{LABEL}\"[\" -\"$\"{LABEL} -{$ -` -ANY_CHAR' -" - (= phps-mode-lexer-STATE phps-mode-lexer-ST_BACKQUOTE) - (let ((old-start (point))) + ;; ST_BACKQUOTE + ((= phps-mode-lexer-STATE phps-mode-lexer-ST_BACKQUOTE) + (let ((old-start (point))) (cond ((looking-at "\\${") @@ -1104,188 +1063,188 @@ ANY_CHAR' ))) -(define-lex-analyzer phps-mode-lexer-lex--ST_HEREDOC " -\"{$\" -\"$\"{LABEL}\"->\"[a-zA-Z_\x80-\xff] -\"$\"{LABEL}\"[\" -\"$\"{LABEL} -{$ -` -ANY_CHAR' -" - (= phps-mode-lexer-STATE phps-mode-lexer-ST_HEREDOC) - - (let ((heredoc_label (car phps-mode-lexer-heredoc_label_stack)) - (old-start (point))) - (cond - - ((looking-at "\\${") - (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_LOOKING_FOR_VARNAME) - (phps-mode-lexer-RETURN_TOKEN 'T_DOLLAR_OPEN_CURLY_BRACES (match-beginning 0) (match-end 0))) - - ((looking-at (concat "\\$" phps-mode-lexer-LABEL "->" "[a-zA-Z_\x80-\xff]")) - (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_LOOKING_FOR_PROPERTY) - (forward-char -3) - (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (- (match-end 0) 3))) - - ((looking-at (concat "\\$" phps-mode-lexer-LABEL "\\[")) - (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_VAR_OFFSET) - (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (match-end 0))) - - ((looking-at (concat "\\$" phps-mode-lexer-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (match-end 0))) - - ((looking-at (concat "{\\$")) - (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_IN_SCRIPTING) - (phps-mode-lexer-RETURN_TOKEN 'T_CURLY_OPEN (match-beginning 0) (- (match-end 0) 1))) - - ((looking-at phps-mode-lexer-ANY_CHAR) - ;; (message "Found nothing useful at '%s' looking at {$ %s" (buffer-substring-no-properties (point) (point-max)) (looking-at "{\\$")) - ;; 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) + ;; ST_HEREDOC + ((= phps-mode-lexer-STATE phps-mode-lexer-ST_HEREDOC) + + (let ((heredoc_label (car phps-mode-lexer-heredoc_label_stack)) + (old-start (point))) + (cond + + ((looking-at "\\${") + (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_LOOKING_FOR_VARNAME) + (phps-mode-lexer-RETURN_TOKEN 'T_DOLLAR_OPEN_CURLY_BRACES (match-beginning 0) (match-end 0))) + + ((looking-at (concat "\\$" phps-mode-lexer-LABEL "->" "[a-zA-Z_\x80-\xff]")) + (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_LOOKING_FOR_PROPERTY) + (forward-char -3) + (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (- (match-end 0) 3))) + + ((looking-at (concat "\\$" phps-mode-lexer-LABEL "\\[")) + (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_VAR_OFFSET) + (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (match-end 0))) + + ((looking-at (concat "\\$" phps-mode-lexer-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (match-end 0))) + + ((looking-at (concat "{\\$")) + (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_IN_SCRIPTING) + (phps-mode-lexer-RETURN_TOKEN 'T_CURLY_OPEN (match-beginning 0) (- (match-end 0) 1))) + + ((looking-at phps-mode-lexer-ANY_CHAR) + ;; (message "Found nothing useful at '%s' looking at {$ %s" (buffer-substring-no-properties (point) (point-max)) (looking-at "{\\$")) + ;; 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 phps-mode-lexer-ST_END_HEREDOC) - (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE old-start start)) + (phps-mode-lexer-BEGIN phps-mode-lexer-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) - ) + (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 - ;; (message "Found no ending of heredoc at %s '%s'" heredoc_label (buffer-substring-no-properties (point) (point-max))) - (phps-mode-lexer-RETURN_TOKEN 'T_ERROR old-start (point-max)) - (phps-mode-lexer-MOVE_FORWARD (point-max)) - )))) - - ))) - -(define-lex-analyzer phps-mode-lexer-lex--ST_NOWDOC " -ANY_CHAR' -" - (= phps-mode-lexer-STATE phps-mode-lexer-ST_NOWDOC) - - (let ((heredoc_label (car phps-mode-lexer-heredoc_label_stack)) - (old-start (point))) - (cond - - ((looking-at phps-mode-lexer-ANY_CHAR) - (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 phps-mode-lexer-ST_END_HEREDOC) - (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE old-start start) - ) - (progn - ;; (message "Found no ending of nowdoc at %s '%s'" heredoc_label (buffer-substring-no-properties (point) (point-max))) - (phps-mode-lexer-RETURN_TOKEN 'T_ERROR old-start (point-max)) - (phps-mode-lexer-MOVE_FORWARD (point-max)) - )))) - ))) - -(define-lex-analyzer phps-mode-lexer-lex--ST_LOOKING_FOR_VARNAME " -{LABEL}[[}] -{ANY_CHAR}" - (= phps-mode-lexer-STATE phps-mode-lexer-ST_LOOKING_FOR_VARNAME) - (cond + )) + (progn + ;; (message "Found no ending of heredoc at %s '%s'" heredoc_label (buffer-substring-no-properties (point) (point-max))) + (phps-mode-lexer-RETURN_TOKEN 'T_ERROR old-start (point-max)) + (phps-mode-lexer-MOVE_FORWARD (point-max)) + )))) - ((looking-at (concat phps-mode-lexer-LABEL "[\\[}]")) - (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 phps-mode-lexer-ST_IN_SCRIPTING) - (phps-mode-lexer-RETURN_TOKEN 'T_STRING_VARNAME start end))) + ))) - ((looking-at phps-mode-lexer-ANY_CHAR) - (phps-mode-lexer-yy_pop_state) - (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_IN_SCRIPTING)) + ;; ST_NOWDOC + ((= phps-mode-lexer-STATE phps-mode-lexer-ST_NOWDOC) - )) + (let ((heredoc_label (car phps-mode-lexer-heredoc_label_stack)) + (old-start (point))) + (cond -(define-lex-analyzer phps-mode-lexer-lex--ST_END_HEREDOC " -{ANY_CHAR}" - (= phps-mode-lexer-STATE phps-mode-lexer-ST_END_HEREDOC) - (let ((heredoc_label (car phps-mode-lexer-heredoc_label_stack))) - (cond + ((looking-at phps-mode-lexer-ANY_CHAR) + (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 phps-mode-lexer-ST_END_HEREDOC) + (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE old-start start) + ) + (progn + ;; (message "Found no ending of nowdoc at %s '%s'" heredoc_label (buffer-substring-no-properties (point) (point-max))) + (phps-mode-lexer-RETURN_TOKEN 'T_ERROR old-start (point-max)) + (phps-mode-lexer-MOVE_FORWARD (point-max)) + )))) + ))) - ((looking-at (concat phps-mode-lexer-ANY_CHAR)) + ;; ST_LOOKING_FOR_VARNAME + ((= phps-mode-lexer-STATE phps-mode-lexer-ST_LOOKING_FOR_VARNAME) + (cond - (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 phps-mode-lexer-ST_IN_SCRIPTING) - (phps-mode-lexer-RETURN_TOKEN 'T_END_HEREDOC start end) + ((looking-at (concat phps-mode-lexer-LABEL "[\\[}]")) + (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 phps-mode-lexer-ST_IN_SCRIPTING) + (phps-mode-lexer-RETURN_TOKEN 'T_STRING_VARNAME start end))) - )) + ((looking-at phps-mode-lexer-ANY_CHAR) + (phps-mode-lexer-yy_pop_state) + (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_IN_SCRIPTING)) - ))) + )) -(define-lex-analyzer phps-mode-lexer-lex--ST_VAR_OFFSET " -[0]|([1-9][0-9]*) -{LNUM}|{HNUM}|{BNUM} -\"$\"{LABEL} -] -{TOKENS}|[{}\"`] -[ \n\r\t\\'#] -{LABEL} -{ANY_CHAR} -" - (= phps-mode-lexer-STATE phps-mode-lexer-ST_VAR_OFFSET) + ;; ST_END_HEREDOC + ((= phps-mode-lexer-STATE phps-mode-lexer-ST_END_HEREDOC) + (let ((heredoc_label (car phps-mode-lexer-heredoc_label_stack))) + (cond - (cond + ((looking-at (concat phps-mode-lexer-ANY_CHAR)) - ((looking-at (concat "\\(" - phps-mode-lexer-LNUM "\\|" - phps-mode-lexer-HNUM "\\|" - phps-mode-lexer-BNUM "\\)")) - (phps-mode-lexer-RETURN_TOKEN 'T_NUM_STRING (match-beginning 0) (match-end 0))) + (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 phps-mode-lexer-ST_IN_SCRIPTING) + (phps-mode-lexer-RETURN_TOKEN 'T_END_HEREDOC start end) - ((looking-at (concat "\\$" phps-mode-lexer-LABEL)) - (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (match-end 0))) + )) - ((looking-at "\\]") - (phps-mode-lexer-yy_pop_state) - (phps-mode-lexer-RETURN_TOKEN "]" (match-beginning 0) (match-end 0))) + ))) - ((looking-at (concat "\\(" phps-mode-lexer-TOKENS - "\\|[{}\"`]\\)")) - (let* ((start (match-beginning 0)) - (end (match-end 0)) - (data (buffer-substring-no-properties start end))) - (phps-mode-lexer-RETURN_TOKEN data start end))) + ;; ST_VAR_OFFSET + ((= phps-mode-lexer-STATE phps-mode-lexer-ST_VAR_OFFSET) - ((looking-at (concat "[ \n\r\t'#]")) - (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))) + (cond - ((looking-at phps-mode-lexer-LABEL) - (phps-mode-lexer-RETURN_TOKEN 'T_STRING (match-beginning 0) (match-end 0))) + ((looking-at (concat "\\(" + phps-mode-lexer-LNUM "\\|" + phps-mode-lexer-HNUM "\\|" + phps-mode-lexer-BNUM "\\)")) + (phps-mode-lexer-RETURN_TOKEN 'T_NUM_STRING (match-beginning 0) (match-end 0))) - ((looking-at phps-mode-lexer-ANY_CHAR) - ;; Unexpected character - (phps-mode-lexer-RETURN_TOKEN 'T_ERROR (match-beginning 0) (point-max)) - (phps-mode-lexer-MOVE_FORWARD (point-max))) + ((looking-at (concat "\\$" phps-mode-lexer-LABEL)) + (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (match-end 0))) - )) + ((looking-at "\\]") + (phps-mode-lexer-yy_pop_state) + (phps-mode-lexer-RETURN_TOKEN "]" (match-beginning 0) (match-end 0))) + + ((looking-at (concat "\\(" phps-mode-lexer-TOKENS + "\\|[{}\"`]\\)")) + (let* ((start (match-beginning 0)) + (end (match-end 0)) + (data (buffer-substring-no-properties start end))) + (phps-mode-lexer-RETURN_TOKEN data start end))) + + ((looking-at (concat "[ \n\r\t'#]")) + (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))) + + ((looking-at phps-mode-lexer-LABEL) + (phps-mode-lexer-RETURN_TOKEN 'T_STRING (match-beginning 0) (match-end 0))) + + ((looking-at phps-mode-lexer-ANY_CHAR) + ;; Unexpected character + (phps-mode-lexer-RETURN_TOKEN 'T_ERROR (match-beginning 0) (point-max)) + (phps-mode-lexer-MOVE_FORWARD (point-max))) + + )))) + +(defun phps-mode-lexer-get-tokens () + "Get tokens." + phps-mode-lexer-tokens) + +(defun phps-mode-lexer--get-next-unescaped (character) + "Find where next un-escaped CHARACTER comes, if none is found return nil." + ;; (message "phps-mode-lexer--get-next-unescaped(%s)" character) + (let ((escaped nil) + (pos nil)) + (while (and (not pos) + (< (point) (point-max))) + (progn + ;; (message "Setting forward one %s vs %s" (point) (point-max)) + (forward-char) + (if (and (not escaped) + (looking-at-p character)) + (setq pos (1+ (point))) + (if (looking-at-p "\\\\") + (setq escaped (not escaped)) + (setq escaped nil))))) + pos)) (defun phps-mode-lexer-setup (start end) "Just prepare other lexers for lexing region START to END." @@ -1418,27 +1377,16 @@ ANY_CHAR' (phps-mode-lexer-run))) (phps-mode-functions-reset-buffer-changes-start))) -(define-lex phps-mode-lexer-tags-lexer - "Lexer that handles PHP buffers." - - phps-mode-lexer-lex--INITIAL - phps-mode-lexer-lex--ST_IN_SCRIPTING - phps-mode-lexer-lex--ST_LOOKING_FOR_PROPERTY - phps-mode-lexer-lex--ST_DOUBLE_QUOTES - phps-mode-lexer-lex--ST_BACKQUOTE - phps-mode-lexer-lex--ST_HEREDOC - phps-mode-lexer-lex--ST_NOWDOC - phps-mode-lexer-lex--ST_LOOKING_FOR_VARNAME - phps-mode-lexer-lex--ST_END_HEREDOC - phps-mode-lexer-lex--ST_VAR_OFFSET - +(define-lex phps-mode-lexer-lex + "Call lexer analyzer action." + phps-mode-lexer-lex-analyzer semantic-lex-default-action) (defun phps-mode-lexer-init () "Initialize lexer." (when (boundp 'phps-mode-syntax-table) (setq semantic-lex-syntax-table phps-mode-syntax-table)) - (setq semantic-lex-analyzer #'phps-mode-lexer-tags-lexer) + (setq semantic-lex-analyzer #'phps-mode-lexer-lex) (add-hook 'semantic-lex-reset-functions #'phps-mode-lexer-setup) (phps-mode-lexer-run))