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

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

[elpa] externals/phps-mode 1e3537c 268/405: Re-factored lexer to be more


From: Stefan Monnier
Subject: [elpa] externals/phps-mode 1e3537c 268/405: Re-factored lexer to be more similar to re2c
Date: Sat, 13 Jul 2019 10:00:29 -0400 (EDT)

branch: externals/phps-mode
commit 1e3537c02d206b8aec714f9bae1f487d7fae34ea
Author: Christian Johansson <address@hidden>
Commit: Christian Johansson <address@hidden>

    Re-factored lexer to be more similar to re2c
---
 phps-mode-lexer.el | 1481 ++++++++++++++++++++++++++--------------------------
 1 file changed, 731 insertions(+), 750 deletions(-)

diff --git a/phps-mode-lexer.el b/phps-mode-lexer.el
index f4b8923..0c9b4d9 100644
--- a/phps-mode-lexer.el
+++ b/phps-mode-lexer.el
@@ -410,819 +410,800 @@
 (define-lex-analyzer phps-mode-lexer-lex-analyzer
   "Elisp port of original Zend re2c lexer."
   t
-  (cond
-
-    ;; ST_INITIAL
-    ((= phps-mode-lexer-STATE phps-mode-lexer-ST_INITIAL)
-      (cond
-
-       ((looking-at "<\\?=")
-        (let ((start (match-beginning 0))
-              (end (match-end 0)))
-          (phps-mode-lexer-BEGIN phps-mode-lexer-ST_IN_SCRIPTING)
-          ;; (message "Starting scripting after <?=")
-          (when phps-mode-lexer-PARSER_MODE
-            (phps-mode-lexer-RETURN_TOKEN 'T_ECHO start end))
-          (phps-mode-lexer-RETURN_TOKEN 'T_OPEN_TAG_WITH_ECHO start end)))
-
-       ((looking-at "<\\?php\\([ \t]\\|\n\\)")
-        (let ((start (match-beginning 0))
-              (end (match-end 0)))
-          (phps-mode-lexer-BEGIN phps-mode-lexer-ST_IN_SCRIPTING)
-          ;; (message "Starting scripting after <?php")
-          (when phps-mode-lexer-EXPECTED
-            (phps-mode-lexer-SKIP_TOKEN 'T_OPEN_TAG start end))
-          (phps-mode-lexer-RETURN_TOKEN 'T_OPEN_TAG start end)))
-
-       ((looking-at "<\\?")
-        (when phps-mode-lexer-SHORT_TAGS
-          (let ((start (match-beginning 0))
-                (end (match-end 0)))
-            (phps-mode-lexer-BEGIN phps-mode-lexer-ST_IN_SCRIPTING)
-            (when phps-mode-lexer-EXPECTED
-              (phps-mode-lexer-SKIP_TOKEN 'T_OPEN_TAG start end))
-            ;; (message "Starting scripting after <?")
-            (phps-mode-lexer-RETURN_TOKEN 'T_OPEN_TAG start end))))
-
-       ;; NOTE: mimics inline_char_handler
-       ((looking-at phps-mode-lexer-ANY_CHAR)
-        (let ((start (match-beginning 0)))
-          (let ((string-start (search-forward "<?" nil t)))
-            (if string-start
-                (phps-mode-lexer-RETURN_TOKEN 'T_INLINE_HTML start (- 
string-start 2))
-              (phps-mode-lexer-RETURN_TOKEN 'T_INLINE_HTML start 
(point-max))))))
-
-       ))
-
-    ;; ST_IN_SCRIPTING
-    ((= phps-mode-lexer-STATE phps-mode-lexer-ST_IN_SCRIPTING)
-      (cond
-
-       ((looking-at (concat "exit" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_EXIT (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "die" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_DIE (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "function" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_FUNCTION (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "const" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_CONST (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "return" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_RETURN (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "yield" phps-mode-lexer-WHITESPACE "from" 
"[^a-zA-Z0-9_\x80-\xff]"))
-        (phps-mode-lexer-RETURN_TOKEN 'T_YIELD_FROM (match-beginning 0) 
(match-end 0)))
-       ((looking-at (concat "yield" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_YIELD (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "try" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_TRY (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "catch" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_CATCH (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "finally" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_FINALLY (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "throw" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_THROW (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "if" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_IF (match-beginning 0) (1- (match-end 
0))))
-       ((looking-at (concat "elseif" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_ELSEIF (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "endif" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_ENDIF (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "else" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_ELSE (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "while" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_WHILE (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "endwhile" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_ENDWHILE (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "do" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_DO (match-beginning 0) (1- (match-end 
0))))
-       ((looking-at (concat "foreach" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_FOREACH (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "endforeach" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_ENDFOREACH (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "for" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_FOR (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "endfor" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_ENDFOR (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "declare" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_DECLARE (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "enddeclare" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_ENDDECLARE (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "instanceof" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_INSTANCEOF (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "as" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_AS (match-beginning 0) (1- (match-end 
0))))
-       ((looking-at (concat "switch" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_SWITCH (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "endswitch" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_ENDSWITCH (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "case" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_CASE (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "default" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_DEFAULT (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "break" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_BREAK (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "continue" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_CONTINUE (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "goto" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_GOTO (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "echo" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_ECHO (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "print" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_PRINT (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "class" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_CLASS (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "interface" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_INTERFACE (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "trait" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_TRAIT (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "extends" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_EXTENDS (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "implements" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_IMPLEMENTS (match-beginning 0) (1- 
(match-end 0))))
-
-       ((looking-at "->")
-        (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_LOOKING_FOR_PROPERTY)
-        (phps-mode-lexer-RETURN_TOKEN 'T_OBJECT_OPERATOR (match-beginning 0) 
(match-end 0)))
-
-       ((looking-at "\\?>\n?")
-        (let ((start (match-beginning 0))
-              (end (match-end 0)))
-          (when (= (- end start) 3)
-            (setq end (1- end)))
-          (phps-mode-lexer-BEGIN phps-mode-lexer-ST_INITIAL)
-          (when phps-mode-lexer-PARSER_MODE
-            (phps-mode-lexer-RETURN_TOKEN ";" start end))
-          (phps-mode-lexer-RETURN_TOKEN 'T_CLOSE_TAG start end)))
-
-       ;; HEREDOC and NOWDOC
-       ((looking-at (concat "<<<" phps-mode-lexer-TABS_AND_SPACES "\\(" 
phps-mode-lexer-LABEL "\\|'" phps-mode-lexer-LABEL "'\\|\"" 
phps-mode-lexer-LABEL "\"\\)" phps-mode-lexer-NEWLINE))
-        (let* ((start (match-beginning 0))
-               (end (match-end 0))
-               (data (buffer-substring-no-properties (match-beginning 1) 
(match-end 1)))
-               (heredoc_label))
-
-          ;; Determine if it's HEREDOC or NOWDOC and extract label here
-          (if (string= (substring data 0 1) "'")
-              (progn
+  (let ((old-start (point))
+        (heredoc_label (car phps-mode-lexer-heredoc_label_stack))
+        (ST_IN_SCRIPTING (= phps-mode-lexer-STATE 
phps-mode-lexer-ST_IN_SCRIPTING))
+        (ST_INITIAL (= phps-mode-lexer-STATE phps-mode-lexer-ST_INITIAL))
+        (ST_LOOKING_FOR_PROPERTY (= phps-mode-lexer-STATE 
phps-mode-lexer-ST_LOOKING_FOR_PROPERTY))
+        (ST_DOUBLE_QUOTES (= phps-mode-lexer-STATE 
phps-mode-lexer-ST_DOUBLE_QUOTES))
+        (ST_BACKQUOTE (= phps-mode-lexer-STATE phps-mode-lexer-ST_BACKQUOTE))
+        (ST_HEREDOC (= phps-mode-lexer-STATE phps-mode-lexer-ST_HEREDOC))
+        (ST_NOWDOC (= phps-mode-lexer-STATE phps-mode-lexer-ST_NOWDOC))
+        (ST_LOOKING_FOR_VARNAME (= phps-mode-lexer-STATE 
phps-mode-lexer-ST_LOOKING_FOR_VARNAME))
+        (ST_END_HEREDOC (= phps-mode-lexer-STATE 
phps-mode-lexer-ST_END_HEREDOC))
+        (ST_VAR_OFFSET (= phps-mode-lexer-STATE 
phps-mode-lexer-ST_VAR_OFFSET)))
+    (cond
+
+     ;; ST_IN_SCRIPTING
+     ((and ST_IN_SCRIPTING (looking-at (concat "exit" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_EXIT (match-beginning 0) (1- (match-end 
0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "die" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_DIE (match-beginning 0) (1- (match-end 
0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "function" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_FUNCTION (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "const" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_CONST (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "return" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_RETURN (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "yield" 
phps-mode-lexer-WHITESPACE "from" "[^a-zA-Z0-9_\x80-\xff]")))
+      (phps-mode-lexer-RETURN_TOKEN 'T_YIELD_FROM (match-beginning 0) 
(match-end 0)))
+     ((and ST_IN_SCRIPTING (looking-at (concat "yield" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_YIELD (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "try" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_TRY (match-beginning 0) (1- (match-end 
0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "catch" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_CATCH (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "finally" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_FINALLY (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "throw" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_THROW (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "if" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_IF (match-beginning 0) (1- (match-end 
0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "elseif" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_ELSEIF (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "endif" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_ENDIF (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "else" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_ELSE (match-beginning 0) (1- (match-end 
0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "while" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_WHILE (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "endwhile" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_ENDWHILE (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "do" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_DO (match-beginning 0) (1- (match-end 
0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "foreach" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_FOREACH (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "endforeach" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_ENDFOREACH (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "for" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_FOR (match-beginning 0) (1- (match-end 
0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "endfor" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_ENDFOR (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "declare" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_DECLARE (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "enddeclare" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_ENDDECLARE (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "instanceof" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_INSTANCEOF (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "as" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_AS (match-beginning 0) (1- (match-end 
0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "switch" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_SWITCH (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "endswitch" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_ENDSWITCH (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "case" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_CASE (match-beginning 0) (1- (match-end 
0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "default" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_DEFAULT (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "break" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_BREAK (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "continue" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_CONTINUE (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "goto" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_GOTO (match-beginning 0) (1- (match-end 
0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "echo" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_ECHO (match-beginning 0) (1- (match-end 
0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "print" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_PRINT (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "class" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_CLASS (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "interface" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_INTERFACE (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "trait" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_TRAIT (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "extends" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_EXTENDS (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "implements" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_IMPLEMENTS (match-beginning 0) (1- 
(match-end 0))))
+
+     ((and ST_IN_SCRIPTING (looking-at "->"))
+      (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_LOOKING_FOR_PROPERTY)
+      (phps-mode-lexer-RETURN_TOKEN 'T_OBJECT_OPERATOR (match-beginning 0) 
(match-end 0)))
+
+     ((and ST_IN_SCRIPTING (looking-at "\\?>\n?"))
+      (let ((start (match-beginning 0))
+            (end (match-end 0)))
+        (when (= (- end start) 3)
+          (setq end (1- end)))
+        (phps-mode-lexer-BEGIN phps-mode-lexer-ST_INITIAL)
+        (when phps-mode-lexer-PARSER_MODE
+          (phps-mode-lexer-RETURN_TOKEN ";" start end))
+        (phps-mode-lexer-RETURN_TOKEN 'T_CLOSE_TAG start end)))
+
+     ;; HEREDOC and NOWDOC
+     ((and ST_IN_SCRIPTING (looking-at (concat "<<<" 
phps-mode-lexer-TABS_AND_SPACES "\\(" phps-mode-lexer-LABEL "\\|'" 
phps-mode-lexer-LABEL "'\\|\"" phps-mode-lexer-LABEL "\"\\)" 
phps-mode-lexer-NEWLINE)))
+      (let* ((start (match-beginning 0))
+             (end (match-end 0))
+             (data (buffer-substring-no-properties (match-beginning 1) 
(match-end 1)))
+             (heredoc_label))
+
+        ;; Determine if it's HEREDOC or NOWDOC and extract label here
+        (if (string= (substring data 0 1) "'")
+            (progn
+              (setq heredoc_label (substring data 1 (- (length data) 1)))
+              (phps-mode-lexer-BEGIN phps-mode-lexer-ST_NOWDOC))
+          (progn
+            (if (string= (substring data 0 1) "\"")
                 (setq heredoc_label (substring data 1 (- (length data) 1)))
-                (phps-mode-lexer-BEGIN phps-mode-lexer-ST_NOWDOC))
+              (setq heredoc_label data))
+            (phps-mode-lexer-BEGIN phps-mode-lexer-ST_HEREDOC)))
+
+        ;; Check for ending label on the next line
+        (when (string= (buffer-substring-no-properties end (+ end (length 
heredoc_label))) heredoc_label)
+          (phps-mode-lexer-BEGIN phps-mode-lexer-ST_END_HEREDOC))
+
+        (push heredoc_label phps-mode-lexer-heredoc_label_stack)
+        ;; (message "Found heredoc or nowdoc at %s with label %s" data 
heredoc_label)
+
+        (phps-mode-lexer-RETURN_TOKEN 'T_START_HEREDOC start end)))
+
+     ((and ST_IN_SCRIPTING (looking-at "::"))
+      (phps-mode-lexer-RETURN_TOKEN 'T_PAAMAYIM_NEKUDOTAYIM (match-beginning 
0) (match-end 0)))
+     ((and ST_IN_SCRIPTING (looking-at "\\\\"))
+      (phps-mode-lexer-RETURN_TOKEN 'T_NS_SEPARATOR (match-beginning 0) 
(match-end 0)))
+     ((and ST_IN_SCRIPTING (looking-at "\\.\\.\\."))
+      (phps-mode-lexer-RETURN_TOKEN 'T_ELLIPSIS (match-beginning 0) (match-end 
0)))
+     ((and ST_IN_SCRIPTING (looking-at "\\?\\?"))
+      (phps-mode-lexer-RETURN_TOKEN 'T_COALESCE (match-beginning 0) (match-end 
0)))
+     ((and ST_IN_SCRIPTING (looking-at (concat "new" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_NEW (match-beginning 0) (1- (match-end 
0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "clone" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_CLONE (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "var" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_VAR (match-beginning 0) (1- (match-end 
0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "(" 
phps-mode-lexer-TABS_AND_SPACES "\\(integer\\|int\\)" 
phps-mode-lexer-TABS_AND_SPACES ")")))
+      (phps-mode-lexer-RETURN_TOKEN 'T_INT_CAST (match-beginning 0) (match-end 
0)))
+     ((and ST_IN_SCRIPTING (looking-at (concat "(" 
phps-mode-lexer-TABS_AND_SPACES "\\(real\\|double\\|float\\)" 
phps-mode-lexer-TABS_AND_SPACES ")")))
+      (phps-mode-lexer-RETURN_TOKEN 'T_DOUBLE_CAST (match-beginning 0) 
(match-end 0)))
+     ((and 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 (match-beginning 0) 
(match-end 0)))
+     ((and 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 (match-beginning 0) 
(match-end 0)))
+     ((and 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 (match-beginning 0) 
(match-end 0)))
+     ((and ST_IN_SCRIPTING (looking-at (concat "(" 
phps-mode-lexer-TABS_AND_SPACES "\\(boolean\\|bool\\)" 
phps-mode-lexer-TABS_AND_SPACES ")")))
+      (phps-mode-lexer-RETURN_TOKEN 'T_BOOL_CAST (match-beginning 0) 
(match-end 0)))
+     ((and 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 (match-beginning 0) 
(match-end 0)))
+     ((and ST_IN_SCRIPTING (looking-at (concat "eval" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_EVAL (match-beginning 0) (1- (match-end 
0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "include_once" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_INCLUDE_ONCE (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "include" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_INCLUDE (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "require_once" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_REQUIRE_ONCE (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "require" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_REQUIRE (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "namespace" 
phps-mode-lexer-NOT-LABEL)))
+      (setq phps-mode-lexer-declaring_namespace t)
+      (phps-mode-lexer-RETURN_TOKEN 'T_NAMESPACE (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "use" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_USE (match-beginning 0) (1- (match-end 
0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "insteadof" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_INSTEADOF (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "global" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_GLOBAL (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "isset" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_ISSET (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "empty" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_EMPTY (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "__halt_compiler" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_HALT_COMPILER (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "static" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_STATIC (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "abstract" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_ABSTRACT (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "final" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_FINAL (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "private" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_PRIVATE (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "protected" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_PROTECTED (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "public" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_PUBLIC (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "unset" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_UNSET (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at "=>"))
+      (phps-mode-lexer-RETURN_TOKEN 'T_DOUBLE_ARROW (match-beginning 0) 
(match-end 0)))
+     ((and ST_IN_SCRIPTING (looking-at (concat "list" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_LIST (match-beginning 0) (1- (match-end 
0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "array" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_ARRAY (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "callable" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_CALLABLE (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at "\\+\\+"))
+      (phps-mode-lexer-RETURN_TOKEN 'T_INC (match-beginning 0) (match-end 0)))
+     ((and ST_IN_SCRIPTING (looking-at "--"))
+      (phps-mode-lexer-RETURN_TOKEN 'T_DEC (match-beginning 0) (match-end 0)))
+     ((and ST_IN_SCRIPTING (looking-at "==="))
+      (phps-mode-lexer-RETURN_TOKEN 'T_IS_IDENTICAL (match-beginning 0) 
(match-end 0)))
+     ((and ST_IN_SCRIPTING (looking-at "!=="))
+      (phps-mode-lexer-RETURN_TOKEN 'T_IS_NOT_IDENTICAL (match-beginning 0) 
(match-end 0)))
+     ((and ST_IN_SCRIPTING (looking-at "=="))
+      (phps-mode-lexer-RETURN_TOKEN 'T_IS_EQUAL (match-beginning 0) (match-end 
0)))
+     ((and ST_IN_SCRIPTING (looking-at "\\(!=\\|<>\\)"))
+      (phps-mode-lexer-RETURN_TOKEN 'T_IS_NOT_EQUAL (match-beginning 0) 
(match-end 0)))
+     ((and ST_IN_SCRIPTING (looking-at "<=>"))
+      (phps-mode-lexer-RETURN_TOKEN 'T_SPACESHIP (match-beginning 0) 
(match-end 0)))
+     ((and ST_IN_SCRIPTING (looking-at "<="))
+      (phps-mode-lexer-RETURN_TOKEN 'T_IS_SMALLER_OR_EQUAL (match-beginning 0) 
(match-end 0)))
+     ((and ST_IN_SCRIPTING (looking-at ">="))
+      (phps-mode-lexer-RETURN_TOKEN 'T_IS_GREATER_OR_EQUAL (match-beginning 0) 
(match-end 0)))
+     ((and ST_IN_SCRIPTING (looking-at "\\+="))
+      (phps-mode-lexer-RETURN_TOKEN 'T_PLUS_EQUAL (match-beginning 0) 
(match-end 0)))
+     ((and ST_IN_SCRIPTING (looking-at "-="))
+      (phps-mode-lexer-RETURN_TOKEN 'T_MINUS_EQUAL (match-beginning 0) 
(match-end 0)))
+     ((and ST_IN_SCRIPTING (looking-at "\\*="))
+      (phps-mode-lexer-RETURN_TOKEN 'T_MUL_EQUAL (match-beginning 0) 
(match-end 0)))
+     ((and ST_IN_SCRIPTING (looking-at "\\*\\\\\\*="))
+      (phps-mode-lexer-RETURN_TOKEN 'T_POW_EQUAL (match-beginning 0) 
(match-end 0)))
+     ((and ST_IN_SCRIPTING (looking-at "\\*\\\\\\*"))
+      (phps-mode-lexer-RETURN_TOKEN 'T_POW (match-beginning 0) (match-end 0)))
+     ((and ST_IN_SCRIPTING (looking-at "/="))
+      (phps-mode-lexer-RETURN_TOKEN 'T_DIV_EQUAL (match-beginning 0) 
(match-end 0)))
+     ((and ST_IN_SCRIPTING (looking-at "\\.="))
+      (phps-mode-lexer-RETURN_TOKEN 'T_CONCAT_EQUAL (match-beginning 0) 
(match-end 0)))
+     ((and ST_IN_SCRIPTING (looking-at "%="))
+      (phps-mode-lexer-RETURN_TOKEN 'T_MOD_EQUAL (match-beginning 0) 
(match-end 0)))
+     ((and ST_IN_SCRIPTING (looking-at "<<="))
+      (phps-mode-lexer-RETURN_TOKEN 'T_SL_EQUAL (match-beginning 0) (match-end 
0)))
+     ((and ST_IN_SCRIPTING (looking-at ">>="))
+      (phps-mode-lexer-RETURN_TOKEN 'T_SR_EQUAL (match-beginning 0) (match-end 
0)))
+     ((and ST_IN_SCRIPTING (looking-at "&="))
+      (phps-mode-lexer-RETURN_TOKEN 'T_AND_EQUAL (match-beginning 0) 
(match-end 0)))
+     ((and ST_IN_SCRIPTING (looking-at "|="))
+      (phps-mode-lexer-RETURN_TOKEN 'T_OR_EQUAL (match-beginning 0) (match-end 
0)))
+     ((and ST_IN_SCRIPTING (looking-at "\\^="))
+      (phps-mode-lexer-RETURN_TOKEN 'T_XOR_EQUAL (match-beginning 0) 
(match-end 0)))
+     ((and ST_IN_SCRIPTING (looking-at "||"))
+      (phps-mode-lexer-RETURN_TOKEN 'T_BOOLEAN_OR (match-beginning 0) 
(match-end 0)))
+     ((and ST_IN_SCRIPTING (looking-at "&&"))
+      (phps-mode-lexer-RETURN_TOKEN 'T_BOOLEAN_AND (match-beginning 0) 
(match-end 0)))
+     ((and ST_IN_SCRIPTING (looking-at (concat "XOR" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_XOR (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "OR" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_OR (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "AND" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_AND (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at "<<"))
+      (phps-mode-lexer-RETURN_TOKEN 'T_SL (match-beginning 0) (match-end 0)))
+     ((and ST_IN_SCRIPTING (looking-at ">>"))
+      (phps-mode-lexer-RETURN_TOKEN 'T_SR (match-beginning 0) (match-end 0)))
+
+     ((and ST_IN_SCRIPTING (looking-at "{"))
+      (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_IN_SCRIPTING)
+      (when phps-mode-lexer-declaring_namespace
+        (setq phps-mode-lexer-declaring_namespace nil))
+      (phps-mode-lexer-RETURN_TOKEN "{" (match-beginning 0) (match-end 0)))
+
+     ((and ST_IN_SCRIPTING (looking-at "}"))
+      (when phps-mode-lexer-state_stack
+        ;; (message "State stack %s" phps-mode-lexer-state_stack)
+        ;; (message "popping state from } %s at %s-%s" (length 
phps-mode-lexer-state_stack) (match-beginning 0) (match-end 0))
+        (phps-mode-lexer-yy_pop_state)
+        ;; (message "New state: %s" phps-mode-lexer-STATE)
+        )
+      (phps-mode-lexer-RETURN_TOKEN "}" (match-beginning 0) (match-end 0)))
+
+     ((and 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 start end)
+          (phps-mode-lexer-RETURN_TOKEN 'T_LNUMBER start end))))
+
+     ((and 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 start end)
+          (phps-mode-lexer-RETURN_TOKEN 'T_LNUMBER start end))))
+
+     ((and ST_IN_SCRIPTING (or (looking-at phps-mode-lexer-EXPONENT_DNUM)
+           (looking-at phps-mode-lexer-DNUM)))
+      (let* ((start (match-beginning 0))
+             (end (match-end 0))
+             (_data (buffer-substring-no-properties start end)))
+        ;; (message "Exponent/double at: %s" _data)
+        (phps-mode-lexer-RETURN_TOKEN 'T_DNUMBER start end)))
+
+     ((and 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 start end)
+          (phps-mode-lexer-RETURN_TOKEN 'T_LNUMBER start end))))
+
+     ((and ST_IN_SCRIPTING (looking-at (concat "__CLASS__" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_CLASS_C (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "__TRAIT__" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_TRAIT_C (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "__FUNCTION__" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_FUNC_C (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "__METHOD__" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_METHOD_C (match-beginning 0) (1- 
(match-end 0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "__LINE__" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_LINE (match-beginning 0) (1- (match-end 
0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "__FILE__" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_FILE (match-beginning 0) (1- (match-end 
0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "__DIR__" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_DIR (match-beginning 0) (1- (match-end 
0))))
+     ((and ST_IN_SCRIPTING (looking-at (concat "__NAMESPACE__" 
phps-mode-lexer-NOT-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_NS_C (match-beginning 0) (1- (match-end 
0))))
+
+     ((and 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)
             (progn
-              (if (string= (substring data 0 1) "\"")
-                  (setq heredoc_label (substring data 1 (- (length data) 1)))
-                (setq heredoc_label data))
-              (phps-mode-lexer-BEGIN phps-mode-lexer-ST_HEREDOC)))
-
-          ;; Check for ending label on the next line
-          (when (string= (buffer-substring-no-properties end (+ end (length 
heredoc_label))) heredoc_label)
-            (phps-mode-lexer-BEGIN phps-mode-lexer-ST_END_HEREDOC))
-
-          (push heredoc_label phps-mode-lexer-heredoc_label_stack)
-          ;; (message "Found heredoc or nowdoc at %s with label %s" data 
heredoc_label)
-
-          (phps-mode-lexer-RETURN_TOKEN 'T_START_HEREDOC start end)))
-
-       ((looking-at "::")
-        (phps-mode-lexer-RETURN_TOKEN 'T_PAAMAYIM_NEKUDOTAYIM (match-beginning 
0) (match-end 0)))
-       ((looking-at "\\\\")
-        (phps-mode-lexer-RETURN_TOKEN 'T_NS_SEPARATOR (match-beginning 0) 
(match-end 0)))
-       ((looking-at "\\.\\.\\.")
-        (phps-mode-lexer-RETURN_TOKEN 'T_ELLIPSIS (match-beginning 0) 
(match-end 0)))
-       ((looking-at "\\?\\?")
-        (phps-mode-lexer-RETURN_TOKEN 'T_COALESCE (match-beginning 0) 
(match-end 0)))
-       ((looking-at (concat "new" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_NEW (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "clone" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_CLONE (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "var" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_VAR (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES 
"\\(integer\\|int\\)" phps-mode-lexer-TABS_AND_SPACES ")"))
-        (phps-mode-lexer-RETURN_TOKEN 'T_INT_CAST (match-beginning 0) 
(match-end 0)))
-       ((looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES 
"\\(real\\|double\\|float\\)" phps-mode-lexer-TABS_AND_SPACES ")"))
-        (phps-mode-lexer-RETURN_TOKEN 'T_DOUBLE_CAST (match-beginning 0) 
(match-end 0)))
-       ((looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES 
"\\(string\\|binary\\)" phps-mode-lexer-TABS_AND_SPACES ")"))
-        (phps-mode-lexer-RETURN_TOKEN 'T_STRING_CAST (match-beginning 0) 
(match-end 0)))
-       ((looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES "array" 
phps-mode-lexer-TABS_AND_SPACES ")"))
-        (phps-mode-lexer-RETURN_TOKEN 'T_ARRAY_CAST (match-beginning 0) 
(match-end 0)))
-       ((looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES "object" 
phps-mode-lexer-TABS_AND_SPACES ")"))
-        (phps-mode-lexer-RETURN_TOKEN 'T_OBJECT_CAST (match-beginning 0) 
(match-end 0)))
-       ((looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES 
"\\(boolean\\|bool\\)" phps-mode-lexer-TABS_AND_SPACES ")"))
-        (phps-mode-lexer-RETURN_TOKEN 'T_BOOL_CAST (match-beginning 0) 
(match-end 0)))
-       ((looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES "unset" 
phps-mode-lexer-TABS_AND_SPACES ")"))
-        (phps-mode-lexer-RETURN_TOKEN 'T_UNSET_CAST (match-beginning 0) 
(match-end 0)))
-       ((looking-at (concat "eval" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_EVAL (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "include_once" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_INCLUDE_ONCE (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "include" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_INCLUDE (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "require_once" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_REQUIRE_ONCE (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "require" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_REQUIRE (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "namespace" phps-mode-lexer-NOT-LABEL))
-        (setq phps-mode-lexer-declaring_namespace t)
-        (phps-mode-lexer-RETURN_TOKEN 'T_NAMESPACE (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "use" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_USE (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "insteadof" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_INSTEADOF (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "global" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_GLOBAL (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "isset" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_ISSET (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "empty" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_EMPTY (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "__halt_compiler" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_HALT_COMPILER (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "static" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_STATIC (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "abstract" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_ABSTRACT (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "final" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_FINAL (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "private" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_PRIVATE (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "protected" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_PROTECTED (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "public" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_PUBLIC (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "unset" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_UNSET (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at "=>")
-        (phps-mode-lexer-RETURN_TOKEN 'T_DOUBLE_ARROW (match-beginning 0) 
(match-end 0)))
-       ((looking-at (concat "list" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_LIST (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "array" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_ARRAY (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "callable" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_CALLABLE (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at "\\+\\+")
-        (phps-mode-lexer-RETURN_TOKEN 'T_INC (match-beginning 0) (match-end 
0)))
-       ((looking-at "--")
-        (phps-mode-lexer-RETURN_TOKEN 'T_DEC (match-beginning 0) (match-end 
0)))
-       ((looking-at "===")
-        (phps-mode-lexer-RETURN_TOKEN 'T_IS_IDENTICAL (match-beginning 0) 
(match-end 0)))
-       ((looking-at "!==")
-        (phps-mode-lexer-RETURN_TOKEN 'T_IS_NOT_IDENTICAL (match-beginning 0) 
(match-end 0)))
-       ((looking-at "==")
-        (phps-mode-lexer-RETURN_TOKEN 'T_IS_EQUAL (match-beginning 0) 
(match-end 0)))
-       ((looking-at "\\(!=\\|<>\\)")
-        (phps-mode-lexer-RETURN_TOKEN 'T_IS_NOT_EQUAL (match-beginning 0) 
(match-end 0)))
-       ((looking-at "<=>")
-        (phps-mode-lexer-RETURN_TOKEN 'T_SPACESHIP (match-beginning 0) 
(match-end 0)))
-       ((looking-at "<=")
-        (phps-mode-lexer-RETURN_TOKEN 'T_IS_SMALLER_OR_EQUAL (match-beginning 
0) (match-end 0)))
-       ((looking-at ">=")
-        (phps-mode-lexer-RETURN_TOKEN 'T_IS_GREATER_OR_EQUAL (match-beginning 
0) (match-end 0)))
-       ((looking-at "\\+=")
-        (phps-mode-lexer-RETURN_TOKEN 'T_PLUS_EQUAL (match-beginning 0) 
(match-end 0)))
-       ((looking-at "-=")
-        (phps-mode-lexer-RETURN_TOKEN 'T_MINUS_EQUAL (match-beginning 0) 
(match-end 0)))
-       ((looking-at "\\*=")
-        (phps-mode-lexer-RETURN_TOKEN 'T_MUL_EQUAL (match-beginning 0) 
(match-end 0)))
-       ((looking-at "\\*\\\\\\*=")
-        (phps-mode-lexer-RETURN_TOKEN 'T_POW_EQUAL (match-beginning 0) 
(match-end 0)))
-       ((looking-at "\\*\\\\\\*")
-        (phps-mode-lexer-RETURN_TOKEN 'T_POW (match-beginning 0) (match-end 
0)))
-       ((looking-at "/=")
-        (phps-mode-lexer-RETURN_TOKEN 'T_DIV_EQUAL (match-beginning 0) 
(match-end 0)))
-       ((looking-at "\\.=")
-        (phps-mode-lexer-RETURN_TOKEN 'T_CONCAT_EQUAL (match-beginning 0) 
(match-end 0)))
-       ((looking-at "%=")
-        (phps-mode-lexer-RETURN_TOKEN 'T_MOD_EQUAL (match-beginning 0) 
(match-end 0)))
-       ((looking-at "<<=")
-        (phps-mode-lexer-RETURN_TOKEN 'T_SL_EQUAL (match-beginning 0) 
(match-end 0)))
-       ((looking-at ">>=")
-        (phps-mode-lexer-RETURN_TOKEN 'T_SR_EQUAL (match-beginning 0) 
(match-end 0)))
-       ((looking-at "&=")
-        (phps-mode-lexer-RETURN_TOKEN 'T_AND_EQUAL (match-beginning 0) 
(match-end 0)))
-       ((looking-at "|=")
-        (phps-mode-lexer-RETURN_TOKEN 'T_OR_EQUAL (match-beginning 0) 
(match-end 0)))
-       ((looking-at "\\^=")
-        (phps-mode-lexer-RETURN_TOKEN 'T_XOR_EQUAL (match-beginning 0) 
(match-end 0)))
-       ((looking-at "||")
-        (phps-mode-lexer-RETURN_TOKEN 'T_BOOLEAN_OR (match-beginning 0) 
(match-end 0)))
-       ((looking-at "&&")
-        (phps-mode-lexer-RETURN_TOKEN 'T_BOOLEAN_AND (match-beginning 0) 
(match-end 0)))
-       ((looking-at (concat "XOR" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_XOR (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "OR" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_OR (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "AND" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_AND (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at "<<")
-        (phps-mode-lexer-RETURN_TOKEN 'T_SL (match-beginning 0) (match-end 0)))
-       ((looking-at ">>")
-        (phps-mode-lexer-RETURN_TOKEN 'T_SR (match-beginning 0) (match-end 0)))
-
-       ((looking-at "{")
-        (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_IN_SCRIPTING)
+              ;; (message "Found comment 1 from %s to %s %s in %s" end (+ end 
(match-beginning 0)) (match-beginning 0) line)
+              (phps-mode-lexer-RETURN_TOKEN 'T_COMMENT start (+ end 
(match-beginning 0)))
+              )
+          (progn
+            ;; TODO Handle expecting values here
+            ;; (message "Found comment 2 from %s to %s" start 
(line-end-position))
+            (phps-mode-lexer-RETURN_TOKEN 'T_COMMENT start (line-end-position))
+            ))))
+
+     ((and 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)))
+        (let ((string-start (search-forward "*/" nil t))
+              position)
+          (if string-start
+              (setq position string-start)
+            (progn
+              (setq position (point-max))
+              (phps-mode-lexer-MOVE_FORWARD (point-max))))
+          (phps-mode-lexer-RETURN_TOKEN 'T_DOC_COMMENT start position)
+          )))
+
+     ((and ST_IN_SCRIPTING (looking-at "/\\*"))
+      (let* ((start (match-beginning 0))
+             (end (match-end 0))
+             (_data (buffer-substring-no-properties start end)))
+        (let ((string-start (search-forward "*/" nil t))
+              position)
+          (if string-start
+              (setq position string-start)
+            (progn
+              (setq position (point-max))
+              (phps-mode-lexer-MOVE_FORWARD (point-max))))
+          (phps-mode-lexer-RETURN_TOKEN 'T_COMMENT start position)
+          )))
+
+     ((and ST_IN_SCRIPTING (looking-at (concat "\\$" phps-mode-lexer-LABEL)))
+      (let ((start (match-beginning 0))
+            (end (match-end 0)))
+        (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE start end)))
+
+     ((and ST_IN_SCRIPTING (looking-at phps-mode-lexer-TOKENS))
+      (let* ((start (match-beginning 0))
+             (end (match-end 0))
+             (data (buffer-substring-no-properties start end))
+             (use-brace nil))
+        ;; (message "Found token '%s'" data)
         (when phps-mode-lexer-declaring_namespace
+          (when (string= data ";")
+            (setq phps-mode-lexer-prepend_trailing_brace t)
+            ;; (message "Set flag prepend trailing brace")
+            ;; (setq use-brace t)
+            )
           (setq phps-mode-lexer-declaring_namespace nil))
-        (phps-mode-lexer-RETURN_TOKEN "{" (match-beginning 0) (match-end 0)))
-
-       ((looking-at "}")
-        (when phps-mode-lexer-state_stack
-          ;; (message "State stack %s" phps-mode-lexer-state_stack)
-          ;; (message "popping state from } %s at %s-%s" (length 
phps-mode-lexer-state_stack) (match-beginning 0) (match-end 0))
-          (phps-mode-lexer-yy_pop_state)
-          ;; (message "New state: %s" phps-mode-lexer-STATE)
-          )
-        (phps-mode-lexer-RETURN_TOKEN "}" (match-beginning 0) (match-end 0)))
-
-       ((looking-at phps-mode-lexer-BNUM)
-        (let* ((start (match-beginning 0))
-               (end (match-end 0))
-               (data (buffer-substring-no-properties (+ start 2) end))
-               (long-number (string-to-number data 2)))
-          ;; (message "Binary number %s from %s" long-number data)
-          (if (> long-number phps-mode-lexer-long-limit)
-              (phps-mode-lexer-RETURN_TOKEN 'T_DNUMBER start end)
-            (phps-mode-lexer-RETURN_TOKEN 'T_LNUMBER start end))))
-
-       ((looking-at phps-mode-lexer-HNUM)
-        (let* ((start (match-beginning 0))
-               (end (match-end 0))
-               (data (buffer-substring-no-properties (+ start 2) end))
-               (long-number (string-to-number data 16)))
-          ;; (message "Hexadecimal number %s from %s" long-number data)
-          (if (> long-number phps-mode-lexer-long-limit)
-              (phps-mode-lexer-RETURN_TOKEN 'T_DNUMBER start end)
-            (phps-mode-lexer-RETURN_TOKEN 'T_LNUMBER start end))))
-
-       ((or (looking-at phps-mode-lexer-EXPONENT_DNUM)
-            (looking-at phps-mode-lexer-DNUM))
-        (let* ((start (match-beginning 0))
-               (end (match-end 0))
-               (_data (buffer-substring-no-properties start end)))
-          ;; (message "Exponent/double at: %s" _data)
-          (phps-mode-lexer-RETURN_TOKEN 'T_DNUMBER start end)))
-
-       ((looking-at phps-mode-lexer-LNUM)
-        (let* ((start (match-beginning 0))
-               (end (match-end 0))
-               (data (string-to-number (buffer-substring-no-properties start 
end))))
-          ;; (message "Long number: %d" data)
-          (if (> data phps-mode-lexer-long-limit)
-              (phps-mode-lexer-RETURN_TOKEN 'T_DNUMBER start end)
-            (phps-mode-lexer-RETURN_TOKEN 'T_LNUMBER start end))))
-
-       ((looking-at (concat "__CLASS__" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_CLASS_C (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "__TRAIT__" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_TRAIT_C (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "__FUNCTION__" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_FUNC_C (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "__METHOD__" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_METHOD_C (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "__LINE__" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_LINE (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "__FILE__" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_FILE (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "__DIR__" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_DIR (match-beginning 0) (1- 
(match-end 0))))
-       ((looking-at (concat "__NAMESPACE__" phps-mode-lexer-NOT-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_NS_C (match-beginning 0) (1- 
(match-end 0))))
-
-       ((looking-at "\\(//\\|#\\)")
-        (let* ((start (match-beginning 0))
-               (end (match-end 0))
-               (_data (buffer-substring-no-properties start end))
-               (line (buffer-substring-no-properties end (line-end-position))))
-          (if (string-match "\\?>" line)
-              (progn
-                ;; (message "Found comment 1 from %s to %s %s in %s" end (+ 
end (match-beginning 0)) (match-beginning 0) line)
-                (phps-mode-lexer-RETURN_TOKEN 'T_COMMENT start (+ end 
(match-beginning 0)))
-                )
+        (if use-brace
+            (phps-mode-lexer-RETURN_TOKEN "{" start end)
+          (phps-mode-lexer-RETURN_TOKEN data start end))))
+
+     ((and 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
             (progn
-              ;; TODO Handle expecting values here
-              ;; (message "Found comment 2 from %s to %s" start 
(line-end-position))
-              (phps-mode-lexer-RETURN_TOKEN 'T_COMMENT start 
(line-end-position))
-              ))))
-
-       ((looking-at (concat "/\\*\\*" phps-mode-lexer-WHITESPACE))
-        (let* ((start (match-beginning 0))
-               (end (match-end 0))
-               (_data (buffer-substring-no-properties start end)))
-          (let ((string-start (search-forward "*/" nil t))
-                position)
-            (if string-start
-                (setq position string-start)
-              (progn
-                (setq position (point-max))
-                (phps-mode-lexer-MOVE_FORWARD (point-max))))
-            (phps-mode-lexer-RETURN_TOKEN 'T_DOC_COMMENT start position)
-            )))
-
-       ((looking-at "/\\*")
-        (let* ((start (match-beginning 0))
-               (end (match-end 0))
-               (_data (buffer-substring-no-properties start end)))
-          (let ((string-start (search-forward "*/" nil t))
-                position)
-            (if string-start
-                (setq position string-start)
-              (progn
-                (setq position (point-max))
-                (phps-mode-lexer-MOVE_FORWARD (point-max))))
-            (phps-mode-lexer-RETURN_TOKEN 'T_COMMENT start position)
-            )))
-
-       ((looking-at (concat "\\$" phps-mode-lexer-LABEL))
-        (let ((start (match-beginning 0))
-              (end (match-end 0)))
-          (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE start end)))
-
-       ((looking-at phps-mode-lexer-TOKENS)
-        (let* ((start (match-beginning 0))
-               (end (match-end 0))
-               (data (buffer-substring-no-properties start end))
-               (use-brace nil))
-          ;; (message "Found token '%s'" data)
-          (when phps-mode-lexer-declaring_namespace
-            (when (string= data ";")
-              (setq phps-mode-lexer-prepend_trailing_brace t)
-              ;; (message "Set flag prepend trailing brace")
-              ;; (setq use-brace t)
-              )
-            (setq phps-mode-lexer-declaring_namespace nil))
-          (if use-brace
-              (phps-mode-lexer-RETURN_TOKEN "{" start end)
-            (phps-mode-lexer-RETURN_TOKEN data start end))))
-
-       ((looking-at "'")
-        (let* ((start (match-beginning 0))
-               (end (match-end 0))
-               (_data (buffer-substring-no-properties start end))
-               (un-escaped-end (phps-mode-lexer--get-next-unescaped "'")))
-          (if un-escaped-end
-              (progn
-                ;; (message "Single quoted string %s" 
(buffer-substring-no-properties start un-escaped-end))
-                (phps-mode-lexer-RETURN_TOKEN 'T_CONSTANT_ENCAPSED_STRING 
start un-escaped-end))
+              ;; (message "Single quoted string %s" 
(buffer-substring-no-properties start un-escaped-end))
+              (phps-mode-lexer-RETURN_TOKEN 'T_CONSTANT_ENCAPSED_STRING start 
un-escaped-end))
+          (progn
+            ;; Unclosed single quotes
+            ;; (message "Single quoted string never ends..")
+            (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE start 
(point-max))
+            (phps-mode-lexer-MOVE_FORWARD (point-max))))))
+
+     ;; Double quoted string
+     ((and ST_IN_SCRIPTING (looking-at "\""))
+      (let* ((start (match-beginning 0))
+             (end (match-end 0))
+             (_data (buffer-substring-no-properties start end)))
+        (forward-char)
+        ;; Handle the "" case
+        (if (looking-at-p "\"")
             (progn
-              ;; Unclosed single quotes
-              ;; (message "Single quoted string never ends..")
-              (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE start 
(point-max))
-              (phps-mode-lexer-MOVE_FORWARD (point-max))))))
-
-       ;; Double quoted string
-       ((looking-at "\"")
-        (let* ((start (match-beginning 0))
-               (end (match-end 0))
-               (_data (buffer-substring-no-properties start end)))
-          (forward-char)
-          ;; Handle the "" case
-          (if (looking-at-p "\"")
-              (progn
-                ;; (message "Empty double quoted string from %s to %s" start 
(+ start 2))
-                (phps-mode-lexer-RETURN_TOKEN 'T_CONSTANT_ENCAPSED_STRING 
start (+ start 2))
-                (forward-char))
-            (let ((string-start (search-forward-regexp (concat
-                                                        "\\([^\\\\]\""
-                                                        "\\|\\$" 
phps-mode-lexer-LABEL
-                                                        "\\|\\${" 
phps-mode-lexer-LABEL
-                                                        "\\|{\\$" 
phps-mode-lexer-LABEL "\\)")
-                                                       nil t)))
-              ;; Do we find a ending double quote or starting variable?
-              (if string-start
-                  (let ((string-start (match-beginning 0)))
-                    ;; (message "Double quoted string %s" double-quoted-string)
-                    ;; Do we find variable inside quote?
-                    (goto-char string-start)
-                    (if (looking-at "[^\\\\]\"")
-                        (progn
-                          (let ((_double-quoted-string 
(buffer-substring-no-properties start (+ string-start 2))))
-                            ;; (message "Double quoted string: %s" 
_double-quoted-string)
-                            (phps-mode-lexer-RETURN_TOKEN 
'T_CONSTANT_ENCAPSED_STRING start (+ string-start 2))))
+              ;; (message "Empty double quoted string from %s to %s" start (+ 
start 2))
+              (phps-mode-lexer-RETURN_TOKEN 'T_CONSTANT_ENCAPSED_STRING start 
(+ start 2))
+              (forward-char))
+          (let ((string-start (search-forward-regexp (concat
+                                                      "\\([^\\\\]\""
+                                                      "\\|\\$" 
phps-mode-lexer-LABEL
+                                                      "\\|\\${" 
phps-mode-lexer-LABEL
+                                                      "\\|{\\$" 
phps-mode-lexer-LABEL "\\)")
+                                                     nil t)))
+            ;; Do we find a ending double quote or starting variable?
+            (if string-start
+                (let ((string-start (match-beginning 0)))
+                  ;; (message "Double quoted string %s" double-quoted-string)
+                  ;; Do we find variable inside quote?
+                  (goto-char string-start)
+                  (if (looking-at "[^\\\\]\"")
                       (progn
-                        ;; (message "Found variable after '%s'" 
(buffer-substring-no-properties start string-start))
-                        (phps-mode-lexer-BEGIN 
phps-mode-lexer-ST_DOUBLE_QUOTES)
-                        (phps-mode-lexer-RETURN_TOKEN "\"" start (1+ start))
-                        (phps-mode-lexer-RETURN_TOKEN 
'T_ENCAPSED_AND_WHITESPACE (1+ start) string-start))))
-                (progn
-                  ;; (message "Found no ending quote, skipping to end")
-                  (phps-mode-lexer-RETURN_TOKEN 'T_ERROR start (point-max))
-                  (phps-mode-lexer-MOVE_FORWARD (point-max))))))))
-
-       ((looking-at "[`]")
-        ;; (message "Begun backquote at %s-%s" (match-beginning 0) (match-end 
0))
-        (phps-mode-lexer-BEGIN phps-mode-lexer-ST_BACKQUOTE)
-        (phps-mode-lexer-RETURN_TOKEN "`" (match-beginning 0) (match-end 0)))
-
-       ((looking-at phps-mode-lexer-WHITESPACE)
-        (let* ((start (match-beginning 0))
-               (end (match-end 0))
-               (data (buffer-substring-no-properties start end)))
-          (if phps-mode-lexer-PARSER_MODE
-              (phps-mode-lexer-MOVE_FORWARD end)
-            (phps-mode-lexer-RETURN_TOKEN data start end))))
-
-       ((looking-at phps-mode-lexer-LABEL)
-        ;; (message "Adding T_STRING from %s to %s" (match-beginning 0) 
(match-end 0))
-        (phps-mode-lexer-RETURN_TOKEN 'T_STRING (match-beginning 0) (match-end 
0)))
-
-       ((looking-at phps-mode-lexer-TOKENS)
-        (phps-mode-lexer-RETURN_TOKEN (match-string 0) (match-beginning 0) 
(match-end 0)))
-
-       ((looking-at phps-mode-lexer-ANY_CHAR)
-        ;; Unexpected character
-        ;; (message "Unexpected character '%s'" 
(buffer-substring-no-properties (match-beginning 0) (match-end 0)))
-        (phps-mode-lexer-RETURN_TOKEN 'T_ERROR (match-beginning 0) (point-max))
-        (phps-mode-lexer-MOVE_FORWARD (point-max)))
-
-       ))
-
-    ;; ST_LOOKING_FOR_PROPERTY
-    ((= phps-mode-lexer-STATE phps-mode-lexer-ST_LOOKING_FOR_PROPERTY)
-
-      (cond
-
-       ((looking-at phps-mode-lexer-WHITESPACE)
-        (let* ((start (match-beginning 0))
-               (end (match-end 0))
-               (_data (buffer-substring-no-properties start end)))
-          (if phps-mode-lexer-PARSER_MODE
-              (phps-mode-lexer-MOVE_FORWARD end)
-            (phps-mode-lexer-RETURN_TOKEN 'T_WHITESPACE start end))))
-
-       ((looking-at "->")
-        (phps-mode-lexer-RETURN_TOKEN 'T_OBJECT_OPERATOR (match-beginning 0) 
(match-end 0)))
-
-       ((looking-at phps-mode-lexer-LABEL)
-        (let ((start (match-beginning 0))
-              (end (match-end 0)))
-          (phps-mode-lexer-yy_pop_state)
-          (phps-mode-lexer-RETURN_TOKEN 'T_STRING start end)))
+                        (let ((_double-quoted-string 
(buffer-substring-no-properties start (+ string-start 2))))
+                          ;; (message "Double quoted string: %s" 
_double-quoted-string)
+                          (phps-mode-lexer-RETURN_TOKEN 
'T_CONSTANT_ENCAPSED_STRING start (+ string-start 2))))
+                    (progn
+                      ;; (message "Found variable after '%s'" 
(buffer-substring-no-properties start string-start))
+                      (phps-mode-lexer-BEGIN phps-mode-lexer-ST_DOUBLE_QUOTES)
+                      (phps-mode-lexer-RETURN_TOKEN "\"" start (1+ start))
+                      (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE 
(1+ start) string-start))))
+              (progn
+                ;; (message "Found no ending quote, skipping to end")
+                (phps-mode-lexer-RETURN_TOKEN 'T_ERROR start (point-max))
+                (phps-mode-lexer-MOVE_FORWARD (point-max))))))))
 
-       ((looking-at phps-mode-lexer-ANY_CHAR)
-        (let ((_start (match-beginning 0))
-              (end (match-end 0)))
-          (phps-mode-lexer-yy_pop_state)
-          ;; TODO goto restart here?
-          ;; (message "Restart here")
-          (phps-mode-lexer-MOVE_FORWARD end)))
+     ((and ST_IN_SCRIPTING (looking-at "[`]"))
+      ;; (message "Begun backquote at %s-%s" (match-beginning 0) (match-end 0))
+      (phps-mode-lexer-BEGIN phps-mode-lexer-ST_BACKQUOTE)
+      (phps-mode-lexer-RETURN_TOKEN "`" (match-beginning 0) (match-end 0)))
 
-       ))
+     ((and ST_IN_SCRIPTING (looking-at phps-mode-lexer-WHITESPACE))
+      (let* ((start (match-beginning 0))
+             (end (match-end 0))
+             (data (buffer-substring-no-properties start end)))
+        (if phps-mode-lexer-PARSER_MODE
+            (phps-mode-lexer-MOVE_FORWARD end)
+          (phps-mode-lexer-RETURN_TOKEN data start end))))
 
-    ;; ST_DOUBLE_QUOTES
-    ((= phps-mode-lexer-STATE phps-mode-lexer-ST_DOUBLE_QUOTES)
-      (cond
+     ((and ST_IN_SCRIPTING (looking-at phps-mode-lexer-LABEL))
+      ;; (message "Adding T_STRING from %s to %s" (match-beginning 0) 
(match-end 0))
+      (phps-mode-lexer-RETURN_TOKEN 'T_STRING (match-beginning 0) (match-end 
0)))
 
-       ((looking-at "\\${")
-        (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_LOOKING_FOR_VARNAME)
-        (phps-mode-lexer-RETURN_TOKEN 'T_DOLLAR_OPEN_CURLY_BRACES 
(match-beginning 0) (match-end 0)))
+     ((and ST_IN_SCRIPTING (looking-at phps-mode-lexer-TOKENS))
+      (phps-mode-lexer-RETURN_TOKEN (match-string 0) (match-beginning 0) 
(match-end 0)))
 
-       ((looking-at (concat "\\$" phps-mode-lexer-LABEL "->" 
"[a-zA-Z_\x80-\xff]"))
-        (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_LOOKING_FOR_PROPERTY)
-        (forward-char -3)
-        (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (- 
(match-end 0) 3)))
+     ((and ST_IN_SCRIPTING (looking-at phps-mode-lexer-ANY_CHAR))
+      ;; Unexpected character
+      ;; (message "Unexpected character '%s'" (buffer-substring-no-properties 
(match-beginning 0) (match-end 0)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_ERROR (match-beginning 0) (point-max))
+      (phps-mode-lexer-MOVE_FORWARD (point-max)))
 
-       ((looking-at (concat "\\$" phps-mode-lexer-LABEL "\\["))
-        (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_VAR_OFFSET)
-        (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) 
(match-end 0)))
 
-       ((looking-at (concat "\\$" phps-mode-lexer-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) 
(match-end 0)))
+     ;; ST_INITIAL
 
-       ((looking-at "{\\$")
-        (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_IN_SCRIPTING)
-        ;; (message "Starting ST_IN_SCRIPTING from double-quoted string at 
%s-%s" (match-beginning 0) (- (match-end 0) 1))
-        (phps-mode-lexer-RETURN_TOKEN 'T_CURLY_OPEN (match-beginning 0) (- 
(match-end 0) 1)))
 
-       ((looking-at "[\"]")
+     ((and ST_INITIAL (looking-at "<\\?="))
+      (let ((start (match-beginning 0))
+            (end (match-end 0)))
+        (phps-mode-lexer-BEGIN phps-mode-lexer-ST_IN_SCRIPTING)
+        ;; (message "Starting scripting after <?=")
+        (when phps-mode-lexer-PARSER_MODE
+          (phps-mode-lexer-RETURN_TOKEN 'T_ECHO start end))
+        (phps-mode-lexer-RETURN_TOKEN 'T_OPEN_TAG_WITH_ECHO start end)))
+
+     ((and ST_INITIAL (looking-at "<\\?php\\([ \t]\\|\n\\)"))
+      (let ((start (match-beginning 0))
+            (end (match-end 0)))
         (phps-mode-lexer-BEGIN phps-mode-lexer-ST_IN_SCRIPTING)
-        ;; (message "Ended double-quote at %s" (match-beginning 0))
-        (phps-mode-lexer-RETURN_TOKEN "\"" (match-beginning 0) (match-end 0)))
+        ;; (message "Starting scripting after <?php")
+        (when phps-mode-lexer-EXPECTED
+          (phps-mode-lexer-SKIP_TOKEN 'T_OPEN_TAG start end))
+        (phps-mode-lexer-RETURN_TOKEN 'T_OPEN_TAG start end)))
 
-       ((looking-at phps-mode-lexer-ANY_CHAR)
-        (let ((start (point)))
-          (let ((string-start (search-forward-regexp "[^\\\\]\"" nil t)))
-            (if string-start
-                (let* ((end (- (match-end 0) 1))
-                       (double-quoted-string (buffer-substring-no-properties 
start end)))
-                  ;; Do we find variable inside quote?
-                  (if (or (string-match (concat "\\${" phps-mode-lexer-LABEL) 
double-quoted-string)
-                          (string-match (concat "{\\$" phps-mode-lexer-LABEL) 
double-quoted-string)
-                          (string-match (concat "\\$" phps-mode-lexer-LABEL) 
double-quoted-string))
-                      (progn
-                        (let ((variable-start (+ start (match-beginning 0))))
+     ((and ST_INITIAL (looking-at "<\\?"))
+      (when phps-mode-lexer-SHORT_TAGS
+        (let ((start (match-beginning 0))
+              (end (match-end 0)))
+          (phps-mode-lexer-BEGIN phps-mode-lexer-ST_IN_SCRIPTING)
+          (when phps-mode-lexer-EXPECTED
+            (phps-mode-lexer-SKIP_TOKEN 'T_OPEN_TAG start end))
+          ;; (message "Starting scripting after <?")
+          (phps-mode-lexer-RETURN_TOKEN 'T_OPEN_TAG start end))))
+
+     ;; NOTE: mimics inline_char_handler
+     ((and ST_INITIAL (looking-at phps-mode-lexer-ANY_CHAR))
+      (let ((start (match-beginning 0)))
+        (let ((string-start (search-forward "<?" nil t)))
+          (if string-start
+              (phps-mode-lexer-RETURN_TOKEN 'T_INLINE_HTML start (- 
string-start 2))
+            (phps-mode-lexer-RETURN_TOKEN 'T_INLINE_HTML start (point-max))))))
 
-                          ;; (message "Found starting expression inside 
double-quoted string at: %s %s" start variable-start)
-                          (phps-mode-lexer-RETURN_TOKEN 
'T_CONSTANT_ENCAPSED_STRING start variable-start)
-                          ))
+
+     ;; ST_LOOKING_FOR_PROPERTY
+
+
+     ((and ST_LOOKING_FOR_PROPERTY (looking-at phps-mode-lexer-WHITESPACE))
+      (let* ((start (match-beginning 0))
+             (end (match-end 0))
+             (_data (buffer-substring-no-properties start end)))
+        (if phps-mode-lexer-PARSER_MODE
+            (phps-mode-lexer-MOVE_FORWARD end)
+          (phps-mode-lexer-RETURN_TOKEN 'T_WHITESPACE start end))))
+
+     ((and ST_LOOKING_FOR_PROPERTY (looking-at "->"))
+      (phps-mode-lexer-RETURN_TOKEN 'T_OBJECT_OPERATOR (match-beginning 0) 
(match-end 0)))
+
+     ((and ST_LOOKING_FOR_PROPERTY (looking-at phps-mode-lexer-LABEL))
+      (let ((start (match-beginning 0))
+            (end (match-end 0)))
+        (phps-mode-lexer-yy_pop_state)
+        (phps-mode-lexer-RETURN_TOKEN 'T_STRING start end)))
+
+     ((and ST_LOOKING_FOR_PROPERTY (looking-at phps-mode-lexer-ANY_CHAR))
+      (let ((_start (match-beginning 0))
+            (end (match-end 0)))
+        (phps-mode-lexer-yy_pop_state)
+        ;; TODO goto restart here?
+        ;; (message "Restart here")
+        (phps-mode-lexer-MOVE_FORWARD end)))
+
+
+     ;; ST_DOUBLE_QUOTES
+
+
+     ((and ST_DOUBLE_QUOTES (looking-at "\\${"))
+      (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_LOOKING_FOR_VARNAME)
+      (phps-mode-lexer-RETURN_TOKEN 'T_DOLLAR_OPEN_CURLY_BRACES 
(match-beginning 0) (match-end 0)))
+
+     ((and ST_DOUBLE_QUOTES (looking-at (concat "\\$" phps-mode-lexer-LABEL 
"->" "[a-zA-Z_\x80-\xff]")))
+      (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_LOOKING_FOR_PROPERTY)
+      (forward-char -3)
+      (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (- 
(match-end 0) 3)))
+
+     ((and ST_DOUBLE_QUOTES (looking-at (concat "\\$" phps-mode-lexer-LABEL 
"\\[")))
+      (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_VAR_OFFSET)
+      (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (match-end 
0)))
+
+     ((and ST_DOUBLE_QUOTES (looking-at (concat "\\$" phps-mode-lexer-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (match-end 
0)))
+
+     ((and ST_DOUBLE_QUOTES (looking-at "{\\$"))
+      (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_IN_SCRIPTING)
+      ;; (message "Starting ST_IN_SCRIPTING from double-quoted string at 
%s-%s" (match-beginning 0) (- (match-end 0) 1))
+      (phps-mode-lexer-RETURN_TOKEN 'T_CURLY_OPEN (match-beginning 0) (- 
(match-end 0) 1)))
+
+     ((and ST_DOUBLE_QUOTES (looking-at "[\"]"))
+      (phps-mode-lexer-BEGIN phps-mode-lexer-ST_IN_SCRIPTING)
+      ;; (message "Ended double-quote at %s" (match-beginning 0))
+      (phps-mode-lexer-RETURN_TOKEN "\"" (match-beginning 0) (match-end 0)))
+
+     ((and ST_DOUBLE_QUOTES (looking-at phps-mode-lexer-ANY_CHAR))
+      (let ((start (point)))
+        (let ((string-start (search-forward-regexp "[^\\\\]\"" nil t)))
+          (if string-start
+              (let* ((end (- (match-end 0) 1))
+                     (double-quoted-string (buffer-substring-no-properties 
start end)))
+                ;; Do we find variable inside quote?
+                (if (or (string-match (concat "\\${" phps-mode-lexer-LABEL) 
double-quoted-string)
+                        (string-match (concat "{\\$" phps-mode-lexer-LABEL) 
double-quoted-string)
+                        (string-match (concat "\\$" phps-mode-lexer-LABEL) 
double-quoted-string))
                     (progn
-                      (phps-mode-lexer-RETURN_TOKEN 
'T_CONSTANT_ENCAPSED_STRING start end)
-                      ;; (message "Found end of quote at %s-%s, moving ahead 
after '%s'" start end (buffer-substring-no-properties start end))
-                      )))
-              (progn
-                ;; "Found no end of double-quoted region
-                (phps-mode-lexer-RETURN_TOKEN 'T_ERROR start (point-max))
-                (phps-mode-lexer-MOVE_FORWARD (point-max)))))))
+                      (let ((variable-start (+ start (match-beginning 0))))
+
+                        ;; (message "Found starting expression inside 
double-quoted string at: %s %s" start variable-start)
+                        (phps-mode-lexer-RETURN_TOKEN 
'T_CONSTANT_ENCAPSED_STRING start variable-start)
+                        ))
+                  (progn
+                    (phps-mode-lexer-RETURN_TOKEN 'T_CONSTANT_ENCAPSED_STRING 
start end)
+                    ;; (message "Found end of quote at %s-%s, moving ahead 
after '%s'" start end (buffer-substring-no-properties start end))
+                    )))
+            (progn
+              ;; "Found no end of double-quoted region
+              (phps-mode-lexer-RETURN_TOKEN 'T_ERROR start (point-max))
+              (phps-mode-lexer-MOVE_FORWARD (point-max)))))))
 
-       ))
 
-    ;; ST_BACKQUOTE
-    ((= phps-mode-lexer-STATE phps-mode-lexer-ST_BACKQUOTE)
-      (let ((old-start (point)))
-        (cond
+     ;; ST_BACKQUOTE
 
-         ((looking-at "\\${")
-          (phps-mode-lexer-yy_push_state 
phps-mode-lexer-ST_LOOKING_FOR_VARNAME)
-          (phps-mode-lexer-RETURN_TOKEN 'T_DOLLAR_OPEN_CURLY_BRACES 
(match-beginning 0) (match-end 0)))
 
-         ((looking-at (concat "\\$" phps-mode-lexer-LABEL "->" 
"[a-zA-Z_\x80-\xff]"))
-          (phps-mode-lexer-yy_push_state 
phps-mode-lexer-ST_LOOKING_FOR_PROPERTY)
-          (forward-char -3)
-          (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (- 
(match-end 0) 3)))
+     ((and ST_BACKQUOTE (looking-at "\\${"))
+      (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_LOOKING_FOR_VARNAME)
+      (phps-mode-lexer-RETURN_TOKEN 'T_DOLLAR_OPEN_CURLY_BRACES 
(match-beginning 0) (match-end 0)))
 
-         ((looking-at (concat "\\$" phps-mode-lexer-LABEL "\\["))
-          (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_VAR_OFFSET)
-          (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) 
(match-end 0)))
+     ((and ST_BACKQUOTE (looking-at (concat "\\$" phps-mode-lexer-LABEL "->" 
"[a-zA-Z_\x80-\xff]")))
+      (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_LOOKING_FOR_PROPERTY)
+      (forward-char -3)
+      (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (- 
(match-end 0) 3)))
 
-         ((looking-at (concat "\\$" phps-mode-lexer-LABEL))
-          (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) 
(match-end 0)))
+     ((and ST_BACKQUOTE (looking-at (concat "\\$" phps-mode-lexer-LABEL 
"\\[")))
+      (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_VAR_OFFSET)
+      (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (match-end 
0)))
 
-         ((looking-at "{\\$")
-          (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_IN_SCRIPTING)
-          (phps-mode-lexer-RETURN_TOKEN 'T_CURLY_OPEN (match-beginning 0) (- 
(match-end 0) 1)))
+     ((and ST_BACKQUOTE (looking-at (concat "\\$" phps-mode-lexer-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (match-end 
0)))
 
-         ((looking-at "[`]")
-          (phps-mode-lexer-BEGIN phps-mode-lexer-ST_IN_SCRIPTING)
-          (phps-mode-lexer-RETURN_TOKEN "`" (match-beginning 0) (match-end 0)))
+     ((and ST_BACKQUOTE (looking-at "{\\$"))
+      (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_IN_SCRIPTING)
+      (phps-mode-lexer-RETURN_TOKEN 'T_CURLY_OPEN (match-beginning 0) (- 
(match-end 0) 1)))
 
-         ((looking-at phps-mode-lexer-ANY_CHAR)
-          (let ((string-start (search-forward-regexp 
"\\([^\\\\]`\\|\\$\\|{\\)" nil t)))
-            (if string-start
-                (let ((start (- (match-end 0) 1)))
-                  ;; (message "Skipping backquote forward over %s" 
(buffer-substring-no-properties old-start start))
-                  (phps-mode-lexer-RETURN_TOKEN 'T_CONSTANT_ENCAPSED_STRING 
old-start start)
-                  )
-              (progn
-                ;; (message "Found no end of backquote.. skipping to end from 
%s" (buffer-substring-no-properties (point) (point-max)))
-                (phps-mode-lexer-RETURN_TOKEN 'T_ERROR old-start (point-max))
-                (phps-mode-lexer-MOVE_FORWARD (point-max))))))
+     ((and ST_BACKQUOTE (looking-at "[`]"))
+      (phps-mode-lexer-BEGIN phps-mode-lexer-ST_IN_SCRIPTING)
+      (phps-mode-lexer-RETURN_TOKEN "`" (match-beginning 0) (match-end 0)))
 
-         )))
+     ((and ST_BACKQUOTE (looking-at phps-mode-lexer-ANY_CHAR))
+      (let ((string-start (search-forward-regexp "\\([^\\\\]`\\|\\$\\|{\\)" 
nil t)))
+        (if string-start
+            (let ((start (- (match-end 0) 1)))
+              ;; (message "Skipping backquote forward over %s" 
(buffer-substring-no-properties old-start start))
+              (phps-mode-lexer-RETURN_TOKEN 'T_CONSTANT_ENCAPSED_STRING 
old-start start)
+              )
+          (progn
+            ;; (message "Found no end of backquote.. skipping to end from %s" 
(buffer-substring-no-properties (point) (point-max)))
+            (phps-mode-lexer-RETURN_TOKEN 'T_ERROR old-start (point-max))
+            (phps-mode-lexer-MOVE_FORWARD (point-max))))))
 
-    ;; ST_HEREDOC
-    ((= phps-mode-lexer-STATE phps-mode-lexer-ST_HEREDOC)
 
-      (let ((heredoc_label (car phps-mode-lexer-heredoc_label_stack))
-            (old-start (point)))
-        (cond
+     ;; ST_HEREDOC
 
-         ((looking-at "\\${")
-          (phps-mode-lexer-yy_push_state 
phps-mode-lexer-ST_LOOKING_FOR_VARNAME)
-          (phps-mode-lexer-RETURN_TOKEN 'T_DOLLAR_OPEN_CURLY_BRACES 
(match-beginning 0) (match-end 0)))
+     ((and ST_HEREDOC (looking-at "\\${"))
+      (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_LOOKING_FOR_VARNAME)
+      (phps-mode-lexer-RETURN_TOKEN 'T_DOLLAR_OPEN_CURLY_BRACES 
(match-beginning 0) (match-end 0)))
 
-         ((looking-at (concat "\\$" phps-mode-lexer-LABEL "->" 
"[a-zA-Z_\x80-\xff]"))
-          (phps-mode-lexer-yy_push_state 
phps-mode-lexer-ST_LOOKING_FOR_PROPERTY)
-          (forward-char -3)
-          (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (- 
(match-end 0) 3)))
+     ((and ST_HEREDOC (looking-at (concat "\\$" phps-mode-lexer-LABEL "->" 
"[a-zA-Z_\x80-\xff]")))
+      (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_LOOKING_FOR_PROPERTY)
+      (forward-char -3)
+      (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (- 
(match-end 0) 3)))
 
-         ((looking-at (concat "\\$" phps-mode-lexer-LABEL "\\["))
-          (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_VAR_OFFSET)
-          (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) 
(match-end 0)))
+     ((and ST_HEREDOC (looking-at (concat "\\$" phps-mode-lexer-LABEL "\\[")))
+      (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_VAR_OFFSET)
+      (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (match-end 
0)))
 
-         ((looking-at (concat "\\$" phps-mode-lexer-LABEL))
-          (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) 
(match-end 0)))
+     ((and ST_HEREDOC (looking-at (concat "\\$" phps-mode-lexer-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (match-end 
0)))
 
-         ((looking-at (concat "{\\$"))
-          (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_IN_SCRIPTING)
-          (phps-mode-lexer-RETURN_TOKEN 'T_CURLY_OPEN (match-beginning 0) (- 
(match-end 0) 1)))
+     ((and ST_HEREDOC (looking-at (concat "{\\$")))
+      (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_IN_SCRIPTING)
+      (phps-mode-lexer-RETURN_TOKEN 'T_CURLY_OPEN (match-beginning 0) (- 
(match-end 0) 1)))
 
-         ((looking-at phps-mode-lexer-ANY_CHAR)
-          ;; (message "Found nothing useful at '%s' looking at {$ %s" 
(buffer-substring-no-properties (point) (point-max)) (looking-at "{\\$"))
-          ;; Check for $, ${ and {$ forward
-          (let ((string-start (search-forward-regexp (concat "\\(\n" 
heredoc_label ";?\n\\|\\$" phps-mode-lexer-LABEL "\\|{\\$" 
phps-mode-lexer-LABEL "\\|\\${" phps-mode-lexer-LABEL "\\)") nil t)))
-            (if string-start
-                (let* ((start (match-beginning 0))
-                       (end (match-end 0))
-                       (data (buffer-substring-no-properties start end)))
-                  ;; (message "Found something ending at %s" data)
+     ((and ST_HEREDOC (looking-at phps-mode-lexer-ANY_CHAR))
+      ;; (message "Found nothing useful at '%s' looking at {$ %s" 
(buffer-substring-no-properties (point) (point-max)) (looking-at "{\\$"))
+      ;; Check for $, ${ and {$ forward
+      (let ((string-start (search-forward-regexp (concat "\\(\n" heredoc_label 
";?\n\\|\\$" phps-mode-lexer-LABEL "\\|{\\$" phps-mode-lexer-LABEL "\\|\\${" 
phps-mode-lexer-LABEL "\\)") nil t)))
+        (if string-start
+            (let* ((start (match-beginning 0))
+                   (end (match-end 0))
+                   (data (buffer-substring-no-properties start end)))
+              ;; (message "Found something ending at %s" data)
 
-                  (cond
+              (cond
 
-                   ((string-match (concat "\n" heredoc_label ";?\n") data)
+               ((string-match (concat "\n" heredoc_label ";?\n") data)
                                         ;, (message "Found heredoc end at 
%s-%s" start end)
-                    (phps-mode-lexer-BEGIN phps-mode-lexer-ST_END_HEREDOC)
-                    (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE 
old-start start))
+                (phps-mode-lexer-BEGIN phps-mode-lexer-ST_END_HEREDOC)
+                (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE 
old-start start))
 
-                   (t
-                    ;; (message "Found variable at '%s'.. Skipping forward to 
%s" data start)
-                    (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE 
old-start start)
-                    )
+               (t
+                ;; (message "Found variable at '%s'.. Skipping forward to %s" 
data start)
+                (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE 
old-start start)
+                )
 
-                   ))
-              (progn
-                ;; (message "Found no ending of heredoc at %s '%s'" 
heredoc_label (buffer-substring-no-properties (point) (point-max)))
-                (phps-mode-lexer-RETURN_TOKEN 'T_ERROR old-start (point-max))
-                (phps-mode-lexer-MOVE_FORWARD (point-max))
-                ))))
+               ))
+          (progn
+            ;; (message "Found no ending of heredoc at %s '%s'" heredoc_label 
(buffer-substring-no-properties (point) (point-max)))
+            (phps-mode-lexer-RETURN_TOKEN 'T_ERROR old-start (point-max))
+            (phps-mode-lexer-MOVE_FORWARD (point-max))
+            ))))
 
-         )))
 
-    ;; ST_NOWDOC
-    ((= phps-mode-lexer-STATE phps-mode-lexer-ST_NOWDOC)
+     ;; ST_NOWDOC
 
-      (let ((heredoc_label (car phps-mode-lexer-heredoc_label_stack))
-            (old-start (point)))
-        (cond
 
-         ((looking-at phps-mode-lexer-ANY_CHAR)
-          (let ((string-start (search-forward-regexp (concat "\n" 
heredoc_label ";?\n") nil t)))
-            (if string-start
-                (let* ((start (match-beginning 0))
-                       (end (match-end 0))
-                       (_data (buffer-substring-no-properties start end)))
-                  ;; (message "Found something ending at %s" _data)
-                  ;; (message "Found nowdoc end at %s-%s" start end)
-                  (phps-mode-lexer-BEGIN phps-mode-lexer-ST_END_HEREDOC)
-                  (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE 
old-start start)
-                  )
-              (progn
-                ;; (message "Found no ending of nowdoc at %s '%s'" 
heredoc_label (buffer-substring-no-properties (point) (point-max)))
-                (phps-mode-lexer-RETURN_TOKEN 'T_ERROR old-start (point-max))
-                (phps-mode-lexer-MOVE_FORWARD (point-max))
-                ))))
-         )))
+     ((and ST_NOWDOC (looking-at phps-mode-lexer-ANY_CHAR))
+      (let ((string-start (search-forward-regexp (concat "\n" heredoc_label 
";?\n") nil t)))
+        (if string-start
+            (let* ((start (match-beginning 0))
+                   (end (match-end 0))
+                   (_data (buffer-substring-no-properties start end)))
+              ;; (message "Found something ending at %s" _data)
+              ;; (message "Found nowdoc end at %s-%s" start end)
+              (phps-mode-lexer-BEGIN phps-mode-lexer-ST_END_HEREDOC)
+              (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE 
old-start start)
+              )
+          (progn
+            ;; (message "Found no ending of nowdoc at %s '%s'" heredoc_label 
(buffer-substring-no-properties (point) (point-max)))
+            (phps-mode-lexer-RETURN_TOKEN 'T_ERROR old-start (point-max))
+            (phps-mode-lexer-MOVE_FORWARD (point-max))
+            ))))
 
-    ;; ST_LOOKING_FOR_VARNAME
-    ((= phps-mode-lexer-STATE phps-mode-lexer-ST_LOOKING_FOR_VARNAME)
-      (cond
 
-       ((looking-at (concat phps-mode-lexer-LABEL "[\\[}]"))
-        (let ((start (match-beginning 0))
-              (end (- (match-end 0) 1)))
-          ;; (message "Stopped here")
-          (phps-mode-lexer-yy_pop_state)
-          (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_IN_SCRIPTING)
-          (phps-mode-lexer-RETURN_TOKEN 'T_STRING_VARNAME start end)))
+     ;; ST_LOOKING_FOR_VARNAME
 
-       ((looking-at phps-mode-lexer-ANY_CHAR)
+
+     ((and ST_LOOKING_FOR_VARNAME (looking-at (concat phps-mode-lexer-LABEL 
"[\\[}]")))
+      (let ((start (match-beginning 0))
+            (end (- (match-end 0) 1)))
+        ;; (message "Stopped here")
         (phps-mode-lexer-yy_pop_state)
-        (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_IN_SCRIPTING))
+        (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_IN_SCRIPTING)
+        (phps-mode-lexer-RETURN_TOKEN 'T_STRING_VARNAME start end)))
+
+     ((and ST_LOOKING_FOR_VARNAME (looking-at phps-mode-lexer-ANY_CHAR))
+      (phps-mode-lexer-yy_pop_state)
+      (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_IN_SCRIPTING))
+
+
+     ;; ST_END_HEREDOC
 
-       ))
 
-    ;; ST_END_HEREDOC
-    ((= phps-mode-lexer-STATE phps-mode-lexer-ST_END_HEREDOC)
-      (let ((heredoc_label (car phps-mode-lexer-heredoc_label_stack)))
-        (cond
+     ((and ST_END_HEREDOC (looking-at (concat phps-mode-lexer-ANY_CHAR)))
 
-         ((looking-at (concat phps-mode-lexer-ANY_CHAR))
+      (let* ((start (match-beginning 0))
+             (end (+ start (length heredoc_label) 1))
+             (_data (buffer-substring-no-properties start end)))
+        ;; (message "Found ending heredoc at %s, %s of %s" _data 
(thing-at-point 'line) heredoc_label)
+        (pop phps-mode-lexer-heredoc_label_stack)
+        (phps-mode-lexer-BEGIN phps-mode-lexer-ST_IN_SCRIPTING)
+        (phps-mode-lexer-RETURN_TOKEN 'T_END_HEREDOC start end)
+
+        ))
 
-          (let* ((start (match-beginning 0))
-                 (end (+ start (length heredoc_label) 1))
-                 (_data (buffer-substring-no-properties start end)))
-            ;; (message "Found ending heredoc at %s, %s of %s" _data 
(thing-at-point 'line) heredoc_label)
-            (pop phps-mode-lexer-heredoc_label_stack)
-            (phps-mode-lexer-BEGIN phps-mode-lexer-ST_IN_SCRIPTING)
-            (phps-mode-lexer-RETURN_TOKEN 'T_END_HEREDOC start end)
 
-            ))
+     ;; ST_VAR_OFFSET
 
-         )))
 
-    ;; ST_VAR_OFFSET
-    ((= phps-mode-lexer-STATE phps-mode-lexer-ST_VAR_OFFSET)
+     ((and 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 (match-beginning 0) 
(match-end 0)))
 
-      (cond
+     ((and ST_VAR_OFFSET (looking-at (concat "\\$" phps-mode-lexer-LABEL)))
+      (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (match-end 
0)))
 
-       ((looking-at (concat "\\("
-                            phps-mode-lexer-LNUM "\\|"
-                            phps-mode-lexer-HNUM "\\|"
-                            phps-mode-lexer-BNUM "\\)"))
-        (phps-mode-lexer-RETURN_TOKEN 'T_NUM_STRING (match-beginning 0) 
(match-end 0)))
+     ((and ST_VAR_OFFSET (looking-at "\\]"))
+      (phps-mode-lexer-yy_pop_state)
+      (phps-mode-lexer-RETURN_TOKEN "]" (match-beginning 0) (match-end 0)))
 
-       ((looking-at (concat "\\$" phps-mode-lexer-LABEL))
-        (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) 
(match-end 0)))
+     ((and 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)))
+        (phps-mode-lexer-RETURN_TOKEN data start end)))
 
-       ((looking-at "\\]")
+     ((and ST_VAR_OFFSET (looking-at (concat "[ \n\r\t'#]")))
+      (let* ((start (match-beginning 0))
+             (end (- (match-end 0) 1)))
         (phps-mode-lexer-yy_pop_state)
-        (phps-mode-lexer-RETURN_TOKEN "]" (match-beginning 0) (match-end 0)))
-
-       ((looking-at (concat "\\(" phps-mode-lexer-TOKENS
-                            "\\|[{}\"`]\\)"))
-        (let* ((start (match-beginning 0))
-               (end (match-end 0))
-               (data (buffer-substring-no-properties start end)))
-          (phps-mode-lexer-RETURN_TOKEN data start end)))
-
-       ((looking-at (concat "[ \n\r\t'#]"))
-        (let* ((start (match-beginning 0))
-               (end (- (match-end 0) 1)))
-          (phps-mode-lexer-yy_pop_state)
-          (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE start end)))
-
-       ((looking-at phps-mode-lexer-LABEL)
-        (phps-mode-lexer-RETURN_TOKEN 'T_STRING (match-beginning 0) (match-end 
0)))
-
-       ((looking-at phps-mode-lexer-ANY_CHAR)
-        ;; Unexpected character
-        (phps-mode-lexer-RETURN_TOKEN 'T_ERROR (match-beginning 0) (point-max))
-        (phps-mode-lexer-MOVE_FORWARD (point-max)))
-
-       ))))
+        (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE start end)))
+
+     ((and ST_VAR_OFFSET (looking-at phps-mode-lexer-LABEL))
+      (phps-mode-lexer-RETURN_TOKEN 'T_STRING (match-beginning 0) (match-end 
0)))
+
+     ((and ST_VAR_OFFSET (looking-at phps-mode-lexer-ANY_CHAR))
+      ;; Unexpected character
+      (phps-mode-lexer-RETURN_TOKEN 'T_ERROR (match-beginning 0) (point-max))
+      (phps-mode-lexer-MOVE_FORWARD (point-max)))
+
+     )))
 
 (defun phps-mode-lexer-get-tokens ()
   "Get tokens."



reply via email to

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