branch: externals/phps-mode commit 4f936cd5cdf33478cce0fe391150466e39c7564d Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Fixed byte-compilation issue with new lexer rules --- phps-mode-lexer.el | 2946 ++++++++++++++++++++++++++-------------------------- 1 file changed, 1484 insertions(+), 1462 deletions(-) diff --git a/phps-mode-lexer.el b/phps-mode-lexer.el index 66bd2f8c7d..e9416398e4 100644 --- a/phps-mode-lexer.el +++ b/phps-mode-lexer.el @@ -116,7 +116,24 @@ ;; VARIABLES -(defvar phps-mode-lexer--lambdas-by-state (make-hash-table :test 'equal) +(defvar phps-mode-lexer--lambdas-by-state #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8125 data (ST_IN_SCRIPTING ((lambda nil (when (looking-at "exit") (let ((match-end (match-end 0)) (match-beginning (match-beginning 0))) (let ((matching-length (- match-end match-beginning))) (when (> matching-length 0) (when (or (not phps-mode-lexer--match-length) (> matching-length phps-mode-lexer--match-length)) (setq phps-mode-lexer--match-length matching-length) (setq phps-m [...] +]*" "\\(\\$\\|\\.\\.\\.\\)")) (let ((match-end (match-end 0)) (match-beginning (match-beginning 0))) (let ((matching-length (- match-end match-beginning))) (when (> matching-length 0) (when (or (not phps-mode-lexer--match-length) (> matching-length phps-mode-lexer--match-length)) (setq phps-mode-lexer--match-length matching-length) (setq phps-mode-lexer--match-body (lambda nil (phps-mode-lexer--yyless 1) (phps-mode-lexer--return-token 'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG (match-beginni [...] + ]*(")) (let ((match-end (match-end 0)) (match-beginning (match-beginning 0))) (let ((matching-length (- match-end match-beginning))) (when (> matching-length 0) (when (or (not phps-mode-lexer--match-length) (> matching-length phps-mode-lexer--match-length)) (setq phps-mode-lexer--match-length matching-length) (setq phps-mode-lexer--match-body (lambda nil (phps-mode-lexer--yyless (length "readonly")) (phps-mode-lexer--return-token-with-indent 'T_READONLY))) (setq phps-mode-lexer--match-da [...] +]*" "\\(\\$\\|\\.\\.\\.\\)")) (let ((match-end (match-end 0)) (match-beginning (match-beginning 0))) (let ((matching-length (- match-end match-beginning))) (when (> matching-length 0) (when (or (not phps-mode-lexer--match-length) (> matching-length phps-mode-lexer--match-length)) (setq phps-mode-lexer--match-length matching-length) (setq phps-mode-lexer--match-body (lambda nil (phps-mode-lexer--yyless 1) (phps-mode-lexer--return-token 'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG (match-beginni [...] +" phps-mode-lexer--heredoc-label ";? +\\|\\$" 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))) (cond ((string-match (concat " +" phps-mode-lexer--heredoc-label ";? +") data) (phps-mode-lexer--return-token-with-val 'T_ENCAPSED_AND_WHITESPACE old-end start) (phps-mode-lexer--begin 'ST_END_HEREDOC)) (t (phps-mode-lexer--return-token-with-val 'T_ENCAPSED_AND_WHITESPACE old-end start)))) (progn (signal 'phps-lexer-error (list (format "Found no ending of heredoc starting at %d" old-start) old-start)))))))) (setq phps-mode-lexer--match-data (match-data)))))))) (lambda nil (when (looking-at "\\${") (let ((match-end (match-end 0)) (match-beginning (match-beg [...] +" phps-mode-lexer--heredoc-label ";? +\\|\\$" 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))) (cond ((string-match (concat " +" phps-mode-lexer--heredoc-label ";? +") data) (phps-mode-lexer--return-token-with-val 'T_ENCAPSED_AND_WHITESPACE old-end start) (phps-mode-lexer--begin 'ST_END_HEREDOC)) (t (phps-mode-lexer--return-token-with-val 'T_ENCAPSED_AND_WHITESPACE old-end start)))) (progn (signal 'phps-lexer-error (list (format "Found no ending of heredoc starting at %d" old-start) old-start)))))))) (setq phps-mode-lexer--match-data (match-data))))))))) ST_LOOKING_FOR_VARNAME ((lambda nil (when (looking-at (concat phps-mode-lexer--label "[\\[}]")) [...] + '#]")) (let ((match-end (match-end 0)) (match-beginning (match-beginning 0))) (let ((matching-length (- match-end match-beginning))) (when (> matching-length 0) (when (or (not phps-mode-lexer--match-length) (> matching-length phps-mode-lexer--match-length)) (setq phps-mode-lexer--match-length matching-length) (setq phps-mode-lexer--match-body (lambda nil (phps-mode-lexer--yyless 0) (phps-mode-lexer--yy-pop-state) (phps-mode-lexer--return-token-with-val 'T_ENCAPSED_AND_WHITESPACE))) (setq [...] + '#]")) (let ((match-end (match-end 0)) (match-beginning (match-beginning 0))) (let ((matching-length (- match-end match-beginning))) (when (> matching-length 0) (when (or (not phps-mode-lexer--match-length) (> matching-length phps-mode-lexer--match-length)) (setq phps-mode-lexer--match-length matching-length) (setq phps-mode-lexer--match-body (lambda nil (phps-mode-lexer--yyless 0) (phps-mode-lexer--yy-pop-state) (phps-mode-lexer--return-token-with-val 'T_ENCAPSED_AND_WHITESPACE))) (setq [...] +" phps-mode-lexer--heredoc-label ";?\\ +") nil t))) (if string-start (let* ((start (match-beginning 0)) (end (match-end 0)) (_data (buffer-substring-no-properties start end))) (phps-mode-lexer--return-token-with-val 'T_ENCAPSED_AND_WHITESPACE phps-mode-lexer--generated-new-tokens-index start) (phps-mode-lexer--begin 'ST_END_HEREDOC)) (progn (signal 'phps-lexer-error (list (format "Found no ending of nowdoc starting at %d" start) start)))))))) (setq phps-mode-lexer--match-data (match-data)))))))) (lambda nil (when (looking-at p [...] +" phps-mode-lexer--heredoc-label ";?\\ +") nil t))) (if string-start (let* ((start (match-beginning 0)) (end (match-end 0)) (_data (buffer-substring-no-properties start end))) (phps-mode-lexer--return-token-with-val 'T_ENCAPSED_AND_WHITESPACE phps-mode-lexer--generated-new-tokens-index start) (phps-mode-lexer--begin 'ST_END_HEREDOC)) (progn (signal 'phps-lexer-error (list (format "Found no ending of nowdoc starting at %d" start) start)))))))) (setq phps-mode-lexer--match-data (match-data))))))))))) "Hash-table of lex-analyzer rules organized by state.") (defvar-local phps-mode-lexer--generated-tokens nil @@ -484,1502 +501,1507 @@ ;; Setup lexer rules -(eval-when-compile - (setq phps-mode-lexer--lambdas-by-state (make-hash-table :test 'equal))) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "exit") - (phps-mode-lexer--return-token-with-indent 'T_EXIT)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "die") - (phps-mode-lexer--return-token-with-indent 'T_EXIT)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "fn") - (phps-mode-lexer--return-token-with-indent 'T_FN)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "function") - (phps-mode-lexer--return-token-with-indent 'T_FUNCTION)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "const") - (phps-mode-lexer--return-token-with-indent 'T_CONST)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "return") - (phps-mode-lexer--return-token-with-indent 'T_RETURN)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "#\\[") - (phps-mode-lexer--enter-nesting "[") - (phps-mode-lexer--return-token 'T_ATTRIBUTE)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at - (concat - "yield" - phps-mode-lexer--whitespace - "from" - "[^a-zA-Z0-9_\x80-\xff]")) - (phps-mode-lexer--return-token-with-indent 'T_YIELD_FROM)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "yield") - (phps-mode-lexer--return-token-with-indent 'T_YIELD)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "try") - (phps-mode-lexer--return-token-with-indent 'T_TRY)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "catch") - (phps-mode-lexer--return-token-with-indent 'T_CATCH)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "finally") - (phps-mode-lexer--return-token-with-indent 'T_FINALLY)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "throw") - (phps-mode-lexer--return-token-with-indent 'T_THROW)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "if") - (phps-mode-lexer--return-token-with-indent 'T_IF)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "elseif") - (phps-mode-lexer--return-token-with-indent 'T_ELSEIF)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "endif") - (phps-mode-lexer--return-token-with-indent 'T_ENDIF)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "else") - (phps-mode-lexer--return-token-with-indent 'T_ELSE)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "while") - (phps-mode-lexer--return-token-with-indent 'T_WHILE)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "endwhile") - (phps-mode-lexer--return-token-with-indent 'T_ENDWHILE)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "do") - (phps-mode-lexer--return-token-with-indent 'T_DO)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "for") - (phps-mode-lexer--return-token-with-indent 'T_FOR)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "endfor") - (phps-mode-lexer--return-token-with-indent 'T_ENDFOR)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "foreach") - (phps-mode-lexer--return-token-with-indent 'T_FOREACH)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "endforeach") - (phps-mode-lexer--return-token-with-indent 'T_ENDFOREACH)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "declare") - (phps-mode-lexer--return-token-with-indent 'T_DECLARE)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "enddeclare") - (phps-mode-lexer--return-token-with-indent 'T_ENDDECLARE)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "instanceof") - (phps-mode-lexer--return-token-with-indent 'T_INSTANCEOF)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "as") - (phps-mode-lexer--return-token-with-indent 'T_AS)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "switch") - (phps-mode-lexer--return-token-with-indent 'T_SWITCH)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "match") - (phps-mode-lexer--return-token-with-indent 'T_MATCH)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "endswitch") - (phps-mode-lexer--return-token-with-indent 'T_ENDSWITCH)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "case") - (phps-mode-lexer--return-token-with-indent 'T_CASE)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "default") - (phps-mode-lexer--return-token-with-indent 'T_DEFAULT)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "break") - (phps-mode-lexer--return-token-with-indent 'T_BREAK)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "continue") - (phps-mode-lexer--return-token-with-indent 'T_CONTINUE)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "goto") - (phps-mode-lexer--return-token-with-indent 'T_GOTO)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "echo") - (phps-mode-lexer--return-token-with-indent 'T_ECHO)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "print") - (phps-mode-lexer--return-token-with-indent 'T_PRINT)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "class") - (phps-mode-lexer--return-token-with-indent 'T_CLASS)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "interface") - (phps-mode-lexer--return-token-with-indent 'T_INTERFACE)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "trait") - (phps-mode-lexer--return-token-with-indent 'T_TRAIT)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at (concat "enum" phps-mode-lexer--whitespace "[a-zA-Z_\x80-\xff]")) - (phps-mode-lexer--yyless 4) - (phps-mode-lexer--return-token-with-indent 'T_ENUM)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "extends") - (phps-mode-lexer--return-token-with-indent 'T_EXTENDS)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "implements") - (phps-mode-lexer--return-token-with-indent 'T_IMPLEMENTS)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "->") - (phps-mode-lexer--yy-push-state 'ST_LOOKING_FOR_PROPERTY) - (phps-mode-lexer--return-token-with-indent 'T_OBJECT_OPERATOR)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "?->") - (phps-mode-lexer--yy-push-state 'ST_LOOKING_FOR_PROPERTY) - (phps-mode-lexer--return-token-with-indent 'T_NULLSAFE_OBJECT_OPERATOR)) - -(phps-mode-lexer--match-macro - (ST_IN_SCRIPTING ST_LOOKING_FOR_PROPERTY) - (looking-at phps-mode-lexer--whitespace) - (phps-mode-lexer--return-whitespace)) - -(phps-mode-lexer--match-macro - ST_LOOKING_FOR_PROPERTY - (looking-at "->") - (phps-mode-lexer--return-token 'T_OBJECT_OPERATOR)) - -(phps-mode-lexer--match-macro - ST_LOOKING_FOR_PROPERTY - (looking-at "?->") - (phps-mode-lexer--return-token 'T_NULLSAFE_OBJECT_OPERATOR)) - -(phps-mode-lexer--match-macro - ST_LOOKING_FOR_PROPERTY - (looking-at phps-mode-lexer--label) - (phps-mode-lexer--yy-pop-state) - (phps-mode-lexer--return-token-with-str 'T_STRING 0)) - -(phps-mode-lexer--match-macro - ST_LOOKING_FOR_PROPERTY - (looking-at phps-mode-lexer--any-char) - (phps-mode-lexer--yyless 0) - (phps-mode-lexer--yy-pop-state) - (phps-mode-lexer--restart)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "::") - (phps-mode-lexer--return-token 'T_PAAMAYIM_NEKUDOTAYIM)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "\\.\\.\\.") - (phps-mode-lexer--return-token 'T_ELLIPSIS)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "\\?\\?") - (phps-mode-lexer--return-token 'T_COALESCE)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "new") - (phps-mode-lexer--return-token-with-indent 'T_NEW)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "clone") - (phps-mode-lexer--return-token-with-indent 'T_CLONE)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "var") - (phps-mode-lexer--return-token-with-indent 'T_VAR)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at - (concat - "(" - phps-mode-lexer--tabs-and-spaces - "\\(int\\|integer\\)" - phps-mode-lexer--tabs-and-spaces - ")")) - (phps-mode-lexer--return-token 'T_INT_CAST)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at - (concat - "(" - phps-mode-lexer--tabs-and-spaces - "\\(double\\|float\\)" - phps-mode-lexer--tabs-and-spaces - ")")) - (phps-mode-lexer--return-token 'T_DOUBLE_CAST)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at - (concat - "(" - phps-mode-lexer--tabs-and-spaces - "\\(real\\)" - phps-mode-lexer--tabs-and-spaces - ")")) - (when (phps-mode-lexer--parser-mode) - (signal - 'phps-lexer-error - (list - (format - "The (real) cast has been removed, use (float) instead at %d" - (match-beginning 0)) - (match-beginning 0) - (match-end 0)))) - (phps-mode-lexer--return-token 'T_DOUBLE_CAST)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (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)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at - (concat - "(" - phps-mode-lexer--tabs-and-spaces - "array" - phps-mode-lexer--tabs-and-spaces - ")")) - (phps-mode-lexer--return-token 'T_ARRAY_CAST)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at - (concat - "(" - phps-mode-lexer--tabs-and-spaces - "object" - phps-mode-lexer--tabs-and-spaces - ")")) - (phps-mode-lexer--return-token 'T_OBJECT_CAST)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at - (concat - "(" - phps-mode-lexer--tabs-and-spaces - "\\(bool\\|boolean\\)" - phps-mode-lexer--tabs-and-spaces - ")")) - (phps-mode-lexer--return-token 'T_BOOL_CAST)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at - (concat - "(" - phps-mode-lexer--tabs-and-spaces - "unset" - phps-mode-lexer--tabs-and-spaces ")")) - (phps-mode-lexer--return-token 'T_UNSET_CAST)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "eval") - (phps-mode-lexer--return-token-with-indent 'T_EVAL)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "include") - (phps-mode-lexer--return-token-with-indent 'T_INCLUDE)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "include_once") - (phps-mode-lexer--return-token-with-indent 'T_INCLUDE_ONCE)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "require") - (phps-mode-lexer--return-token-with-indent 'T_REQUIRE)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "require_once") - (phps-mode-lexer--return-token-with-indent 'T_REQUIRE_ONCE)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "namespace") - (phps-mode-lexer--return-token-with-indent 'T_NAMESPACE)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "use") - (phps-mode-lexer--return-token-with-indent 'T_USE)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "insteadof") - (phps-mode-lexer--return-token-with-indent 'T_INSTEADOF)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "global") - (phps-mode-lexer--return-token-with-indent 'T_GLOBAL)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "isset") - (phps-mode-lexer--return-token-with-indent 'T_ISSET)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "empty") - (phps-mode-lexer--return-token-with-indent 'T_EMPTY)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "__halt_compiler") - (phps-mode-lexer--return-token-with-indent 'T_HALT_COMPILER)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "static") - (phps-mode-lexer--return-token-with-indent 'T_STATIC)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "abstract") - (phps-mode-lexer--return-token-with-indent 'T_ABSTRACT)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "final") - (phps-mode-lexer--return-token-with-indent 'T_FINAL)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "private") - (phps-mode-lexer--return-token-with-indent 'T_PRIVATE)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "protected") - (phps-mode-lexer--return-token-with-indent 'T_PROTECTED)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "public") - (phps-mode-lexer--return-token-with-indent 'T_PUBLIC)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "readonly") - (phps-mode-lexer--return-token-with-indent 'T_READONLY)) - -;; Don't treat "readonly(" as a keyword, to allow using it as a function name. -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at (concat "readonly" "[ \n\r\t]*(")) - (phps-mode-lexer--yyless (length "readonly")) - (phps-mode-lexer--return-token-with-indent 'T_READONLY)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "unset") - (phps-mode-lexer--return-token-with-indent 'T_UNSET)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "=>") - (phps-mode-lexer--return-token 'T_DOUBLE_ARROW)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "list") - (phps-mode-lexer--return-token-with-indent 'T_LIST)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "array") - (phps-mode-lexer--return-token-with-indent 'T_ARRAY)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "callable") - (phps-mode-lexer--return-token-with-indent 'T_CALLABLE)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "\\+\\+") - (phps-mode-lexer--return-token 'T_INC)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "--") - (phps-mode-lexer--return-token 'T_DEC)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "===") - (phps-mode-lexer--return-token 'T_IS_IDENTICAL)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "!==") - (phps-mode-lexer--return-token 'T_IS_NOT_IDENTICAL)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "==") - (phps-mode-lexer--return-token 'T_IS_EQUAL)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "\\(!=\\|<>\\)") - (phps-mode-lexer--return-token 'T_IS_NOT_EQUAL)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "<=>") - (phps-mode-lexer--return-token 'T_SPACESHIP)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "<=") - (phps-mode-lexer--return-token 'T_IS_SMALLER_OR_EQUAL)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at ">=") - (phps-mode-lexer--return-token 'T_IS_GREATER_OR_EQUAL)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "\\+=") - (phps-mode-lexer--return-token 'T_PLUS_EQUAL)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "-=") - (phps-mode-lexer--return-token 'T_MINUS_EQUAL)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "\\*=") - (phps-mode-lexer--return-token 'T_MUL_EQUAL)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "\\*\\\\\\*") - (phps-mode-lexer--return-token 'T_POW)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "\\*\\\\\\*=") - (phps-mode-lexer--return-token 'T_POW_EQUAL)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "/=") - (phps-mode-lexer--return-token 'T_DIV_EQUAL)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "\\.=") - (phps-mode-lexer--return-token 'T_CONCAT_EQUAL)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "%=") - (phps-mode-lexer--return-token 'T_MOD_EQUAL)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "<<=") - (phps-mode-lexer--return-token 'T_SL_EQUAL)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at ">>=") - (phps-mode-lexer--return-token 'T_SR_EQUAL)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "&=") - (phps-mode-lexer--return-token 'T_AND_EQUAL)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "|=") - (phps-mode-lexer--return-token 'T_OR_EQUAL)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "\\^=") - (phps-mode-lexer--return-token 'T_XOR_EQUAL)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "\\?\\?=") - (phps-mode-lexer--return-token 'T_COALESCE_EQUAL)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "||") - (phps-mode-lexer--return-token 'T_BOOLEAN_OR)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "&&") - (phps-mode-lexer--return-token 'T_BOOLEAN_AND)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "OR") - (phps-mode-lexer--return-token 'T_LOGICAL_OR)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "AND") - (phps-mode-lexer--return-token 'T_LOGICAL_AND)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "XOR") - (phps-mode-lexer--return-token 'T_LOGICAL_XOR)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "<<") - (phps-mode-lexer--return-token 'T_SL)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at ">>") - (phps-mode-lexer--return-token 'T_SR)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at (concat "&" "[ \t\r\n]*" "\\(\\$\\|\\.\\.\\.\\)")) - (phps-mode-lexer--yyless 1) - (phps-mode-lexer--return-token - 'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG - (match-beginning 0) - (- (match-end 0) 1))) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "&") - (phps-mode-lexer--return-token 'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at - (concat "\\(" "]" "\\|" ")" "\\)")) - (phps-mode-lexer--return-exit-nesting-token)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at - (concat "\\(" "\\[" "\\|" "(" "\\)")) - (phps-mode-lexer--enter-nesting) - (phps-mode-lexer--return-token)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at phps-mode-lexer--tokens) - (phps-mode-lexer--return-token)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "{") - (phps-mode-lexer--yy-push-state 'ST_IN_SCRIPTING) - (phps-mode-lexer--enter-nesting "{") - (phps-mode-lexer--return-token)) - -(phps-mode-lexer--match-macro - (ST_DOUBLE_QUOTES ST_BACKQUOTE ST_HEREDOC) - (looking-at "\\${") - (phps-mode-lexer--yy-push-state 'ST_LOOKING_FOR_VARNAME) - (phps-mode-lexer--enter-nesting "{") - (phps-mode-lexer--return-token 'T_DOLLAR_OPEN_CURLY_BRACES)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "}") - (phps-mode-lexer--reset-doc-comment) - (when phps-mode-lexer--state-stack - (phps-mode-lexer--yy-pop-state)) - (phps-mode-lexer--return-exit-nesting-token)) - -(phps-mode-lexer--match-macro - ST_LOOKING_FOR_VARNAME - (looking-at (concat phps-mode-lexer--label "[\\[}]")) - (let* ((start (match-beginning 0)) - (end (1- (match-end 0))) - (_data (buffer-substring-no-properties start end))) + +(defun phps-mode-lexer--generate-lexer-rules () + "Generate lexer rules." + (eval-when-compile + (setq phps-mode-lexer--lambdas-by-state (make-hash-table :test 'equal))) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "exit") + (phps-mode-lexer--return-token-with-indent 'T_EXIT)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "die") + (phps-mode-lexer--return-token-with-indent 'T_EXIT)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "fn") + (phps-mode-lexer--return-token-with-indent 'T_FN)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "function") + (phps-mode-lexer--return-token-with-indent 'T_FUNCTION)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "const") + (phps-mode-lexer--return-token-with-indent 'T_CONST)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "return") + (phps-mode-lexer--return-token-with-indent 'T_RETURN)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "#\\[") + (phps-mode-lexer--enter-nesting "[") + (phps-mode-lexer--return-token 'T_ATTRIBUTE)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at + (concat + "yield" + phps-mode-lexer--whitespace + "from" + "[^a-zA-Z0-9_\x80-\xff]")) + (phps-mode-lexer--return-token-with-indent 'T_YIELD_FROM)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "yield") + (phps-mode-lexer--return-token-with-indent 'T_YIELD)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "try") + (phps-mode-lexer--return-token-with-indent 'T_TRY)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "catch") + (phps-mode-lexer--return-token-with-indent 'T_CATCH)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "finally") + (phps-mode-lexer--return-token-with-indent 'T_FINALLY)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "throw") + (phps-mode-lexer--return-token-with-indent 'T_THROW)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "if") + (phps-mode-lexer--return-token-with-indent 'T_IF)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "elseif") + (phps-mode-lexer--return-token-with-indent 'T_ELSEIF)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "endif") + (phps-mode-lexer--return-token-with-indent 'T_ENDIF)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "else") + (phps-mode-lexer--return-token-with-indent 'T_ELSE)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "while") + (phps-mode-lexer--return-token-with-indent 'T_WHILE)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "endwhile") + (phps-mode-lexer--return-token-with-indent 'T_ENDWHILE)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "do") + (phps-mode-lexer--return-token-with-indent 'T_DO)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "for") + (phps-mode-lexer--return-token-with-indent 'T_FOR)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "endfor") + (phps-mode-lexer--return-token-with-indent 'T_ENDFOR)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "foreach") + (phps-mode-lexer--return-token-with-indent 'T_FOREACH)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "endforeach") + (phps-mode-lexer--return-token-with-indent 'T_ENDFOREACH)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "declare") + (phps-mode-lexer--return-token-with-indent 'T_DECLARE)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "enddeclare") + (phps-mode-lexer--return-token-with-indent 'T_ENDDECLARE)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "instanceof") + (phps-mode-lexer--return-token-with-indent 'T_INSTANCEOF)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "as") + (phps-mode-lexer--return-token-with-indent 'T_AS)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "switch") + (phps-mode-lexer--return-token-with-indent 'T_SWITCH)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "match") + (phps-mode-lexer--return-token-with-indent 'T_MATCH)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "endswitch") + (phps-mode-lexer--return-token-with-indent 'T_ENDSWITCH)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "case") + (phps-mode-lexer--return-token-with-indent 'T_CASE)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "default") + (phps-mode-lexer--return-token-with-indent 'T_DEFAULT)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "break") + (phps-mode-lexer--return-token-with-indent 'T_BREAK)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "continue") + (phps-mode-lexer--return-token-with-indent 'T_CONTINUE)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "goto") + (phps-mode-lexer--return-token-with-indent 'T_GOTO)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "echo") + (phps-mode-lexer--return-token-with-indent 'T_ECHO)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "print") + (phps-mode-lexer--return-token-with-indent 'T_PRINT)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "class") + (phps-mode-lexer--return-token-with-indent 'T_CLASS)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "interface") + (phps-mode-lexer--return-token-with-indent 'T_INTERFACE)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "trait") + (phps-mode-lexer--return-token-with-indent 'T_TRAIT)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at (concat "enum" phps-mode-lexer--whitespace "[a-zA-Z_\x80-\xff]")) + (phps-mode-lexer--yyless 4) + (phps-mode-lexer--return-token-with-indent 'T_ENUM)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "extends") + (phps-mode-lexer--return-token-with-indent 'T_EXTENDS)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "implements") + (phps-mode-lexer--return-token-with-indent 'T_IMPLEMENTS)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "->") + (phps-mode-lexer--yy-push-state 'ST_LOOKING_FOR_PROPERTY) + (phps-mode-lexer--return-token-with-indent 'T_OBJECT_OPERATOR)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "?->") + (phps-mode-lexer--yy-push-state 'ST_LOOKING_FOR_PROPERTY) + (phps-mode-lexer--return-token-with-indent 'T_NULLSAFE_OBJECT_OPERATOR)) + + (phps-mode-lexer--match-macro + (ST_IN_SCRIPTING ST_LOOKING_FOR_PROPERTY) + (looking-at phps-mode-lexer--whitespace) + (phps-mode-lexer--return-whitespace)) + + (phps-mode-lexer--match-macro + ST_LOOKING_FOR_PROPERTY + (looking-at "->") + (phps-mode-lexer--return-token 'T_OBJECT_OPERATOR)) + + (phps-mode-lexer--match-macro + ST_LOOKING_FOR_PROPERTY + (looking-at "?->") + (phps-mode-lexer--return-token 'T_NULLSAFE_OBJECT_OPERATOR)) + + (phps-mode-lexer--match-macro + ST_LOOKING_FOR_PROPERTY + (looking-at phps-mode-lexer--label) + (phps-mode-lexer--yy-pop-state) + (phps-mode-lexer--return-token-with-str 'T_STRING 0)) + + (phps-mode-lexer--match-macro + ST_LOOKING_FOR_PROPERTY + (looking-at phps-mode-lexer--any-char) + (phps-mode-lexer--yyless 0) + (phps-mode-lexer--yy-pop-state) + (phps-mode-lexer--restart)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "::") + (phps-mode-lexer--return-token 'T_PAAMAYIM_NEKUDOTAYIM)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "\\.\\.\\.") + (phps-mode-lexer--return-token 'T_ELLIPSIS)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "\\?\\?") + (phps-mode-lexer--return-token 'T_COALESCE)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "new") + (phps-mode-lexer--return-token-with-indent 'T_NEW)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "clone") + (phps-mode-lexer--return-token-with-indent 'T_CLONE)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "var") + (phps-mode-lexer--return-token-with-indent 'T_VAR)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at + (concat + "(" + phps-mode-lexer--tabs-and-spaces + "\\(int\\|integer\\)" + phps-mode-lexer--tabs-and-spaces + ")")) + (phps-mode-lexer--return-token 'T_INT_CAST)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at + (concat + "(" + phps-mode-lexer--tabs-and-spaces + "\\(double\\|float\\)" + phps-mode-lexer--tabs-and-spaces + ")")) + (phps-mode-lexer--return-token 'T_DOUBLE_CAST)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at + (concat + "(" + phps-mode-lexer--tabs-and-spaces + "\\(real\\)" + phps-mode-lexer--tabs-and-spaces + ")")) + (when (phps-mode-lexer--parser-mode) + (signal + 'phps-lexer-error + (list + (format + "The (real) cast has been removed, use (float) instead at %d" + (match-beginning 0)) + (match-beginning 0) + (match-end 0)))) + (phps-mode-lexer--return-token 'T_DOUBLE_CAST)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (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)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at + (concat + "(" + phps-mode-lexer--tabs-and-spaces + "array" + phps-mode-lexer--tabs-and-spaces + ")")) + (phps-mode-lexer--return-token 'T_ARRAY_CAST)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at + (concat + "(" + phps-mode-lexer--tabs-and-spaces + "object" + phps-mode-lexer--tabs-and-spaces + ")")) + (phps-mode-lexer--return-token 'T_OBJECT_CAST)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at + (concat + "(" + phps-mode-lexer--tabs-and-spaces + "\\(bool\\|boolean\\)" + phps-mode-lexer--tabs-and-spaces + ")")) + (phps-mode-lexer--return-token 'T_BOOL_CAST)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at + (concat + "(" + phps-mode-lexer--tabs-and-spaces + "unset" + phps-mode-lexer--tabs-and-spaces ")")) + (phps-mode-lexer--return-token 'T_UNSET_CAST)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "eval") + (phps-mode-lexer--return-token-with-indent 'T_EVAL)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "include") + (phps-mode-lexer--return-token-with-indent 'T_INCLUDE)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "include_once") + (phps-mode-lexer--return-token-with-indent 'T_INCLUDE_ONCE)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "require") + (phps-mode-lexer--return-token-with-indent 'T_REQUIRE)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "require_once") + (phps-mode-lexer--return-token-with-indent 'T_REQUIRE_ONCE)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "namespace") + (phps-mode-lexer--return-token-with-indent 'T_NAMESPACE)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "use") + (phps-mode-lexer--return-token-with-indent 'T_USE)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "insteadof") + (phps-mode-lexer--return-token-with-indent 'T_INSTEADOF)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "global") + (phps-mode-lexer--return-token-with-indent 'T_GLOBAL)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "isset") + (phps-mode-lexer--return-token-with-indent 'T_ISSET)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "empty") + (phps-mode-lexer--return-token-with-indent 'T_EMPTY)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "__halt_compiler") + (phps-mode-lexer--return-token-with-indent 'T_HALT_COMPILER)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "static") + (phps-mode-lexer--return-token-with-indent 'T_STATIC)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "abstract") + (phps-mode-lexer--return-token-with-indent 'T_ABSTRACT)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "final") + (phps-mode-lexer--return-token-with-indent 'T_FINAL)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "private") + (phps-mode-lexer--return-token-with-indent 'T_PRIVATE)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "protected") + (phps-mode-lexer--return-token-with-indent 'T_PROTECTED)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "public") + (phps-mode-lexer--return-token-with-indent 'T_PUBLIC)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "readonly") + (phps-mode-lexer--return-token-with-indent 'T_READONLY)) + + ;; Don't treat "readonly(" as a keyword, to allow using it as a function name. + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at (concat "readonly" "[ \n\r\t]*(")) + (phps-mode-lexer--yyless (length "readonly")) + (phps-mode-lexer--return-token-with-indent 'T_READONLY)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "unset") + (phps-mode-lexer--return-token-with-indent 'T_UNSET)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "=>") + (phps-mode-lexer--return-token 'T_DOUBLE_ARROW)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "list") + (phps-mode-lexer--return-token-with-indent 'T_LIST)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "array") + (phps-mode-lexer--return-token-with-indent 'T_ARRAY)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "callable") + (phps-mode-lexer--return-token-with-indent 'T_CALLABLE)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "\\+\\+") + (phps-mode-lexer--return-token 'T_INC)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "--") + (phps-mode-lexer--return-token 'T_DEC)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "===") + (phps-mode-lexer--return-token 'T_IS_IDENTICAL)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "!==") + (phps-mode-lexer--return-token 'T_IS_NOT_IDENTICAL)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "==") + (phps-mode-lexer--return-token 'T_IS_EQUAL)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "\\(!=\\|<>\\)") + (phps-mode-lexer--return-token 'T_IS_NOT_EQUAL)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "<=>") + (phps-mode-lexer--return-token 'T_SPACESHIP)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "<=") + (phps-mode-lexer--return-token 'T_IS_SMALLER_OR_EQUAL)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at ">=") + (phps-mode-lexer--return-token 'T_IS_GREATER_OR_EQUAL)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "\\+=") + (phps-mode-lexer--return-token 'T_PLUS_EQUAL)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "-=") + (phps-mode-lexer--return-token 'T_MINUS_EQUAL)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "\\*=") + (phps-mode-lexer--return-token 'T_MUL_EQUAL)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "\\*\\\\\\*") + (phps-mode-lexer--return-token 'T_POW)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "\\*\\\\\\*=") + (phps-mode-lexer--return-token 'T_POW_EQUAL)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "/=") + (phps-mode-lexer--return-token 'T_DIV_EQUAL)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "\\.=") + (phps-mode-lexer--return-token 'T_CONCAT_EQUAL)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "%=") + (phps-mode-lexer--return-token 'T_MOD_EQUAL)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "<<=") + (phps-mode-lexer--return-token 'T_SL_EQUAL)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at ">>=") + (phps-mode-lexer--return-token 'T_SR_EQUAL)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "&=") + (phps-mode-lexer--return-token 'T_AND_EQUAL)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "|=") + (phps-mode-lexer--return-token 'T_OR_EQUAL)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "\\^=") + (phps-mode-lexer--return-token 'T_XOR_EQUAL)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "\\?\\?=") + (phps-mode-lexer--return-token 'T_COALESCE_EQUAL)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "||") + (phps-mode-lexer--return-token 'T_BOOLEAN_OR)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "&&") + (phps-mode-lexer--return-token 'T_BOOLEAN_AND)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "OR") + (phps-mode-lexer--return-token 'T_LOGICAL_OR)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "AND") + (phps-mode-lexer--return-token 'T_LOGICAL_AND)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "XOR") + (phps-mode-lexer--return-token 'T_LOGICAL_XOR)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "<<") + (phps-mode-lexer--return-token 'T_SL)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at ">>") + (phps-mode-lexer--return-token 'T_SR)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at (concat "&" "[ \t\r\n]*" "\\(\\$\\|\\.\\.\\.\\)")) (phps-mode-lexer--yyless 1) + (phps-mode-lexer--return-token + 'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG + (match-beginning 0) + (- (match-end 0) 1))) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "&") + (phps-mode-lexer--return-token 'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at + (concat "\\(" "]" "\\|" ")" "\\)")) + (phps-mode-lexer--return-exit-nesting-token)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at + (concat "\\(" "\\[" "\\|" "(" "\\)")) + (phps-mode-lexer--enter-nesting) + (phps-mode-lexer--return-token)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at phps-mode-lexer--tokens) + (phps-mode-lexer--return-token)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "{") + (phps-mode-lexer--yy-push-state 'ST_IN_SCRIPTING) + (phps-mode-lexer--enter-nesting "{") + (phps-mode-lexer--return-token)) + + (phps-mode-lexer--match-macro + (ST_DOUBLE_QUOTES ST_BACKQUOTE ST_HEREDOC) + (looking-at "\\${") + (phps-mode-lexer--yy-push-state 'ST_LOOKING_FOR_VARNAME) + (phps-mode-lexer--enter-nesting "{") + (phps-mode-lexer--return-token 'T_DOLLAR_OPEN_CURLY_BRACES)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "}") + (phps-mode-lexer--reset-doc-comment) + (when phps-mode-lexer--state-stack + (phps-mode-lexer--yy-pop-state)) + (phps-mode-lexer--return-exit-nesting-token)) + + (phps-mode-lexer--match-macro + ST_LOOKING_FOR_VARNAME + (looking-at (concat phps-mode-lexer--label "[\\[}]")) + (let* ((start (match-beginning 0)) + (end (1- (match-end 0))) + (_data (buffer-substring-no-properties start end))) + (phps-mode-lexer--yyless 1) + (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--match-macro + ST_LOOKING_FOR_VARNAME + (looking-at phps-mode-lexer--any-char) + (phps-mode-lexer--yyless 0) (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--match-macro - ST_LOOKING_FOR_VARNAME - (looking-at phps-mode-lexer--any-char) - (phps-mode-lexer--yyless 0) - (phps-mode-lexer--yy-pop-state) - (phps-mode-lexer--yy-push-state 'ST_IN_SCRIPTING) - (phps-mode-lexer--restart)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at phps-mode-lexer--bnum) - (let* ((start (match-beginning 0)) - (end (match-end 0)) - (data - (replace-regexp-in-string - "_" - "" - (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) - (phps-mode-lexer--return-token 'T_LNUMBER)))) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at phps-mode-lexer--onum) - (let* ((start (match-beginning 0)) - (end (match-end 0)) - (data (string-to-number - (replace-regexp-in-string - "_" - "" - (buffer-substring-no-properties start end)) - 8))) - (if (> data phps-mode-lexer--long-limit) - (phps-mode-lexer--return-token 'T_DNUMBER) - (phps-mode-lexer--return-token 'T_LNUMBER)))) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at phps-mode-lexer--lnum) - (let* ((start (match-beginning 0)) - (end (match-end 0)) - (data (string-to-number - (replace-regexp-in-string - "_" - "" - (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) - (phps-mode-lexer--return-token 'T_LNUMBER)))) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at phps-mode-lexer--hnum) - (let* ((start (match-beginning 0)) - (end (match-end 0)) - (data - (replace-regexp-in-string - "_" - "" - (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) - (phps-mode-lexer--return-token 'T_LNUMBER)))) - -(phps-mode-lexer--match-macro - ST_VAR_OFFSET - (looking-at "\\([0]\\|[1-9][0-9]*\\)") - (phps-mode-lexer--return-token 'T_NUM_STRING)) - -(phps-mode-lexer--match-macro - ST_VAR_OFFSET - (looking-at - (concat "\\(" - phps-mode-lexer--lnum "\\|" - phps-mode-lexer--hnum "\\|" - phps-mode-lexer--bnum "\\|" - phps-mode-lexer--onum "\\)")) - (phps-mode-lexer--return-token 'T_NUM_STRING)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (or (looking-at phps-mode-lexer--dnum) - (looking-at phps-mode-lexer--exponent-dnum)) - (phps-mode-lexer--return-token 'T_DNUMBER)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "__CLASS__") - (phps-mode-lexer--return-token-with-indent 'T_CLASS_C)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "__TRAIT__") - (phps-mode-lexer--return-token-with-indent 'T_TRAIT_C)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "__FUNCTION__") - (phps-mode-lexer--return-token-with-indent 'T_FUNC_C)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "__METHOD__") - (phps-mode-lexer--return-token-with-indent 'T_METHOD_C)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "__LINE__") - (phps-mode-lexer--return-token-with-indent 'T_LINE)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "__FILE__") - (phps-mode-lexer--return-token-with-indent 'T_FILE)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "__DIR__") - (phps-mode-lexer--return-token-with-indent 'T_DIR)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "__NAMESPACE__") - (phps-mode-lexer--return-token-with-indent 'T_NS_C)) - -(phps-mode-lexer--match-macro - 'SHEBANG - (looking-at (concat "#!.*" phps-mode-lexer--newline)) - (let ((lineno - (1+ - (phps-mode-lexer--CG 'zend_lineno)))) - (phps-mode-lexer--CG 'zend-lineno lineno)) - (phps-mode-lexer--begin 'ST_INITIAL) - (phps-mode-lexer--restart)) - -(phps-mode-lexer--match-macro - 'SHEBANG - (looking-at phps-mode-lexer--any-char) - (phps-mode-lexer--yyless 0) - (phps-mode-lexer--begin 'ST_INITIAL) - (phps-mode-lexer--restart)) - -(phps-mode-lexer--match-macro - ST_INITIAL - (looking-at "<\\?=") - (phps-mode-lexer--begin 'ST_IN_SCRIPTING) - (when (phps-mode-lexer--parser-mode) - (phps-mode-lexer--return-token-with-indent 'T_ECHO)) - (phps-mode-lexer--return-token 'T_OPEN_TAG_WITH_ECHO)) - -(phps-mode-lexer--match-macro - ST_INITIAL - (looking-at - (concat - "<\\?php\\([ \t]\\|" - phps-mode-lexer--newline - "\\)")) - (phps-mode-lexer--handle-newline) - (phps-mode-lexer--begin 'ST_IN_SCRIPTING) - (phps-mode-lexer--return-or-skip-token 'T_OPEN_TAG)) - -(phps-mode-lexer--match-macro - ST_INITIAL - (looking-at "<\\?php") - (let ((start (match-beginning 0)) - (end (match-end 0))) - - (cond - - ;; Allow <?php followed by end of file. - ((equal end (point-max)) - (phps-mode-lexer--begin 'ST_IN_SCRIPTING) - (phps-mode-lexer--return-or-skip-token 'T_OPEN_TAG)) + (phps-mode-lexer--restart)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at phps-mode-lexer--bnum) + (let* ((start (match-beginning 0)) + (end (match-end 0)) + (data + (replace-regexp-in-string + "_" + "" + (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) + (phps-mode-lexer--return-token 'T_LNUMBER)))) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at phps-mode-lexer--onum) + (let* ((start (match-beginning 0)) + (end (match-end 0)) + (data (string-to-number + (replace-regexp-in-string + "_" + "" + (buffer-substring-no-properties start end)) + 8))) + (if (> data phps-mode-lexer--long-limit) + (phps-mode-lexer--return-token 'T_DNUMBER) + (phps-mode-lexer--return-token 'T_LNUMBER)))) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at phps-mode-lexer--lnum) + (let* ((start (match-beginning 0)) + (end (match-end 0)) + (data (string-to-number + (replace-regexp-in-string + "_" + "" + (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) + (phps-mode-lexer--return-token 'T_LNUMBER)))) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at phps-mode-lexer--hnum) + (let* ((start (match-beginning 0)) + (end (match-end 0)) + (data + (replace-regexp-in-string + "_" + "" + (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) + (phps-mode-lexer--return-token 'T_LNUMBER)))) + + (phps-mode-lexer--match-macro + ST_VAR_OFFSET + (looking-at "\\([0]\\|[1-9][0-9]*\\)") + (phps-mode-lexer--return-token 'T_NUM_STRING)) + + (phps-mode-lexer--match-macro + ST_VAR_OFFSET + (looking-at + (concat "\\(" + phps-mode-lexer--lnum "\\|" + phps-mode-lexer--hnum "\\|" + phps-mode-lexer--bnum "\\|" + phps-mode-lexer--onum "\\)")) + (phps-mode-lexer--return-token 'T_NUM_STRING)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (or (looking-at phps-mode-lexer--dnum) + (looking-at phps-mode-lexer--exponent-dnum)) + (phps-mode-lexer--return-token 'T_DNUMBER)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "__CLASS__") + (phps-mode-lexer--return-token-with-indent 'T_CLASS_C)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "__TRAIT__") + (phps-mode-lexer--return-token-with-indent 'T_TRAIT_C)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "__FUNCTION__") + (phps-mode-lexer--return-token-with-indent 'T_FUNC_C)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "__METHOD__") + (phps-mode-lexer--return-token-with-indent 'T_METHOD_C)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "__LINE__") + (phps-mode-lexer--return-token-with-indent 'T_LINE)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "__FILE__") + (phps-mode-lexer--return-token-with-indent 'T_FILE)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "__DIR__") + (phps-mode-lexer--return-token-with-indent 'T_DIR)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "__NAMESPACE__") + (phps-mode-lexer--return-token-with-indent 'T_NS_C)) + + (phps-mode-lexer--match-macro + 'SHEBANG + (looking-at (concat "#!.*" phps-mode-lexer--newline)) + (let ((lineno + (1+ + (phps-mode-lexer--CG 'zend_lineno)))) + (phps-mode-lexer--CG 'zend-lineno lineno)) + (phps-mode-lexer--begin 'ST_INITIAL) + (phps-mode-lexer--restart)) - ;; Degenerate case: <?phpX is interpreted as <? phpX with short tags - ((phps-mode-lexer--CG 'short-tags) - (phps-mode-lexer--yyless 2) - (setq end (- end 2)) - (phps-mode-lexer--begin 'ST_IN_SCRIPTING) - (phps-mode-lexer--return-or-skip-token - 'T_OPEN_TAG - start - end)) + (phps-mode-lexer--match-macro + 'SHEBANG + (looking-at phps-mode-lexer--any-char) + (phps-mode-lexer--yyless 0) + (phps-mode-lexer--begin 'ST_INITIAL) + (phps-mode-lexer--restart)) + + (phps-mode-lexer--match-macro + ST_INITIAL + (looking-at "<\\?=") + (phps-mode-lexer--begin 'ST_IN_SCRIPTING) + (when (phps-mode-lexer--parser-mode) + (phps-mode-lexer--return-token-with-indent 'T_ECHO)) + (phps-mode-lexer--return-token 'T_OPEN_TAG_WITH_ECHO)) + + (phps-mode-lexer--match-macro + ST_INITIAL + (looking-at + (concat + "<\\?php\\([ \t]\\|" + phps-mode-lexer--newline + "\\)")) + (phps-mode-lexer--handle-newline) + (phps-mode-lexer--begin 'ST_IN_SCRIPTING) + (phps-mode-lexer--return-or-skip-token 'T_OPEN_TAG)) + + (phps-mode-lexer--match-macro + ST_INITIAL + (looking-at "<\\?php") + (let ((start (match-beginning 0)) + (end (match-end 0))) - (t - (phps-mode-lexer--inline-char-handler))))) + (cond -(phps-mode-lexer--match-macro - ST_INITIAL - (looking-at "<\\?") - (if (phps-mode-lexer--CG 'short-tags) - (progn + ;; Allow <?php followed by end of file. + ((equal end (point-max)) (phps-mode-lexer--begin 'ST_IN_SCRIPTING) (phps-mode-lexer--return-or-skip-token 'T_OPEN_TAG)) - (phps-mode-lexer--inline-char-handler))) - -(phps-mode-lexer--match-macro - ST_INITIAL - (looking-at phps-mode-lexer--any-char) - (if (= (point) (point-max)) - (phps-mode-lexer--return-end-token) - (phps-mode-lexer--inline-char-handler))) - -;; Make sure a label character follows "->" or "?->", otherwise there is no property -;; and "->"/"?->" will be taken literally -(phps-mode-lexer--match-macro - (ST_DOUBLE_QUOTES ST_HEREDOC ST_BACKQUOTE) - (looking-at - (concat - "\\$" - phps-mode-lexer--label - "->" - "[a-zA-Z_\x80-\xff]")) - (phps-mode-lexer--yyless 3) - (phps-mode-lexer--yy-push-state 'ST_LOOKING_FOR_PROPERTY) - (phps-mode-lexer--return-token-with-str - 'T_VARIABLE - 1 - (match-beginning 0) - (- (match-end 0) 3))) - -(phps-mode-lexer--match-macro - (ST_DOUBLE_QUOTES ST_HEREDOC ST_BACKQUOTE) - (looking-at - (concat - "\\$" - phps-mode-lexer--label - "\\?->" - "[a-zA-Z_\x80-\xff]")) - (phps-mode-lexer--yyless 4) - (phps-mode-lexer--yy-push-state 'ST_LOOKING_FOR_PROPERTY) - (phps-mode-lexer--return-token-with-str - 'T_VARIABLE - 1 - (match-beginning 0) - (- (match-end 0) 4))) - -;; A [ always designates a variable offset, regardless of what follows -(phps-mode-lexer--match-macro - (ST_DOUBLE_QUOTES ST_HEREDOC ST_BACKQUOTE) - (looking-at - (concat - "\\$" - phps-mode-lexer--label - "\\[")) - (phps-mode-lexer--yyless 1) - (phps-mode-lexer--yy-push-state 'ST_VAR_OFFSET) - (phps-mode-lexer--return-token-with-str - 'T_VARIABLE - 1 - (match-beginning 0) - (- (match-end 0) 1))) - -(phps-mode-lexer--match-macro - ( - ST_IN_SCRIPTING - ST_DOUBLE_QUOTES - ST_HEREDOC - ST_BACKQUOTE - ST_VAR_OFFSET) - (looking-at - (concat - "\\$" - phps-mode-lexer--label)) - (phps-mode-lexer--return-token-with-str 'T_VARIABLE 1)) - -(phps-mode-lexer--match-macro - ST_VAR_OFFSET - (looking-at "\\]") - (phps-mode-lexer--yy-pop-state) - (phps-mode-lexer--return-token-with-str "]" 1)) - -(phps-mode-lexer--match-macro - ST_VAR_OFFSET - (looking-at - (concat "\\(" phps-mode-lexer--tokens - "\\|[{}\"`]\\)")) - (let* ((start (match-beginning 0)) - (end (match-end 0)) - (data (buffer-substring-no-properties start end))) - ;; Only '[' or '-' can be valid, but returning other tokens will allow a more explicit parse error - (phps-mode-lexer--return-token data))) - -(phps-mode-lexer--match-macro - ST_VAR_OFFSET - (looking-at (concat "[ \n\r\t'#]")) - ;; Invalid rule to return a more explicit parse error with proper line number - (phps-mode-lexer--yyless 0) - (phps-mode-lexer--yy-pop-state) - (phps-mode-lexer--return-token-with-val 'T_ENCAPSED_AND_WHITESPACE)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at - (concat - "namespace" - "\\(" - "\\\\" - phps-mode-lexer--label - "\\)+")) - (phps-mode-lexer--return-token-with-str - 'T_NAME_RELATIVE - (1- (length "namespace\\")))) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at (concat - phps-mode-lexer--label - "\\(" - "\\\\" - phps-mode-lexer--label - "\\)+")) - (phps-mode-lexer--return-token-with-str - 'T_NAME_QUALIFIED - 0)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at (concat - "\\\\" - phps-mode-lexer--label - "\\(" - "\\\\" - phps-mode-lexer--label - "\\)*")) - (phps-mode-lexer--return-token-with-str - 'T_NAME_FULLY_QUALIFIED - 1)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "\\\\") - (phps-mode-lexer--return-token 'T_NS_SEPARATOR)) - -(phps-mode-lexer--match-macro - (ST_IN_SCRIPTING ST_VAR_OFFSET) - (looking-at phps-mode-lexer--label) - (phps-mode-lexer--return-token-with-str 'T_STRING 0)) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (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) + + ;; Degenerate case: <?phpX is interpreted as <? phpX with short tags + ((phps-mode-lexer--CG 'short-tags) + (phps-mode-lexer--yyless 2) + (setq end (- end 2)) + (phps-mode-lexer--begin 'ST_IN_SCRIPTING) (phps-mode-lexer--return-or-skip-token - 'T_COMMENT + 'T_OPEN_TAG start - (+ end (match-beginning 0))) - (phps-mode-lexer--return-or-skip-token - 'T_COMMENT - start - (line-end-position))))) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at - (concat - "\\(/\\*\\|/\\*\\*" - phps-mode-lexer--whitespace - "\\)")) - (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 - (progn - (phps-mode-lexer--reset-doc-comment) - (phps-mode-lexer--return-token - 'T_DOC_COMMENT - start) - (phps-mode-lexer--CG 'doc_comment t)) - (phps-mode-lexer--return-token - 'T_COMMENT start)) + end)) + + (t + (phps-mode-lexer--inline-char-handler))))) + + (phps-mode-lexer--match-macro + ST_INITIAL + (looking-at "<\\?") + (if (phps-mode-lexer--CG 'short-tags) (progn - (signal - 'phps-lexer-error - (list - (format - "Unterminated comment starting at %d" - start) - start))))))) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at - (concat - "\\?>" - phps-mode-lexer--newline - "?")) - (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-lexer--parser-mode) - (phps-mode-lexer--return-token - ";" - start - end)) - (phps-mode-lexer--return-token - 'T_CLOSE_TAG - start - end))) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (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 + (phps-mode-lexer--begin 'ST_IN_SCRIPTING) + (phps-mode-lexer--return-or-skip-token 'T_OPEN_TAG)) + (phps-mode-lexer--inline-char-handler))) + + (phps-mode-lexer--match-macro + ST_INITIAL + (looking-at phps-mode-lexer--any-char) + (if (= (point) (point-max)) + (phps-mode-lexer--return-end-token) + (phps-mode-lexer--inline-char-handler))) + + ;; Make sure a label character follows "->" or "?->", otherwise there is no property + ;; and "->"/"?->" will be taken literally + (phps-mode-lexer--match-macro + (ST_DOUBLE_QUOTES ST_HEREDOC ST_BACKQUOTE) + (looking-at + (concat + "\\$" + phps-mode-lexer--label + "->" + "[a-zA-Z_\x80-\xff]")) + (phps-mode-lexer--yyless 3) + (phps-mode-lexer--yy-push-state 'ST_LOOKING_FOR_PROPERTY) + (phps-mode-lexer--return-token-with-str + 'T_VARIABLE + 1 + (match-beginning 0) + (- (match-end 0) 3))) + + (phps-mode-lexer--match-macro + (ST_DOUBLE_QUOTES ST_HEREDOC ST_BACKQUOTE) + (looking-at + (concat + "\\$" + phps-mode-lexer--label + "\\?->" + "[a-zA-Z_\x80-\xff]")) + (phps-mode-lexer--yyless 4) + (phps-mode-lexer--yy-push-state 'ST_LOOKING_FOR_PROPERTY) + (phps-mode-lexer--return-token-with-str + 'T_VARIABLE + 1 + (match-beginning 0) + (- (match-end 0) 4))) + + ;; A [ always designates a variable offset, regardless of what follows + (phps-mode-lexer--match-macro + (ST_DOUBLE_QUOTES ST_HEREDOC ST_BACKQUOTE) + (looking-at + (concat + "\\$" + phps-mode-lexer--label + "\\[")) + (phps-mode-lexer--yyless 1) + (phps-mode-lexer--yy-push-state 'ST_VAR_OFFSET) + (phps-mode-lexer--return-token-with-str + 'T_VARIABLE + 1 + (match-beginning 0) + (- (match-end 0) 1))) + + (phps-mode-lexer--match-macro + ( + ST_IN_SCRIPTING + ST_DOUBLE_QUOTES + ST_HEREDOC + ST_BACKQUOTE + ST_VAR_OFFSET) + (looking-at + (concat + "\\$" + phps-mode-lexer--label)) + (phps-mode-lexer--return-token-with-str 'T_VARIABLE 1)) + + (phps-mode-lexer--match-macro + ST_VAR_OFFSET + (looking-at "\\]") + (phps-mode-lexer--yy-pop-state) + (phps-mode-lexer--return-token-with-str "]" 1)) + + (phps-mode-lexer--match-macro + ST_VAR_OFFSET + (looking-at + (concat "\\(" phps-mode-lexer--tokens + "\\|[{}\"`]\\)")) + (let* ((start (match-beginning 0)) + (end (match-end 0)) + (data (buffer-substring-no-properties start end))) + ;; Only '[' or '-' can be valid, but returning other tokens will allow a more explicit parse error + (phps-mode-lexer--return-token data))) + + (phps-mode-lexer--match-macro + ST_VAR_OFFSET + (looking-at (concat "[ \n\r\t'#]")) + ;; Invalid rule to return a more explicit parse error with proper line number + (phps-mode-lexer--yyless 0) + (phps-mode-lexer--yy-pop-state) + (phps-mode-lexer--return-token-with-val 'T_ENCAPSED_AND_WHITESPACE)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at + (concat + "namespace" + "\\(" + "\\\\" + phps-mode-lexer--label + "\\)+")) + (phps-mode-lexer--return-token-with-str + 'T_NAME_RELATIVE + (1- (length "namespace\\")))) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at (concat + phps-mode-lexer--label + "\\(" + "\\\\" + phps-mode-lexer--label + "\\)+")) + (phps-mode-lexer--return-token-with-str + 'T_NAME_QUALIFIED + 0)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at (concat + "\\\\" + phps-mode-lexer--label + "\\(" + "\\\\" + phps-mode-lexer--label + "\\)*")) + (phps-mode-lexer--return-token-with-str + 'T_NAME_FULLY_QUALIFIED + 1)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "\\\\") + (phps-mode-lexer--return-token 'T_NS_SEPARATOR)) + + (phps-mode-lexer--match-macro + (ST_IN_SCRIPTING ST_VAR_OFFSET) + (looking-at phps-mode-lexer--label) + (phps-mode-lexer--return-token-with-str 'T_STRING 0)) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (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) + (phps-mode-lexer--return-or-skip-token + 'T_COMMENT + start + (+ end (match-beginning 0))) + (phps-mode-lexer--return-or-skip-token + 'T_COMMENT + start + (line-end-position))))) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at + (concat + "\\(/\\*\\|/\\*\\*" + phps-mode-lexer--whitespace + "\\)")) + (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 + (progn + (phps-mode-lexer--reset-doc-comment) + (phps-mode-lexer--return-token + 'T_DOC_COMMENT + start) + (phps-mode-lexer--CG 'doc_comment t)) + (phps-mode-lexer--return-token + 'T_COMMENT start)) + (progn + (signal + 'phps-lexer-error + (list + (format + "Unterminated comment starting at %d" + start) + start))))))) + + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at + (concat + "\\?>" + phps-mode-lexer--newline + "?")) + (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-lexer--parser-mode) (phps-mode-lexer--return-token - 'T_CONSTANT_ENCAPSED_STRING + ";" start - un-escaped-end) - ;; Unclosed single quotes - (phps-mode-lexer--return-token-with-val - 'T_ENCAPSED_AND_WHITESPACE + end)) + (phps-mode-lexer--return-token + 'T_CLOSE_TAG start - (point-max)) - (phps-mode-lexer--move-forward - (point-max))))) - -;; Double quoted string -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "\"") - (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 one character - (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))) + end))) - ;; Do we find a ending double quote or starting variable? - (if string-start - (let ((string-start (match-beginning 0)) - (is-escaped nil) - (is-escaped-1 nil) - (is-escaped-2 nil)) + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (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 + (phps-mode-lexer--return-token + 'T_CONSTANT_ENCAPSED_STRING + start + un-escaped-end) + ;; Unclosed single quotes + (phps-mode-lexer--return-token-with-val + 'T_ENCAPSED_AND_WHITESPACE + start + (point-max)) + (phps-mode-lexer--move-forward + (point-max))))) + + ;; Double quoted string + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "\"") + (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 one character + (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) + (is-escaped-1 nil) + (is-escaped-2 nil)) + + ;; Check whether one character back is escape character + (goto-char (1- string-start)) + (setq is-escaped-1 (looking-at-p "\\\\")) + + ;; Check whether two characters back is escape character + (goto-char (- string-start 2)) + (setq is-escaped-2 (looking-at-p "\\\\")) + + (setq is-escaped + (and + is-escaped-1 + (not is-escaped-2))) + + ;; 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-with-val + 'T_CONSTANT_ENCAPSED_STRING + start + (+ string-start 1))) + ;; (message "Found variable after '%s' at %s-%s" (buffer-substring-no-properties start string-start) start string-start) + (phps-mode-lexer--begin 'ST_DOUBLE_QUOTES) + (phps-mode-lexer--return-token "\"" start (1+ start))))) + (progn + (setq open-quote nil) + (signal + 'phps-lexer-error + (list + (format "Found no ending of quote at %s" start) + start)))))))) + + (phps-mode-lexer--match-macro + 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)) + (let* ((start (match-beginning 0)) + (end (match-end 0)) + (data + (buffer-substring-no-properties + (match-beginning 1) + (match-end 1)))) + + ;; Determine if it's HEREDOC or NOWDOC and extract label here + (if (string= (substring data 0 1) "'") + (progn + (setq + phps-mode-lexer--heredoc-label + (substring data 1 (- (length data) 1))) + (phps-mode-lexer--begin 'ST_NOWDOC)) + (progn + (if (string= (substring data 0 1) "\"") + (setq + phps-mode-lexer--heredoc-label + (substring data 1 (- (length data) 1))) + (setq + phps-mode-lexer--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 + phps-mode-lexer--heredoc-label))) + phps-mode-lexer--heredoc-label) + (phps-mode-lexer--begin 'ST_END_HEREDOC)) + + (push + `(,phps-mode-lexer--heredoc-label ,start ,end) + phps-mode-lexer--heredoc-label-stack) + ;; (message "Found heredoc or nowdoc at %s with label %s" data phps-mode-lexer--heredoc-label) + + (phps-mode-lexer--CG + 'doc_comment + t) + (phps-mode-lexer--return-token + 'T_START_HEREDOC + start + end))) - ;; Check whether one character back is escape character - (goto-char (1- string-start)) - (setq is-escaped-1 (looking-at-p "\\\\")) + (phps-mode-lexer--match-macro + ST_IN_SCRIPTING + (looking-at "[`]") + ;; (message "Begun backquote at %s-%s" (match-beginning 0) (match-end 0)) + (phps-mode-lexer--begin 'ST_BACKQUOTE) + (phps-mode-lexer--return-token "`")) + + (phps-mode-lexer--match-macro + ST_END_HEREDOC + (looking-at + (concat phps-mode-lexer--any-char)) + (let* ((start (match-beginning 0)) + (end (+ start + (length + phps-mode-lexer--heredoc-label) + 1)) + (_data (buffer-substring-no-properties start end))) + ;; (message "Found ending heredoc at %s, %s of %s" _data (thing-at-point 'line) phps-mode-lexer--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))) - ;; Check whether two characters back is escape character - (goto-char (- string-start 2)) - (setq is-escaped-2 (looking-at-p "\\\\")) + (phps-mode-lexer--match-macro + (ST_DOUBLE_QUOTES ST_BACKQUOTE ST_HEREDOC) + (looking-at "{\\$") + (phps-mode-lexer--yy-push-state 'ST_IN_SCRIPTING) + (phps-mode-lexer--yyless 1) + (phps-mode-lexer--enter-nesting "{") + (phps-mode-lexer--return-token + 'T_CURLY_OPEN + (match-beginning 0) + (- (match-end 0) 1))) - (setq is-escaped - (and - is-escaped-1 - (not is-escaped-2))) + (phps-mode-lexer--match-macro + ST_DOUBLE_QUOTES + (looking-at "[\"]") + (phps-mode-lexer--begin 'ST_IN_SCRIPTING) + (phps-mode-lexer--return-token "\"")) + (phps-mode-lexer--match-macro + ST_BACKQUOTE + (looking-at "[`]") + (phps-mode-lexer--begin 'ST_IN_SCRIPTING) + (phps-mode-lexer--return-token "`")) + + (phps-mode-lexer--match-macro + ST_DOUBLE_QUOTES + (looking-at phps-mode-lexer--any-char) + (let ((start (point)) + (start-error (car (cdr (nth 2 phps-mode-lexer--generated-tokens))))) + (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? - (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) + (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-with-val - 'T_CONSTANT_ENCAPSED_STRING + 'T_ENCAPSED_AND_WHITESPACE start - (+ string-start 1))) - ;; (message "Found variable after '%s' at %s-%s" (buffer-substring-no-properties start string-start) start string-start) - (phps-mode-lexer--begin 'ST_DOUBLE_QUOTES) - (phps-mode-lexer--return-token "\"" start (1+ start))))) + variable-start))) + (progn + (phps-mode-lexer--return-token-with-val + 'T_ENCAPSED_AND_WHITESPACE + start + end) + ;; (message "Found end of quote at %s-%s, moving ahead after '%s'" start end (buffer-substring-no-properties start end)) + ))) (progn - (setq open-quote nil) (signal 'phps-lexer-error (list - (format "Found no ending of quote at %s" start) - start)))))))) - -(phps-mode-lexer--match-macro - 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)) - (let* ((start (match-beginning 0)) - (end (match-end 0)) - (data - (buffer-substring-no-properties - (match-beginning 1) - (match-end 1)))) - - ;; Determine if it's HEREDOC or NOWDOC and extract label here - (if (string= (substring data 0 1) "'") - (progn - (setq - phps-mode-lexer--heredoc-label - (substring data 1 (- (length data) 1))) - (phps-mode-lexer--begin 'ST_NOWDOC)) - (progn - (if (string= (substring data 0 1) "\"") - (setq - phps-mode-lexer--heredoc-label - (substring data 1 (- (length data) 1))) - (setq - phps-mode-lexer--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 - phps-mode-lexer--heredoc-label))) - phps-mode-lexer--heredoc-label) - (phps-mode-lexer--begin 'ST_END_HEREDOC)) - - (push - `(,phps-mode-lexer--heredoc-label ,start ,end) - phps-mode-lexer--heredoc-label-stack) - ;; (message "Found heredoc or nowdoc at %s with label %s" data phps-mode-lexer--heredoc-label) - - (phps-mode-lexer--CG - 'doc_comment - t) - (phps-mode-lexer--return-token - 'T_START_HEREDOC - start - end))) - -(phps-mode-lexer--match-macro - ST_IN_SCRIPTING - (looking-at "[`]") - ;; (message "Begun backquote at %s-%s" (match-beginning 0) (match-end 0)) - (phps-mode-lexer--begin 'ST_BACKQUOTE) - (phps-mode-lexer--return-token "`")) - -(phps-mode-lexer--match-macro - ST_END_HEREDOC - (looking-at - (concat phps-mode-lexer--any-char)) - (let* ((start (match-beginning 0)) - (end (+ start - (length - phps-mode-lexer--heredoc-label) - 1)) - (_data (buffer-substring-no-properties start end))) - ;; (message "Found ending heredoc at %s, %s of %s" _data (thing-at-point 'line) phps-mode-lexer--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--match-macro - (ST_DOUBLE_QUOTES ST_BACKQUOTE ST_HEREDOC) - (looking-at "{\\$") - (phps-mode-lexer--yy-push-state 'ST_IN_SCRIPTING) - (phps-mode-lexer--yyless 1) - (phps-mode-lexer--enter-nesting "{") - (phps-mode-lexer--return-token - 'T_CURLY_OPEN - (match-beginning 0) - (- (match-end 0) 1))) - -(phps-mode-lexer--match-macro - ST_DOUBLE_QUOTES - (looking-at "[\"]") - (phps-mode-lexer--begin 'ST_IN_SCRIPTING) - (phps-mode-lexer--return-token "\"")) - -(phps-mode-lexer--match-macro - ST_BACKQUOTE - (looking-at "[`]") - (phps-mode-lexer--begin 'ST_IN_SCRIPTING) - (phps-mode-lexer--return-token "`")) - -(phps-mode-lexer--match-macro - ST_DOUBLE_QUOTES - (looking-at phps-mode-lexer--any-char) - (let ((start (point)) - (start-error (car (cdr (nth 2 phps-mode-lexer--generated-tokens))))) - (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-with-val - 'T_ENCAPSED_AND_WHITESPACE - start - variable-start))) - (progn + (format "Found no ending of double quoted region starting at %d" start-error) + start-error))))))) + + (phps-mode-lexer--match-macro + ST_BACKQUOTE + (looking-at phps-mode-lexer--any-char) + (let ((start (car (cdr (car phps-mode-lexer--generated-tokens))))) + (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 phps-mode-lexer--generated-new-tokens-index start)) + (phps-mode-lexer--return-token-with-val + 'T_ENCAPSED_AND_WHITESPACE + phps-mode-lexer--generated-new-tokens-index + start)) + (progn + (signal + 'phps-lexer-error + (list + (format "Found no ending of back-quoted string starting at %d" start) + start))))))) + + (phps-mode-lexer--match-macro + ST_HEREDOC + (looking-at phps-mode-lexer--any-char) + ;; Check for $, ${ and {$ forward + (let ((old-start (car (cdr (car phps-mode-lexer--heredoc-label-stack)))) + (old-end (point))) + (let ((string-start + (search-forward-regexp + (concat + "\\(\n" + phps-mode-lexer--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))) + + (cond + + ((string-match + (concat + "\n" + phps-mode-lexer--heredoc-label + ";?\n" + ) + data) + ;; (message "Found heredoc end at %s-%s" start end) (phps-mode-lexer--return-token-with-val 'T_ENCAPSED_AND_WHITESPACE - start - end) - ;; (message "Found end of quote at %s-%s, moving ahead after '%s'" start end (buffer-substring-no-properties start end)) - ))) - (progn - (signal - 'phps-lexer-error - (list - (format "Found no ending of double quoted region starting at %d" start-error) - start-error))))))) - -(phps-mode-lexer--match-macro - ST_BACKQUOTE - (looking-at phps-mode-lexer--any-char) - (let ((start (car (cdr (car phps-mode-lexer--generated-tokens))))) - (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 phps-mode-lexer--generated-new-tokens-index start)) - (phps-mode-lexer--return-token-with-val - 'T_ENCAPSED_AND_WHITESPACE - phps-mode-lexer--generated-new-tokens-index - start)) - (progn - (signal - 'phps-lexer-error - (list - (format "Found no ending of back-quoted string starting at %d" start) - start))))))) - -(phps-mode-lexer--match-macro - ST_HEREDOC - (looking-at phps-mode-lexer--any-char) - ;; Check for $, ${ and {$ forward - (let ((old-start (car (cdr (car phps-mode-lexer--heredoc-label-stack)))) - (old-end (point))) - (let ((string-start - (search-forward-regexp - (concat - "\\(\n" - phps-mode-lexer--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))) - - (cond - - ((string-match - (concat - "\n" - phps-mode-lexer--heredoc-label - ";?\n" - ) - data) - ;; (message "Found heredoc end at %s-%s" start end) + old-end + start) + (phps-mode-lexer--begin + 'ST_END_HEREDOC)) + + (t + ;; (message "Found variable at '%s'.. Skipping forward to %s" data start) + (phps-mode-lexer--return-token-with-val + 'T_ENCAPSED_AND_WHITESPACE + old-end + start)) + + )) + (progn + (signal + 'phps-lexer-error + (list + (format "Found no ending of heredoc starting at %d" old-start) + old-start))))))) + + (phps-mode-lexer--match-macro + ST_NOWDOC + (looking-at phps-mode-lexer--any-char) + (let ((start (car (cdr (car phps-mode-lexer--generated-tokens))))) + (let ((string-start (search-forward-regexp + (concat + "\n" + phps-mode-lexer--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--return-token-with-val 'T_ENCAPSED_AND_WHITESPACE - old-end + phps-mode-lexer--generated-new-tokens-index start) (phps-mode-lexer--begin 'ST_END_HEREDOC)) + (progn + (signal + 'phps-lexer-error + (list + (format "Found no ending of nowdoc starting at %d" start) + start))))))) - (t - ;; (message "Found variable at '%s'.. Skipping forward to %s" data start) - (phps-mode-lexer--return-token-with-val - 'T_ENCAPSED_AND_WHITESPACE - old-end - start)) + (phps-mode-lexer--match-macro + (ST_IN_SCRIPTING ST_VAR_OFFSET) + (looking-at phps-mode-lexer--any-char) + (signal + 'phps-lexer-error + (list + (format "Unexpected character at %d" (match-beginning 0)) + (match-beginning 0)))) - )) - (progn - (signal - 'phps-lexer-error - (list - (format "Found no ending of heredoc starting at %d" old-start) - old-start))))))) - -(phps-mode-lexer--match-macro - ST_NOWDOC - (looking-at phps-mode-lexer--any-char) - (let ((start (car (cdr (car phps-mode-lexer--generated-tokens))))) - (let ((string-start (search-forward-regexp - (concat - "\n" - phps-mode-lexer--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--return-token-with-val - 'T_ENCAPSED_AND_WHITESPACE - phps-mode-lexer--generated-new-tokens-index - start) - (phps-mode-lexer--begin - 'ST_END_HEREDOC)) - (progn - (signal - 'phps-lexer-error - (list - (format "Found no ending of nowdoc starting at %d" start) - start))))))) - -(phps-mode-lexer--match-macro - (ST_IN_SCRIPTING ST_VAR_OFFSET) - (looking-at phps-mode-lexer--any-char) - (signal - 'phps-lexer-error - (list - (format "Unexpected character at %d" (match-beginning 0)) - (match-beginning 0)))) + ) (defun phps-mode-lexer--re2c-execute () "Execute matching body (if any)."