emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/phps-mode fe83e986c7 192/212: Fixed issue with optimize


From: Christian Johansson
Subject: [elpa] externals/phps-mode fe83e986c7 192/212: Fixed issue with optimized lexer after byte-compilation
Date: Wed, 26 Jan 2022 01:51:25 -0500 (EST)

branch: externals/phps-mode
commit fe83e986c74a9093be86563f6ce928e586721c52
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>

    Fixed issue with optimized lexer after byte-compilation
---
 TODO.md            |    1 +
 phps-mode-lexer.el | 2818 ++++++++++++++++++++++++++--------------------------
 2 files changed, 1417 insertions(+), 1402 deletions(-)

diff --git a/TODO.md b/TODO.md
index df0e309e53..c05fc02c7d 100644
--- a/TODO.md
+++ b/TODO.md
@@ -3,6 +3,7 @@
 * Move bookkeeping and imenu generation to main thread to be able to populate 
Sematic Subsystem
 * Catch signaling from AST-generation, bookkeeping and imenu generation
 * Fix HTML/XML indentation support
+* Remove support for incremental parsing
 
 # Bugs
 
diff --git a/phps-mode-lexer.el b/phps-mode-lexer.el
index 9a43b96287..d1baf286cf 100644
--- a/phps-mode-lexer.el
+++ b/phps-mode-lexer.el
@@ -108,9 +108,16 @@
 ;; VARIABLES
 
 
-(defvar
+(defconst
   phps-mode-lexer--lambdas-by-state
-  (make-hash-table :test 'equal)
+  #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-mode-lexer--match-body (lambda nil (phps- [...]
+" 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 [...]
+" 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-map of lambdas by state.")
 
 (defvar-local phps-mode-lexer--generated-tokens nil
@@ -470,1442 +477,1449 @@
 
 ;; 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 "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 "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_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_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 "\\(" "]" "\\|" ")" "\\)"))
- (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)
+
+(defun phps-mode-lxer--generate-lexer-rules ()
+  "Generate lexer match 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 "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 "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_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_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 "\\(" "]" "\\|" ")" "\\)"))
+   (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 (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--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)
-     (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 (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--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)))
-
-   ;; Allow <?php followed by end of file.
-   (cond
-
-    ((equal end (point-max))
-     (phps-mode-lexer--begin 'ST_IN_SCRIPTING)
-     (phps-mode-lexer--return-or-skip-token 'T_OPEN_TAG))
+   (phps-mode-lexer--restart))
 
-    ((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
+   ST_IN_SCRIPTING
+   (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)
+       (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 (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 (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--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))
 
-    (t
-     (phps-mode-lexer--inline-char-handler)))))
+  (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_INITIAL
- (looking-at "<\\?")
- (if (phps-mode-lexer--CG 'short-tags)
-     (progn
+  (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)))
+
+     ;; Allow <?php followed by end of file.
+     (cond
+
+      ((equal end (point-max))
        (phps-mode-lexer--begin 'ST_IN_SCRIPTING)
        (phps-mode-lexer--return-or-skip-token 'T_OPEN_TAG))
-   (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
- (
+
+      ((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))
+
+      (t
+       (phps-mode-lexer--inline-char-handler)))))
+
+  (phps-mode-lexer--match-macro
+   ST_INITIAL
+   (looking-at "<\\?")
+   (if (phps-mode-lexer--CG 'short-tags)
+       (progn
+         (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
-   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)
+   (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
-        (+ 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)
+        (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
+        ";"
+        start
+        end))
      (phps-mode-lexer--return-token
-      ";"
+      'T_CLOSE_TAG
       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--return-token
-        'T_CONSTANT_ENCAPSED_STRING
+      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--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
-        un-escaped-end)
-     ;; Unclosed single quotes
-     (phps-mode-lexer--return-token-with-val
-      'T_ENCAPSED_AND_WHITESPACE
+        (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
-      (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 "[`]")
+   ;; (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 one character back is escape character
-             (goto-char (1- string-start))
-             (setq is-escaped-1 (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)))
 
-             ;; 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
+   (looking-at "[\"]")
+   (phps-mode-lexer--begin 'ST_IN_SCRIPTING)
+   (phps-mode-lexer--return-token "\""))
 
-             (setq is-escaped
-                   (and
-                    is-escaped-1
-                    (not is-escaped-2)))
+  (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)."



reply via email to

[Prev in Thread] Current Thread [Next in Thread]