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

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

[elpa] externals/phps-mode 9748853 267/405: Merged all lexer analysis in


From: Stefan Monnier
Subject: [elpa] externals/phps-mode 9748853 267/405: Merged all lexer analysis into one to better match re2c lexer
Date: Sat, 13 Jul 2019 10:00:29 -0400 (EDT)

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

    Merged all lexer analysis into one to better match re2c lexer
---
 phps-mode-lexer.el | 1598 +++++++++++++++++++++++++---------------------------
 1 file changed, 773 insertions(+), 825 deletions(-)

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



reply via email to

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