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

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

[elpa] externals/phps-mode 95de04b 274/405: New layout for lexer grammar


From: Stefan Monnier
Subject: [elpa] externals/phps-mode 95de04b 274/405: New layout for lexer grammar passes unit tests
Date: Sat, 13 Jul 2019 10:00:31 -0400 (EDT)

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

    New layout for lexer grammar passes unit tests
---
 phps-mode-lexer.el      | 2032 ++++++++++++++++++++++++++++-------------------
 phps-mode-test-lexer.el |    2 +-
 2 files changed, 1202 insertions(+), 832 deletions(-)

diff --git a/phps-mode-lexer.el b/phps-mode-lexer.el
index 99aeac3..6dc8b96 100644
--- a/phps-mode-lexer.el
+++ b/phps-mode-lexer.el
@@ -398,7 +398,7 @@
   ;;   (setq phps-mode-lexer-prepend_trailing_brace nil)
   ;;   (phps-mode-lexer-RETURN_TOKEN "}" (- end 1) end))
 
-  ;; (message "Added token %s %s %s" token start end)
+  ;; (message "Added token %s (%s-%s)" token start end)
 
   ;; Push token start, end, lexer state and state stack to variable
   (push (list start end phps-mode-lexer-STATE phps-mode-lexer-state_stack) 
phps-mode-lexer-states)
@@ -415,18 +415,31 @@
 
 (defvar phps-mode-lexer-re2c-matching-length nil)
 
+(defvar phps-mode-lexer-re2c-matching-data nil)
+
 (defun phps-mode-lexer-re2c-rule (condition body)
   "Process rule with CONDITION and BODY."
   (when condition
-    (let ((matching-length (- (match-end 0) (match-beginning 0))))
-      (when (> matching-length phps-mode-lexer-re2c-matching-length)
-        (setq phps-mode-lexer-re2c-matching-length matching-length)
-        (setq phps-mode-lexer-re2c-matching-body body)))))
+    (let ((match-end (match-end 0))
+          (match-beginning (match-beginning 0)))
+      (let ((matching-length (- match-end match-beginning)))
+        (when (> matching-length 0)
+          (when (or (not phps-mode-lexer-re2c-matching-length)
+                    (> matching-length phps-mode-lexer-re2c-matching-length))
+            (setq phps-mode-lexer-re2c-matching-length matching-length)
+            (setq phps-mode-lexer-re2c-matching-data (match-data))
+            (setq phps-mode-lexer-re2c-matching-body body)))))))
 
 (defun phps-mode-lexer-re2c-execute ()
   "Execute matching body (if any)."
-  (when phps-mode-lexer-re2c-matching-body
-    (funcall phps-mode-lexer-re2c-matching-body)))
+  (if phps-mode-lexer-re2c-matching-body
+      (progn
+        
+        ;; (message "Executing body: %s" phps-mode-lexer-re2c-matching-body)
+        ;; (message "Found match %s" phps-mode-lexer-re2c-matching-data)
+        (set-match-data phps-mode-lexer-re2c-matching-data)
+        (funcall phps-mode-lexer-re2c-matching-body))
+    (error "Failed to lex input")))
 
 
 ;; LEXERS
@@ -454,881 +467,1238 @@
     (setq phps-mode-lexer-re2c-matching-body nil)
     (setq phps-mode-lexer-re2c-matching-length nil)
 
-    
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat "exit" 
phps-mode-lexer-NOT-LABEL))) (lambda() (phps-mode-lexer-RETURN_TOKEN 'T_EXIT 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat "die" 
phps-mode-lexer-NOT-LABEL))) (lambda() phps-mode-lexer-RETURN_TOKEN 'T_DIE 
(match-beginning 0) (1- (match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"function" phps-mode-lexer-NOT-LABEL))) (lambda() phps-mode-lexer-RETURN_TOKEN 
'T_FUNCTION (match-beginning 0) (1- (match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"const" phps-mode-lexer-NOT-LABEL))) (lambda() (phps-mode-lexer-RETURN_TOKEN 
'T_CONST (match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"return" phps-mode-lexer-NOT-LABEL))) (lambda() (phps-mode-lexer-RETURN_TOKEN 
'T_RETURN (match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"yield" phps-mode-lexer-WHITESPACE "from" "[^a-zA-Z0-9_\x80-\xff]"))) (lambda()
-                                                                               
                                                                 
(phps-mode-lexer-RETURN_TOKEN 'T_YIELD_FROM (match-beginning 0) (match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"yield" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                (phps-mode-lexer-RETURN_TOKEN 'T_YIELD 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat "try" 
phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                              (phps-mode-lexer-RETURN_TOKEN 'T_TRY 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"catch" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                (phps-mode-lexer-RETURN_TOKEN 'T_CATCH 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"finally" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                  (phps-mode-lexer-RETURN_TOKEN 'T_FINALLY 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"throw" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                (phps-mode-lexer-RETURN_TOKEN 'T_THROW 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat "if" 
phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                             (phps-mode-lexer-RETURN_TOKEN 'T_IF 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"elseif" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                 (phps-mode-lexer-RETURN_TOKEN 'T_ELSEIF 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"endif" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                (phps-mode-lexer-RETURN_TOKEN 'T_ENDIF 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat "else" 
phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                               (phps-mode-lexer-RETURN_TOKEN 'T_ELSE 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"while" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                (phps-mode-lexer-RETURN_TOKEN 'T_WHILE 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"endwhile" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                   (phps-mode-lexer-RETURN_TOKEN 'T_ENDWHILE 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat "do" 
phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                             (phps-mode-lexer-RETURN_TOKEN 'T_DO 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat "for" 
phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                              (phps-mode-lexer-RETURN_TOKEN 'T_FOR 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"endfor" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                 (phps-mode-lexer-RETURN_TOKEN 'T_ENDFOR 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"foreach" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                  (phps-mode-lexer-RETURN_TOKEN 'T_FOREACH 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"endforeach" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                     (phps-mode-lexer-RETURN_TOKEN 
'T_ENDFOREACH (match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"declare" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                  (phps-mode-lexer-RETURN_TOKEN 'T_DECLARE 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"enddeclare" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                     (phps-mode-lexer-RETURN_TOKEN 
'T_ENDDECLARE (match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"instanceof" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                     (phps-mode-lexer-RETURN_TOKEN 
'T_INSTANCEOF (match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat "as" 
phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                             (phps-mode-lexer-RETURN_TOKEN 'T_AS 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"switch" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                 (phps-mode-lexer-RETURN_TOKEN 'T_SWITCH 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"endswitch" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                    (phps-mode-lexer-RETURN_TOKEN 'T_ENDSWITCH 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat "case" 
phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                               (phps-mode-lexer-RETURN_TOKEN 'T_CASE 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"default" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                  (phps-mode-lexer-RETURN_TOKEN 'T_DEFAULT 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"break" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                (phps-mode-lexer-RETURN_TOKEN 'T_BREAK 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"continue" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                   (phps-mode-lexer-RETURN_TOKEN 'T_CONTINUE 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat "goto" 
phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                               (phps-mode-lexer-RETURN_TOKEN 'T_GOTO 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat "echo" 
phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                               (phps-mode-lexer-RETURN_TOKEN 'T_ECHO 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"print" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                (phps-mode-lexer-RETURN_TOKEN 'T_PRINT 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"class" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                (phps-mode-lexer-RETURN_TOKEN 'T_CLASS 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"interface" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                    (phps-mode-lexer-RETURN_TOKEN 'T_INTERFACE 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"trait" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                (phps-mode-lexer-RETURN_TOKEN 'T_TRAIT 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"extends" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                  (phps-mode-lexer-RETURN_TOKEN 'T_EXTENDS 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"implements" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                     (phps-mode-lexer-RETURN_TOKEN 
'T_IMPLEMENTS (match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at "->")) 
(lambda()
-                                                                         
(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)))
-
-    (phps-mode-lexer-re2c-rule (and (or ST_IN_SCRIPTING 
ST_LOOKING_FOR_PROPERTY)
-                                    (looking-at phps-mode-lexer-WHITESPACE)) 
(lambda()
-                                    (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)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_LOOKING_FOR_PROPERTY (looking-at "->")) 
(lambda()
-                                                                               
  (phps-mode-lexer-RETURN_TOKEN 'T_OBJECT_OPERATOR (match-beginning 0) 
(match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_LOOKING_FOR_PROPERTY (looking-at 
phps-mode-lexer-LABEL)) (lambda()
-                                                                               
                   (let ((start (match-beginning 0))
-                                                                               
                         (end (match-end 0)))
-                                                                               
                     (phps-mode-lexer-yy_pop_state)
-                                                                               
                     (phps-mode-lexer-RETURN_TOKEN 'T_STRING start end))))
-
-    (phps-mode-lexer-re2c-rule (and ST_LOOKING_FOR_PROPERTY (looking-at 
phps-mode-lexer-ANY_CHAR)) (lambda()
-                                                                               
                      (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))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at "::")) 
(lambda()
-                                                                         
(phps-mode-lexer-RETURN_TOKEN 'T_PAAMAYIM_NEKUDOTAYIM (match-beginning 0) 
(match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at "\\\\")) 
(lambda()
-                                                                           
(phps-mode-lexer-RETURN_TOKEN 'T_NS_SEPARATOR (match-beginning 0) (match-end 
0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at "\\.\\.\\.")) 
(lambda()
-                                                                               
 (phps-mode-lexer-RETURN_TOKEN 'T_ELLIPSIS (match-beginning 0) (match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"\\?\\?" "[^\\=]"))) (lambda()
-                                                                               
                (phps-mode-lexer-RETURN_TOKEN 'T_COALESCE (match-beginning 0) 
(1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat "new" 
phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                              (phps-mode-lexer-RETURN_TOKEN 'T_NEW 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"clone" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                (phps-mode-lexer-RETURN_TOKEN 'T_CLONE 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat "var" 
phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                              (phps-mode-lexer-RETURN_TOKEN 'T_VAR 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat "(" 
phps-mode-lexer-TABS_AND_SPACES "\\(int\\|integer\\)" 
phps-mode-lexer-TABS_AND_SPACES ")"))) (lambda()
-                                                                               
                                                                                
            (phps-mode-lexer-RETURN_TOKEN 'T_INT_CAST (match-beginning 0) 
(match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat "(" 
phps-mode-lexer-TABS_AND_SPACES "\\(real\\|double\\|float\\)" 
phps-mode-lexer-TABS_AND_SPACES ")"))) (lambda()
-                                                                               
                                                                                
                    (phps-mode-lexer-RETURN_TOKEN 'T_DOUBLE_CAST 
(match-beginning 0) (match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat "(" 
phps-mode-lexer-TABS_AND_SPACES "\\(string\\|binary\\)" 
phps-mode-lexer-TABS_AND_SPACES ")"))) (lambda()
-                                                                               
                                                                                
              (phps-mode-lexer-RETURN_TOKEN 'T_STRING_CAST (match-beginning 0) 
(match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat "(" 
phps-mode-lexer-TABS_AND_SPACES "array" phps-mode-lexer-TABS_AND_SPACES ")"))) 
(lambda()
-                                                                               
                                                                              
(phps-mode-lexer-RETURN_TOKEN 'T_ARRAY_CAST (match-beginning 0) (match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat "(" 
phps-mode-lexer-TABS_AND_SPACES "object" phps-mode-lexer-TABS_AND_SPACES ")"))) 
(lambda()
-                                                                               
                                                                               
(phps-mode-lexer-RETURN_TOKEN 'T_OBJECT_CAST (match-beginning 0) (match-end 
0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat "(" 
phps-mode-lexer-TABS_AND_SPACES "\\(bool\\|boolean\\)" 
phps-mode-lexer-TABS_AND_SPACES ")"))) (lambda()
-                                                                               
                                                                                
             (phps-mode-lexer-RETURN_TOKEN 'T_BOOL_CAST (match-beginning 0) 
(match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat "(" 
phps-mode-lexer-TABS_AND_SPACES "unset" phps-mode-lexer-TABS_AND_SPACES ")"))) 
(lambda()
-                                                                               
                                                                              
(phps-mode-lexer-RETURN_TOKEN 'T_UNSET_CAST (match-beginning 0) (match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat "eval" 
phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                               (phps-mode-lexer-RETURN_TOKEN 'T_EVAL 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"include" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                  (phps-mode-lexer-RETURN_TOKEN 'T_INCLUDE 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"include_once" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                       (phps-mode-lexer-RETURN_TOKEN 
'T_INCLUDE_ONCE (match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"require" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                  (phps-mode-lexer-RETURN_TOKEN 'T_REQUIRE 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"require_once" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                       (phps-mode-lexer-RETURN_TOKEN 
'T_REQUIRE_ONCE (match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"namespace" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                    (setq phps-mode-lexer-declaring_namespace t)
-                                                                               
                                    )      (phps-mode-lexer-RETURN_TOKEN 
'T_NAMESPACE (match-beginning 0) (1- (match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat "use" 
phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                              (phps-mode-lexer-RETURN_TOKEN 'T_USE 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"insteadof" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                    (phps-mode-lexer-RETURN_TOKEN 'T_INSTEADOF 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"global" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                 (phps-mode-lexer-RETURN_TOKEN 'T_GLOBAL 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"isset" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                (phps-mode-lexer-RETURN_TOKEN 'T_ISSET 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"empty" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                (phps-mode-lexer-RETURN_TOKEN 'T_EMPTY 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"__halt_compiler" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                          (phps-mode-lexer-RETURN_TOKEN 
'T_HALT_COMPILER (match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"static" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                 (phps-mode-lexer-RETURN_TOKEN 'T_STATIC 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"abstract" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                   (phps-mode-lexer-RETURN_TOKEN 'T_ABSTRACT 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"final" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                (phps-mode-lexer-RETURN_TOKEN 'T_FINAL 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"private" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                  (phps-mode-lexer-RETURN_TOKEN 'T_PRIVATE 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"protected" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                    (phps-mode-lexer-RETURN_TOKEN 'T_PROTECTED 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"public" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                 (phps-mode-lexer-RETURN_TOKEN 'T_PUBLIC 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"unset" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                (phps-mode-lexer-RETURN_TOKEN 'T_UNSET 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at "=>")) 
(lambda()
-                                                                         
(phps-mode-lexer-RETURN_TOKEN 'T_DOUBLE_ARROW (match-beginning 0) (match-end 
0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat "list" 
phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                               (phps-mode-lexer-RETURN_TOKEN 'T_LIST 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"array" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                (phps-mode-lexer-RETURN_TOKEN 'T_ARRAY 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"callable" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                   (phps-mode-lexer-RETURN_TOKEN 'T_CALLABLE 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at "\\+\\+")) 
(lambda()
-                                                                             
(phps-mode-lexer-RETURN_TOKEN 'T_INC (match-beginning 0) (match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at "--")) 
(lambda()
-                                                                         
(phps-mode-lexer-RETURN_TOKEN 'T_DEC (match-beginning 0) (match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at "===")) 
(lambda()
-                                                                          
(phps-mode-lexer-RETURN_TOKEN 'T_IS_IDENTICAL (match-beginning 0) (match-end 
0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at "!==")) 
(lambda()
-                                                                          
(phps-mode-lexer-RETURN_TOKEN 'T_IS_NOT_IDENTICAL (match-beginning 0) 
(match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at "==")) 
(lambda()
-                                                                         
(phps-mode-lexer-RETURN_TOKEN 'T_IS_EQUAL (match-beginning 0) (match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at 
"\\(!=\\|<>\\)")) (lambda()
-                                                                               
     (phps-mode-lexer-RETURN_TOKEN 'T_IS_NOT_EQUAL (match-beginning 0) 
(match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at "<=>")) 
(lambda()
-                                                                          
(phps-mode-lexer-RETURN_TOKEN 'T_SPACESHIP (match-beginning 0) (match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at "<=")) 
(lambda()
-                                                                         
(phps-mode-lexer-RETURN_TOKEN 'T_IS_SMALLER_OR_EQUAL (match-beginning 0) 
(match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at ">=")) 
(lambda()
-                                                                         
(phps-mode-lexer-RETURN_TOKEN 'T_IS_GREATER_OR_EQUAL (match-beginning 0) 
(match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at "\\+=")) 
(lambda()
-                                                                           
(phps-mode-lexer-RETURN_TOKEN 'T_PLUS_EQUAL (match-beginning 0) (match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at "-=")) 
(lambda()
-                                                                         
(phps-mode-lexer-RETURN_TOKEN 'T_MINUS_EQUAL (match-beginning 0) (match-end 
0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at "\\*=")) 
(lambda()
-                                                                           
(phps-mode-lexer-RETURN_TOKEN 'T_MUL_EQUAL (match-beginning 0) (match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at 
"\\*\\\\\\*=")) (lambda()
-                                                                               
   (phps-mode-lexer-RETURN_TOKEN 'T_POW_EQUAL (match-beginning 0) (match-end 
0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at "\\*\\\\\\*")) 
(lambda()
-                                                                               
  (phps-mode-lexer-RETURN_TOKEN 'T_POW (match-beginning 0) (match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at "/=")) 
(lambda()
-                                                                         
(phps-mode-lexer-RETURN_TOKEN 'T_DIV_EQUAL (match-beginning 0) (match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at "\\.=")) 
(lambda()
-                                                                           
(phps-mode-lexer-RETURN_TOKEN 'T_CONCAT_EQUAL (match-beginning 0) (match-end 
0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at "%=")) 
(lambda()
-                                                                         
(phps-mode-lexer-RETURN_TOKEN 'T_MOD_EQUAL (match-beginning 0) (match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at "<<=")) 
(lambda()
-                                                                          
(phps-mode-lexer-RETURN_TOKEN 'T_SL_EQUAL (match-beginning 0) (match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at ">>=")) 
(lambda()
-                                                                          
(phps-mode-lexer-RETURN_TOKEN 'T_SR_EQUAL (match-beginning 0) (match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at "&=")) 
(lambda()
-                                                                         
(phps-mode-lexer-RETURN_TOKEN 'T_AND_EQUAL (match-beginning 0) (match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at "|=")) 
(lambda()
-                                                                         
(phps-mode-lexer-RETURN_TOKEN 'T_OR_EQUAL (match-beginning 0) (match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at "\\^=")) 
(lambda()
-                                                                           
(phps-mode-lexer-RETURN_TOKEN 'T_XOR_EQUAL (match-beginning 0) (match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at "\\?\\?=")) 
(lambda()
-                                                                              
(phps-mode-lexer-RETURN_TOKEN 'T_COALESCE_EQUAL (match-beginning 0) (match-end 
0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at "||")) 
(lambda()
-                                                                         
(phps-mode-lexer-RETURN_TOKEN 'T_BOOLEAN_OR (match-beginning 0) (match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at "&&")) 
(lambda()
-                                                                         
(phps-mode-lexer-RETURN_TOKEN 'T_BOOLEAN_AND (match-beginning 0) (match-end 
0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat "OR" 
phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                             (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_OR 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat "AND" 
phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                              (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_AND 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat "XOR" 
phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                              (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_XOR 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat "<<" 
"[^<]"))) (lambda()
-                                                                               
          (phps-mode-lexer-RETURN_TOKEN 'T_SL (match-beginning 0) (1- 
(match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat ">>" 
"[^>]"))) (lambda()
-                                                                               
          (phps-mode-lexer-RETURN_TOKEN 'T_SR (match-beginning 0) (1- 
(match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at "\\?>\n?")) 
(lambda()
-                                                                              
(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))))
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "exit"))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_EXIT (match-beginning 0) (match-end 
0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "die" ))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_DIE (match-beginning 0) (match-end 
0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "function" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_FUNCTION (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "const" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_CONST (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "return" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_RETURN (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "yield" 
phps-mode-lexer-WHITESPACE "from" "[^a-zA-Z0-9_\x80-\xff]")))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_YIELD_FROM (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "yield" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_YIELD (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "try" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_TRY (match-beginning 0) (1- (match-end 
0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "catch" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_CATCH (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "finally" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_FINALLY (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "throw" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_THROW (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "if" phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_IF (match-beginning 0) (1- (match-end 
0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "elseif" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_ELSEIF (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "endif" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_ENDIF (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "else" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_ELSE (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "while" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_WHILE (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "endwhile" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_ENDWHILE (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "do" phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_DO (match-beginning 0) (1- (match-end 
0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "for" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_FOR (match-beginning 0) (1- (match-end 
0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "endfor" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_ENDFOR (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "foreach" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_FOREACH (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "endforeach" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_ENDFOREACH (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "declare" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_DECLARE (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "enddeclare" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_ENDDECLARE (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "instanceof" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_INSTANCEOF (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "as" phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_AS (match-beginning 0) (1- (match-end 
0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "switch" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_SWITCH (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "endswitch" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_ENDSWITCH (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "case" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_CASE (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "default" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_DEFAULT (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "break" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_BREAK (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "continue" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_CONTINUE (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "goto" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_GOTO (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "echo" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_ECHO (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "print" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_PRINT (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "class" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_CLASS (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "interface" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_INTERFACE (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "trait" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_TRAIT (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "extends" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_EXTENDS (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "implements" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_IMPLEMENTS (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "->"))
+     (lambda()
+       (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))))
+
+    (phps-mode-lexer-re2c-rule
+     (and (or ST_IN_SCRIPTING ST_LOOKING_FOR_PROPERTY)
+          (looking-at phps-mode-lexer-WHITESPACE))
+     (lambda()
+       (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)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_LOOKING_FOR_PROPERTY (looking-at "->"))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_OBJECT_OPERATOR (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_LOOKING_FOR_PROPERTY (looking-at phps-mode-lexer-LABEL))
+     (lambda()
+       (let ((start (match-beginning 0))
+             (end (match-end 0)))
+         (phps-mode-lexer-yy_pop_state)
+         (phps-mode-lexer-RETURN_TOKEN 'T_STRING start end))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_LOOKING_FOR_PROPERTY (looking-at phps-mode-lexer-ANY_CHAR))
+     (lambda()
+       (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))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "::"))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_PAAMAYIM_NEKUDOTAYIM (match-beginning 
0) (match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "\\\\"))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_NS_SEPARATOR (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "\\.\\.\\."))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_ELLIPSIS (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "\\?\\?" "[^\\=]")))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_COALESCE (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "new" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_NEW (match-beginning 0) (1- (match-end 
0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "clone" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_CLONE (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "var" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_VAR (match-beginning 0) (1- (match-end 
0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "(" 
phps-mode-lexer-TABS_AND_SPACES "\\(int\\|integer\\)" 
phps-mode-lexer-TABS_AND_SPACES ")")))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_INT_CAST (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "(" 
phps-mode-lexer-TABS_AND_SPACES "\\(real\\|double\\|float\\)" 
phps-mode-lexer-TABS_AND_SPACES ")")))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_DOUBLE_CAST (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "(" 
phps-mode-lexer-TABS_AND_SPACES "\\(string\\|binary\\)" 
phps-mode-lexer-TABS_AND_SPACES ")")))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_STRING_CAST (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "(" 
phps-mode-lexer-TABS_AND_SPACES "array" phps-mode-lexer-TABS_AND_SPACES ")")))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_ARRAY_CAST (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "(" 
phps-mode-lexer-TABS_AND_SPACES "object" phps-mode-lexer-TABS_AND_SPACES ")")))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_OBJECT_CAST (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "(" 
phps-mode-lexer-TABS_AND_SPACES "\\(bool\\|boolean\\)" 
phps-mode-lexer-TABS_AND_SPACES ")")))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_BOOL_CAST (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "(" 
phps-mode-lexer-TABS_AND_SPACES "unset" phps-mode-lexer-TABS_AND_SPACES ")")))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_UNSET_CAST (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "eval" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_EVAL (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "include" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_INCLUDE (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "include_once" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_INCLUDE_ONCE (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "require" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_REQUIRE (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "require_once" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_REQUIRE_ONCE (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "namespace" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (setq phps-mode-lexer-declaring_namespace t)
+       (phps-mode-lexer-RETURN_TOKEN 'T_NAMESPACE (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "use" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_USE (match-beginning 0) (1- (match-end 
0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "insteadof" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_INSTEADOF (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "global" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_GLOBAL (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "isset" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_ISSET (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "empty" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_EMPTY (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "__halt_compiler" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_HALT_COMPILER (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "static" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_STATIC (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "abstract" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_ABSTRACT (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "final" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_FINAL (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "private" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_PRIVATE (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "protected" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_PROTECTED (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "public" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_PUBLIC (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "unset" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_UNSET (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "=>"))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_DOUBLE_ARROW (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "list" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_LIST (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "array" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_ARRAY (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "callable" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_CALLABLE (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "\\+\\+"))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_INC (match-beginning 0) (match-end 
0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "--"))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_DEC (match-beginning 0) (match-end 
0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "==="))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_IS_IDENTICAL (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "!=="))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_IS_NOT_IDENTICAL (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "=="))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_IS_EQUAL (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "\\(!=\\|<>\\)"))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_IS_NOT_EQUAL (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "<=>"))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_SPACESHIP (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "<="))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_IS_SMALLER_OR_EQUAL (match-beginning 
0) (match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at ">="))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_IS_GREATER_OR_EQUAL (match-beginning 
0) (match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "\\+="))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_PLUS_EQUAL (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "-="))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_MINUS_EQUAL (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "\\*="))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_MUL_EQUAL (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "\\*\\\\\\*="))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_POW_EQUAL (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "\\*\\\\\\*"))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_POW (match-beginning 0) (match-end 
0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "/="))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_DIV_EQUAL (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "\\.="))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_CONCAT_EQUAL (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "%="))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_MOD_EQUAL (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "<<="))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_SL_EQUAL (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at ">>="))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_SR_EQUAL (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "&="))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_AND_EQUAL (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "|="))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_OR_EQUAL (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "\\^="))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_XOR_EQUAL (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "\\?\\?="))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_COALESCE_EQUAL (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "||"))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_BOOLEAN_OR (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "&&"))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_BOOLEAN_AND (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "OR" phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_OR (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "AND" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_AND (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "XOR" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_XOR (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "<<" "[^<]")))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_SL (match-beginning 0) (1- (match-end 
0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat ">>" "[^>]")))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_SR (match-beginning 0) (1- (match-end 
0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "\\?>\n?"))
+     (lambda()
+       (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
-    (phps-mode-lexer-re2c-rule (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))) (lambda()
-                                                                               
                                                                                
                                                                            
(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))))
-
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at "{")) (lambda()
-                                                                        
(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)))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at "}")) (lambda()
-                                                                        (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)))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at 
phps-mode-lexer-BNUM)) (lambda()
-                                                                               
          (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)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at 
phps-mode-lexer-HNUM)) (lambda()
-                                                                               
          (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)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (or (looking-at 
phps-mode-lexer-EXPONENT_DNUM)
-                                                        (looking-at 
phps-mode-lexer-DNUM))) (lambda()
-                                                                               
               (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))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at 
phps-mode-lexer-LNUM)) (lambda()
-                                                                               
          (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)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"__CLASS__" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                    (phps-mode-lexer-RETURN_TOKEN 'T_CLASS_C 
(match-beginning 0) (1- (match-end 0)))))
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"__TRAIT__" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                    (phps-mode-lexer-RETURN_TOKEN 'T_TRAIT_C 
(match-beginning 0) (1- (match-end 0)))))
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"__FUNCTION__" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                       (phps-mode-lexer-RETURN_TOKEN 'T_FUNC_C 
(match-beginning 0) (1- (match-end 0)))))
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"__METHOD__" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                     (phps-mode-lexer-RETURN_TOKEN 'T_METHOD_C 
(match-beginning 0) (1- (match-end 0)))))
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"__LINE__" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                   (phps-mode-lexer-RETURN_TOKEN 'T_LINE 
(match-beginning 0) (1- (match-end 0)))))
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"__FILE__" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                   (phps-mode-lexer-RETURN_TOKEN 'T_FILE 
(match-beginning 0) (1- (match-end 0)))))
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"__DIR__" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                  (phps-mode-lexer-RETURN_TOKEN 'T_DIR 
(match-beginning 0) (1- (match-end 0)))))
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"__NAMESPACE__" phps-mode-lexer-NOT-LABEL))) (lambda()
-                                                                               
                                        (phps-mode-lexer-RETURN_TOKEN 'T_NS_C 
(match-beginning 0) (1- (match-end 0)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at 
"\\(//\\|#\\)")) (lambda()
-                                                                               
    (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))
-                                                                               
          )))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat 
"/\\*\\*" phps-mode-lexer-WHITESPACE))) (lambda()
-                                                                               
                                   (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)
-                                                                               
                                       ))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at "/\\*")) 
(lambda()
-                                                                           
(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)
-                                                                               
))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at (concat "\\$" 
phps-mode-lexer-LABEL))) (lambda()
-                                                                               
                          (let ((start (match-beginning 0))
-                                                                               
                                (end (match-end 0)))
-                                                                               
                            (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE start 
end))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at 
phps-mode-lexer-TOKENS)) (lambda()
-                                                                               
            (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)))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at "'")) (lambda()
-                                                                        (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)))))))
+    (phps-mode-lexer-re2c-rule
+     (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)))
+     (lambda()
+       (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))))
+
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "{"))
+     (lambda()
+       (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))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "}"))
+     (lambda()
+       (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))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at phps-mode-lexer-BNUM))
+     (lambda()
+       (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)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at phps-mode-lexer-HNUM))
+     (lambda()
+       (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)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (or (looking-at phps-mode-lexer-EXPONENT_DNUM)
+                              (looking-at phps-mode-lexer-DNUM)))
+     (lambda()
+       (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))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at phps-mode-lexer-LNUM))
+     (lambda()
+       (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)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "__CLASS__" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_CLASS_C (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "__TRAIT__" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_TRAIT_C (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "__FUNCTION__" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_FUNC_C (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "__METHOD__" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_METHOD_C (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "__LINE__" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_LINE (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "__FILE__" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_FILE (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "__DIR__" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_DIR (match-beginning 0) (1- (match-end 
0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "__NAMESPACE__" 
phps-mode-lexer-NOT-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_NS_C (match-beginning 0) (1- 
(match-end 0)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "\\(//\\|#\\)"))
+     (lambda()
+       (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))
+             )))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "/\\*\\*" 
phps-mode-lexer-WHITESPACE)))
+     (lambda()
+       (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)
+           ))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "/\\*"))
+     (lambda()
+       (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)
+           ))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at (concat "\\$" phps-mode-lexer-LABEL)))
+     (lambda()
+       (let ((start (match-beginning 0))
+             (end (match-end 0)))
+         (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE start end))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at phps-mode-lexer-TOKENS))
+     (lambda()
+       (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)))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "'"))
+     (lambda()
+       (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
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at "\"")) 
(lambda()
-                                                                         (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
-                                                                               
    ;; (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)))))))))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at "[`]")) 
(lambda()
-                                                                          ;; 
(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)))
-
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at 
phps-mode-lexer-LABEL)) (lambda()
-                                                                               
           ;; (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))))
-
-    ((and ST_IN_SCRIPTING (looking-at phps-mode-lexer-TOKENS))
-     (phps-mode-lexer-RETURN_TOKEN (match-string 0) (match-beginning 0) 
(match-end 0)))
-
-    (phps-mode-lexer-re2c-rule (and ST_IN_SCRIPTING (looking-at 
phps-mode-lexer-ANY_CHAR)) (lambda()
-                                                                               
              ;; 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)))
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "\""))
+     (lambda()
+       (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
+                 ;; (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)))))))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at "[`]"))
+     (lambda()
+       ;; (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))))
+
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at phps-mode-lexer-LABEL))
+     (lambda()
+       ;; (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))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at phps-mode-lexer-TOKENS))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN (match-string 0) (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_IN_SCRIPTING (looking-at phps-mode-lexer-ANY_CHAR))
+     (lambda()
+       ;; 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_INITIAL
 
 
-    (phps-mode-lexer-re2c-rule (and ST_INITIAL (looking-at "<\\?=")) (lambda()
-                                                                       (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))))
-
-    (phps-mode-lexer-re2c-rule (and ST_INITIAL (looking-at "<\\?php\\([ 
\t]\\|\n\\)")) (lambda()
-                                                                               
          (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))))
-
-    (phps-mode-lexer-re2c-rule (and ST_INITIAL (looking-at "<\\?")) (lambda()
-                                                                      (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)))))
+    (phps-mode-lexer-re2c-rule
+     (and ST_INITIAL (looking-at "<\\?="))
+     (lambda()
+       (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))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_INITIAL (looking-at "<\\?php\\([ \t]\\|\n\\)"))
+     (lambda()
+       (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))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_INITIAL (looking-at "<\\?"))
+     (lambda()
+       (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
-    (phps-mode-lexer-re2c-rule (and ST_INITIAL (looking-at 
phps-mode-lexer-ANY_CHAR)) (lambda()
-                                                                               
         (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)))))))
+    (phps-mode-lexer-re2c-rule
+     (and ST_INITIAL (looking-at phps-mode-lexer-ANY_CHAR))
+     (lambda()
+       (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_DOUBLE_QUOTES
 
 
-    (phps-mode-lexer-re2c-rule (and ST_DOUBLE_QUOTES (looking-at "\\${")) 
(lambda()
-                                                                            
(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)))
-
-    (phps-mode-lexer-re2c-rule (and ST_DOUBLE_QUOTES (looking-at (concat "\\$" 
phps-mode-lexer-LABEL "->" "[a-zA-Z_\x80-\xff]"))) (lambda()
-                                                                               
                                                     
(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)))
-
-    (phps-mode-lexer-re2c-rule (and ST_DOUBLE_QUOTES (looking-at (concat "\\$" 
phps-mode-lexer-LABEL "\\["))) (lambda()
-                                                                               
                                 (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)))
-
-    (phps-mode-lexer-re2c-rule (and ST_DOUBLE_QUOTES (looking-at (concat "\\$" 
phps-mode-lexer-LABEL))) (lambda()
-                                                                               
                           (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE 
(match-beginning 0) (match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_DOUBLE_QUOTES (looking-at "{\\$")) 
(lambda()
-                                                                            
(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)))
-
-    (phps-mode-lexer-re2c-rule (and ST_DOUBLE_QUOTES (looking-at "[\"]")) 
(lambda()
-                                                                            
(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)))
-
-    (phps-mode-lexer-re2c-rule (and ST_DOUBLE_QUOTES (looking-at 
phps-mode-lexer-ANY_CHAR)) (lambda()
-                                                                               
               (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))))))))
+    (phps-mode-lexer-re2c-rule
+     (and ST_DOUBLE_QUOTES (looking-at "\\${"))
+     (lambda()
+       (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))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_DOUBLE_QUOTES (looking-at (concat "\\$" phps-mode-lexer-LABEL 
"->" "[a-zA-Z_\x80-\xff]")))
+     (lambda()
+       (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))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_DOUBLE_QUOTES (looking-at (concat "\\$" phps-mode-lexer-LABEL 
"\\[")))
+     (lambda()
+       (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))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_DOUBLE_QUOTES (looking-at (concat "\\$" phps-mode-lexer-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_DOUBLE_QUOTES (looking-at "{\\$"))
+     (lambda()
+       (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))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_DOUBLE_QUOTES (looking-at "[\"]"))
+     (lambda()
+       (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))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_DOUBLE_QUOTES (looking-at phps-mode-lexer-ANY_CHAR))
+     (lambda()
+       (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))))))))
 
 
     ;; ST_BACKQUOTE
 
 
-    (phps-mode-lexer-re2c-rule (and ST_BACKQUOTE (looking-at "\\${")) (lambda()
-                                                                        
(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)))
-
-    (phps-mode-lexer-re2c-rule (and ST_BACKQUOTE (looking-at (concat "\\$" 
phps-mode-lexer-LABEL "->" "[a-zA-Z_\x80-\xff]"))) (lambda()
-                                                                               
                                                 (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)))
-
-    (phps-mode-lexer-re2c-rule (and ST_BACKQUOTE (looking-at (concat "\\$" 
phps-mode-lexer-LABEL "\\["))) (lambda()
-                                                                               
                             (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)))
-
-    (phps-mode-lexer-re2c-rule (and ST_BACKQUOTE (looking-at (concat "\\$" 
phps-mode-lexer-LABEL))) (lambda()
-                                                                               
                       (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE 
(match-beginning 0) (match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_BACKQUOTE (looking-at "{\\$")) (lambda()
-                                                                        
(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)))
-
-    (phps-mode-lexer-re2c-rule (and ST_BACKQUOTE (looking-at "[`]")) (lambda()
-                                                                       
(phps-mode-lexer-BEGIN phps-mode-lexer-ST_IN_SCRIPTING)
-                                                                       )      
(phps-mode-lexer-RETURN_TOKEN "`" (match-beginning 0) (match-end 0)))
-
-    (phps-mode-lexer-re2c-rule (and ST_BACKQUOTE (looking-at 
phps-mode-lexer-ANY_CHAR)) (lambda()
-                                                                               
           (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)))))))
+    (phps-mode-lexer-re2c-rule
+     (and ST_BACKQUOTE (looking-at "\\${"))
+     (lambda()
+       (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))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_BACKQUOTE (looking-at (concat "\\$" phps-mode-lexer-LABEL "->" 
"[a-zA-Z_\x80-\xff]")))
+     (lambda()
+       (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))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_BACKQUOTE (looking-at (concat "\\$" phps-mode-lexer-LABEL "\\[")))
+     (lambda()
+       (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))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_BACKQUOTE (looking-at (concat "\\$" phps-mode-lexer-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_BACKQUOTE (looking-at "{\\$"))
+     (lambda()
+       (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))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_BACKQUOTE (looking-at "[`]"))
+     (lambda()
+       (phps-mode-lexer-BEGIN phps-mode-lexer-ST_IN_SCRIPTING)
+       (phps-mode-lexer-RETURN_TOKEN "`" (match-beginning 0) (match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_BACKQUOTE (looking-at phps-mode-lexer-ANY_CHAR))
+     (lambda()
+       (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-re2c-rule (and ST_HEREDOC (looking-at "\\${")) (lambda()
-                                                                      
(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)))
-
-    (phps-mode-lexer-re2c-rule (and ST_HEREDOC (looking-at (concat "\\$" 
phps-mode-lexer-LABEL "->" "[a-zA-Z_\x80-\xff]"))) (lambda()
-                                                                               
                                               (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)))
-
-    (phps-mode-lexer-re2c-rule (and ST_HEREDOC (looking-at (concat "\\$" 
phps-mode-lexer-LABEL "\\["))) (lambda()
-                                                                               
                           (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)))
-
-    (phps-mode-lexer-re2c-rule (and ST_HEREDOC (looking-at (concat "\\$" 
phps-mode-lexer-LABEL))) (lambda()
-                                                                               
                     (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 
0) (match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_HEREDOC (looking-at (concat "{\\$"))) 
(lambda()
-                                                                               
(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)))
-
-    (phps-mode-lexer-re2c-rule (and ST_HEREDOC (looking-at 
phps-mode-lexer-ANY_CHAR)) (lambda()
-                                                                               
         ;; (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)
+    (phps-mode-lexer-re2c-rule
+     (and ST_HEREDOC (looking-at "\\${"))
+     (lambda()
+       (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))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_HEREDOC (looking-at (concat "\\$" phps-mode-lexer-LABEL "->" 
"[a-zA-Z_\x80-\xff]")))
+     (lambda()
+       (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))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_HEREDOC (looking-at (concat "\\$" phps-mode-lexer-LABEL "\\[")))
+     (lambda()
+       (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))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_HEREDOC (looking-at (concat "\\$" phps-mode-lexer-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_HEREDOC (looking-at (concat "{\\$")))
+     (lambda()
+       (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))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_HEREDOC (looking-at phps-mode-lexer-ANY_CHAR))
+     (lambda()
+       ;; (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))
-                                                                               
               )))))
+                ))
+           (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-re2c-rule (and ST_NOWDOC (looking-at 
phps-mode-lexer-ANY_CHAR)) (lambda()
-                                                                               
        (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))
-                                                                               
              )))))
+    (phps-mode-lexer-re2c-rule
+     (and ST_NOWDOC (looking-at phps-mode-lexer-ANY_CHAR))
+     (lambda()
+       (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-re2c-rule (and ST_LOOKING_FOR_VARNAME (looking-at (concat 
phps-mode-lexer-LABEL "[\\[}]"))) (lambda()
-                                                                               
                                    (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))))
+    (phps-mode-lexer-re2c-rule
+     (and ST_LOOKING_FOR_VARNAME (looking-at (concat phps-mode-lexer-LABEL 
"[\\[}]")))
+     (lambda()
+       (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))))
 
-    ((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))
+    (phps-mode-lexer-re2c-rule
+     (and ST_LOOKING_FOR_VARNAME (looking-at phps-mode-lexer-ANY_CHAR))
+     (lambda()
+       (phps-mode-lexer-yy_pop_state)
+       (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_IN_SCRIPTING)))
 
 
     ;; ST_END_HEREDOC
 
 
-    (phps-mode-lexer-re2c-rule (and ST_END_HEREDOC (looking-at (concat 
phps-mode-lexer-ANY_CHAR))) (lambda()
+    (phps-mode-lexer-re2c-rule
+     (and ST_END_HEREDOC (looking-at (concat phps-mode-lexer-ANY_CHAR)))
+     (lambda()
 
-                                                                               
                      (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
 
 
-    (phps-mode-lexer-re2c-rule (and ST_VAR_OFFSET (looking-at (concat "\\("
-                                                                      
phps-mode-lexer-LNUM "\\|"
-                                                                      
phps-mode-lexer-HNUM "\\|"
-                                                                      
phps-mode-lexer-BNUM "\\)"))) (lambda()
-                                                                               
                       (phps-mode-lexer-RETURN_TOKEN 'T_NUM_STRING 
(match-beginning 0) (match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_VAR_OFFSET (looking-at (concat "\\$" 
phps-mode-lexer-LABEL))) (lambda()
-                                                                               
                        (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE 
(match-beginning 0) (match-end 0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_VAR_OFFSET (looking-at "\\]")) (lambda()
-                                                                        
(phps-mode-lexer-yy_pop_state)
-                                                                        )      
(phps-mode-lexer-RETURN_TOKEN "]" (match-beginning 0) (match-end 0)))
-
-    (phps-mode-lexer-re2c-rule (and ST_VAR_OFFSET (looking-at (concat "\\(" 
phps-mode-lexer-TOKENS
-                                                                      
"\\|[{}\"`]\\)"))) (lambda()
-                                                                               
            (let* ((start (match-beginning 0))
-                                                                               
                   (end (match-end 0))
-                                                                               
                   (data (buffer-substring-no-properties start end)))
-                                                                               
              (phps-mode-lexer-RETURN_TOKEN data start end))))
-
-    (phps-mode-lexer-re2c-rule (and ST_VAR_OFFSET (looking-at (concat "[ 
\n\r\t'#]"))) (lambda()
-                                                                               
          (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))))
-
-    (phps-mode-lexer-re2c-rule (and ST_VAR_OFFSET (looking-at 
phps-mode-lexer-LABEL)) (lambda()
-                                                                               
         (phps-mode-lexer-RETURN_TOKEN 'T_STRING (match-beginning 0) (match-end 
0))))
-
-    (phps-mode-lexer-re2c-rule (and ST_VAR_OFFSET (looking-at 
phps-mode-lexer-ANY_CHAR)) (lambda()
-                                                                               
            ;; Unexpected character
-                                                                               
            (phps-mode-lexer-RETURN_TOKEN 'T_ERROR (match-beginning 0) 
(point-max))
-                                                                               
            )      (phps-mode-lexer-MOVE_FORWARD (point-max)))
-
-    (phps-mode-lexer-re2c-execute)
-
-    ))
+    (phps-mode-lexer-re2c-rule
+     (and ST_VAR_OFFSET (looking-at (concat "\\("
+                                            phps-mode-lexer-LNUM "\\|"
+                                            phps-mode-lexer-HNUM "\\|"
+                                            phps-mode-lexer-BNUM "\\)")))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_NUM_STRING (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_VAR_OFFSET (looking-at (concat "\\$" phps-mode-lexer-LABEL)))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) 
(match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_VAR_OFFSET (looking-at "\\]"))
+     (lambda()
+       (phps-mode-lexer-yy_pop_state)
+       (phps-mode-lexer-RETURN_TOKEN "]" (match-beginning 0) (match-end 0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_VAR_OFFSET (looking-at (concat "\\(" phps-mode-lexer-TOKENS
+                                            "\\|[{}\"`]\\)")))
+     (lambda()
+       (let* ((start (match-beginning 0))
+              (end (match-end 0))
+              (data (buffer-substring-no-properties start end)))
+         (phps-mode-lexer-RETURN_TOKEN data start end))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_VAR_OFFSET (looking-at (concat "[ \n\r\t'#]")))
+     (lambda()
+       (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))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_VAR_OFFSET (looking-at phps-mode-lexer-LABEL))
+     (lambda()
+       (phps-mode-lexer-RETURN_TOKEN 'T_STRING (match-beginning 0) (match-end 
0))))
+
+    (phps-mode-lexer-re2c-rule
+     (and ST_VAR_OFFSET (looking-at phps-mode-lexer-ANY_CHAR))
+     (lambda()
+       ;; Unexpected character
+       (phps-mode-lexer-RETURN_TOKEN 'T_ERROR (match-beginning 0) (point-max))
+       (phps-mode-lexer-MOVE_FORWARD (point-max))))
+
+    (phps-mode-lexer-re2c-execute)))
 
 (defun phps-mode-lexer-get-tokens ()
   "Get tokens."
diff --git a/phps-mode-test-lexer.el b/phps-mode-test-lexer.el
index d247375..ed7142a 100644
--- a/phps-mode-test-lexer.el
+++ b/phps-mode-test-lexer.el
@@ -406,7 +406,7 @@
 (defun phps-mode-test-lexer ()
   "Run test for lexer."
   ;; (message "-- Running all tests for lexer... --\n")
-  ;; (setq debug-on-error t)
+  (setq debug-on-error t)
   ;; (setq phps-mode-functions-verbose t)
   (phps-mode-test-lexer-script-boundaries)
   (phps-mode-test-lexer-simple-tokens)



reply via email to

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