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

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

[elpa] externals/phps-mode e89976c: Error-handling and presentation of l


From: Christian Johansson
Subject: [elpa] externals/phps-mode e89976c: Error-handling and presentation of lexer errors
Date: Thu, 19 Dec 2019 06:30:44 -0500 (EST)

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

    Error-handling and presentation of lexer errors
---
 docs/todo.md                 |    1 +
 phps-mode-analyzer.el        | 2610 ++++++++++++++++++++++--------------------
 phps-mode.el                 |    6 +-
 test/phps-mode-test-lexer.el |    6 +-
 4 files changed, 1365 insertions(+), 1258 deletions(-)

diff --git a/docs/todo.md b/docs/todo.md
index d69500b..7746bed 100644
--- a/docs/todo.md
+++ b/docs/todo.md
@@ -11,5 +11,6 @@
 * Eldoc support (0%)
 * Flymake support (0%)
 * PSR-2 auto-formatting tool based on lexer tokens (0%)
+* Alternative indentation for inline control structures (0%)
 
 [Back to start](../../../)
diff --git a/phps-mode-analyzer.el b/phps-mode-analyzer.el
index 36d5bf1..56176da 100644
--- a/phps-mode-analyzer.el
+++ b/phps-mode-analyzer.el
@@ -183,7 +183,7 @@
     ;; (message "Going back to poppped state %s" old-state)
     (if old-state
         (phps-mode-lexer-BEGIN old-state)
-      (display-warning 'phps-mode "PHPs Lexer Error - Going back to nil?"))))
+      (signal 'error (list "PHPs Lexer Error - Going back from state to 
nil?")))))
 
 (defun phps-mode-lexer-MOVE_FORWARD (position)
   "Move forward to POSITION."
@@ -384,17 +384,11 @@
 
 (defun phps-mode-lexer-RETURN_TOKEN (token start end)
   "Push TOKEN to list with START and END."
-(phps-mode-analyzer-emit-token token start end))
+  (phps-mode-analyzer-emit-token token start end))
 
 (defun phps-mode-analyzer-emit-token (token start end)
   "Emit TOKEN with START and END."
 
-  ;; Colourize token
-  (let ((token-syntax-color (phps-mode-lexer-get-token-syntax-color token)))
-    (if token-syntax-color
-        (phps-mode-lexer-set-region-syntax-color start end token-syntax-color)
-      (phps-mode-lexer-clear-region-syntax-color start end)))
-
   ;; (when (and
   ;;        (equal token 'T_INLINE_HTML)
   ;;        phps-mode-inline-mmm-submode
@@ -442,14 +436,12 @@
         ;; (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")))
+    (signal 'error (list "Found no matching lexer rule to execute"))))
 
 
 ;; LEXERS
 
-;; If multiple rules match, re2c prefers the longest match. If rules match the 
same string, the earlier rule has priority.
-;; @see http://re2c.org/manual/syntax/syntax.html
-(define-lex-analyzer phps-mode-lexer-lex-analyzer
+(define-lex-analyzer phps-mode-analyzer-lexer
   "Elisp port of original Zend re2c lexer."
   t
 
@@ -467,1264 +459,1284 @@
             (let ((start (car (cdr token)))
                   (end (cdr (cdr token)))
                   (token-name (car token)))
+
+              ;; Apply syntax color on token
+              (let ((token-syntax-color 
(phps-mode-lexer-get-token-syntax-color token-name)))
+                (if token-syntax-color
+                    (phps-mode-lexer-set-region-syntax-color start end 
token-syntax-color)
+                  (phps-mode-lexer-clear-region-syntax-color start end)))
+
               (semantic-lex-push-token
                (semantic-lex-token token-name start end))))
 
           (phps-mode-lexer-MOVE_FORWARD (point-max)))
 
-      (phps-mode-debug-message (message "Running lexer from %s" old-start))
-      
-      (let ((heredoc_label (car phps-mode-lexer-heredoc_label_stack))
-            (SHEBANG (equal phps-mode-lexer-STATE 'SHEBANG))
-            (ST_IN_SCRIPTING (equal phps-mode-lexer-STATE 'ST_IN_SCRIPTING))
-            (ST_INITIAL (equal phps-mode-lexer-STATE 'ST_INITIAL))
-            (ST_LOOKING_FOR_PROPERTY (equal phps-mode-lexer-STATE 
'ST_LOOKING_FOR_PROPERTY))
-            (ST_DOUBLE_QUOTES (equal phps-mode-lexer-STATE 'ST_DOUBLE_QUOTES))
-            (ST_BACKQUOTE (equal phps-mode-lexer-STATE 'ST_BACKQUOTE))
-            (ST_HEREDOC (equal phps-mode-lexer-STATE 'ST_HEREDOC))
-            (ST_NOWDOC (equal phps-mode-lexer-STATE 'ST_NOWDOC))
-            (ST_LOOKING_FOR_VARNAME (equal phps-mode-lexer-STATE 
'ST_LOOKING_FOR_VARNAME))
-            (ST_END_HEREDOC (equal phps-mode-lexer-STATE 'ST_END_HEREDOC))
-            (ST_VAR_OFFSET (equal phps-mode-lexer-STATE 'ST_VAR_OFFSET)))
-
-        ;; Reset re2c flags
-        (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 "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 "fn"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_FN (match-beginning 0) (match-end 
0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "function"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_FUNCTION (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "const"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_CONST (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "return"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_RETURN (match-beginning 0) 
(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 "yield"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_YIELD (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "try"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_TRY (match-beginning 0) (match-end 
0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "catch"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_CATCH (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "finally"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_FINALLY (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "throw"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_THROW (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "if"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_IF (match-beginning 0) (match-end 
0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "elseif"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_ELSEIF (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "endif"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_ENDIF (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "else"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_ELSE (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "while"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_WHILE (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "endwhile"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_ENDWHILE (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "do"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_DO (match-beginning 0) (match-end 
0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "for"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_FOR (match-beginning 0) (match-end 
0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "endfor"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_ENDFOR (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "foreach"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_FOREACH (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "endforeach"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_ENDFOREACH (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "declare"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_DECLARE (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "enddeclare"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_ENDDECLARE (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "instanceof"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_INSTANCEOF (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "as"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_AS (match-beginning 0) (match-end 
0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "switch"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_SWITCH (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "endswitch"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_ENDSWITCH (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "case"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_CASE (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "default"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_DEFAULT (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "break"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_BREAK (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "continue"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_CONTINUE (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "goto"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_GOTO (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "echo"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_ECHO (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "print"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_PRINT (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "class"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_CLASS (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "interface"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_INTERFACE (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "trait"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_TRAIT (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "extends"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_EXTENDS (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "implements"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_IMPLEMENTS (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "->"))
-         (lambda()
-           (phps-mode-lexer-yy_push_state '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-wy-macros-CG '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 ((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 "\\?\\?"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_COALESCE (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "new"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_NEW (match-beginning 0) (match-end 
0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "clone"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_CLONE (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "var"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_VAR (match-beginning 0) (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
-                "\\(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
-                "\\(real\\)"
-                phps-mode-lexer-TABS_AND_SPACES
-                ")")))
-         (lambda()
-           (when (phps-mode-wy-macros-CG 'PARSER_MODE)
-             (display-warning 'phps-mode "PHPs Lexer Error - The (real) cast 
is deprecated, use (float) instead"))
-           (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 "eval"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_EVAL (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "include"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_INCLUDE (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "include_once"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_INCLUDE_ONCE (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "require"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_REQUIRE (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "require_once"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_REQUIRE_ONCE (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "namespace"))
-         (lambda()
-           (setq phps-mode-lexer-declaring_namespace t)
-           (phps-mode-lexer-RETURN_TOKEN 'T_NAMESPACE (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "use"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_USE (match-beginning 0) (match-end 
0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "insteadof"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_INSTEADOF (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "global"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_GLOBAL (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "isset"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_ISSET (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "empty"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_EMPTY (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "__halt_compiler"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_HALT_COMPILER (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "static"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_STATIC (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "abstract"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_ABSTRACT (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "final"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_FINAL (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "private"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_PRIVATE (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "protected"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_PROTECTED (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "public"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_PUBLIC (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "unset"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_UNSET (match-beginning 0) 
(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 "list"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_LIST (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "array"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_ARRAY (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "callable"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_CALLABLE (match-beginning 0) 
(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 "OR"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_OR (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "AND"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_AND (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "XOR"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_XOR (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 (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 (match-beginning 0) (match-end 
0))))
-
-        (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()
-           (phps-mode-lexer-yy_push_state 'ST_IN_SCRIPTING)
+      (phps-mode-lexer-set-region-syntax-color
+       (point-min)
+       (point-max)
+       (list 'font-lock-face 'font-lock-warning-face))
+
+      (semantic-lex-push-token
+       (semantic-lex-token 'T_ERROR (point-min) (point-max))))))
+
+;; If multiple rules match, re2c prefers the longest match. If rules match the 
same string, the earlier rule has priority.
+;; @see http://re2c.org/manual/syntax/syntax.html
+(define-lex-analyzer phps-mode-analyzer-re2c-lexer
+  "Elisp port of original Zend re2c lexer."
+  t
+
+  (let ((old-start (point)))
+
+    (phps-mode-debug-message (message "Running lexer from %s" old-start))
+    
+    (let ((heredoc_label (car phps-mode-lexer-heredoc_label_stack))
+          (SHEBANG (equal phps-mode-lexer-STATE 'SHEBANG))
+          (ST_IN_SCRIPTING (equal phps-mode-lexer-STATE 'ST_IN_SCRIPTING))
+          (ST_INITIAL (equal phps-mode-lexer-STATE 'ST_INITIAL))
+          (ST_LOOKING_FOR_PROPERTY (equal phps-mode-lexer-STATE 
'ST_LOOKING_FOR_PROPERTY))
+          (ST_DOUBLE_QUOTES (equal phps-mode-lexer-STATE 'ST_DOUBLE_QUOTES))
+          (ST_BACKQUOTE (equal phps-mode-lexer-STATE 'ST_BACKQUOTE))
+          (ST_HEREDOC (equal phps-mode-lexer-STATE 'ST_HEREDOC))
+          (ST_NOWDOC (equal phps-mode-lexer-STATE 'ST_NOWDOC))
+          (ST_LOOKING_FOR_VARNAME (equal phps-mode-lexer-STATE 
'ST_LOOKING_FOR_VARNAME))
+          (ST_END_HEREDOC (equal phps-mode-lexer-STATE 'ST_END_HEREDOC))
+          (ST_VAR_OFFSET (equal phps-mode-lexer-STATE 'ST_VAR_OFFSET)))
+
+      ;; Reset re2c flags
+      (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 "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 "fn"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_FN (match-beginning 0) (match-end 
0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "function"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_FUNCTION (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "const"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_CONST (match-beginning 0) (match-end 
0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "return"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_RETURN (match-beginning 0) 
(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 "yield"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_YIELD (match-beginning 0) (match-end 
0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "try"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_TRY (match-beginning 0) (match-end 
0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "catch"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_CATCH (match-beginning 0) (match-end 
0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "finally"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_FINALLY (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "throw"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_THROW (match-beginning 0) (match-end 
0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "if"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_IF (match-beginning 0) (match-end 
0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "elseif"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_ELSEIF (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "endif"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_ENDIF (match-beginning 0) (match-end 
0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "else"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_ELSE (match-beginning 0) (match-end 
0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "while"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_WHILE (match-beginning 0) (match-end 
0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "endwhile"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_ENDWHILE (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "do"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_DO (match-beginning 0) (match-end 
0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "for"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_FOR (match-beginning 0) (match-end 
0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "endfor"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_ENDFOR (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "foreach"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_FOREACH (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "endforeach"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_ENDFOREACH (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "declare"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_DECLARE (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "enddeclare"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_ENDDECLARE (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "instanceof"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_INSTANCEOF (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "as"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_AS (match-beginning 0) (match-end 
0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "switch"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_SWITCH (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "endswitch"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_ENDSWITCH (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "case"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_CASE (match-beginning 0) (match-end 
0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "default"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_DEFAULT (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "break"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_BREAK (match-beginning 0) (match-end 
0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "continue"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_CONTINUE (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "goto"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_GOTO (match-beginning 0) (match-end 
0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "echo"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_ECHO (match-beginning 0) (match-end 
0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "print"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_PRINT (match-beginning 0) (match-end 
0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "class"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_CLASS (match-beginning 0) (match-end 
0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "interface"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_INTERFACE (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "trait"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_TRAIT (match-beginning 0) (match-end 
0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "extends"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_EXTENDS (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "implements"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_IMPLEMENTS (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "->"))
+       (lambda()
+         (phps-mode-lexer-yy_push_state '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-wy-macros-CG '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 ((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 "\\?\\?"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_COALESCE (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "new"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_NEW (match-beginning 0) (match-end 
0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "clone"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_CLONE (match-beginning 0) (match-end 
0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "var"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_VAR (match-beginning 0) (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
+              "\\(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
+              "\\(real\\)"
+              phps-mode-lexer-TABS_AND_SPACES
+              ")")))
+       (lambda()
+         (when (phps-mode-wy-macros-CG 'PARSER_MODE)
+           (signal 'phps-mode (list "PHPs Lexer Error - The (real) cast is 
deprecated, use (float) instead")))
+         (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 "eval"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_EVAL (match-beginning 0) (match-end 
0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "include"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_INCLUDE (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "include_once"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_INCLUDE_ONCE (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "require"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_REQUIRE (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "require_once"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_REQUIRE_ONCE (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "namespace"))
+       (lambda()
+         (setq phps-mode-lexer-declaring_namespace t)
+         (phps-mode-lexer-RETURN_TOKEN 'T_NAMESPACE (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "use"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_USE (match-beginning 0) (match-end 
0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "insteadof"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_INSTEADOF (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "global"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_GLOBAL (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "isset"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_ISSET (match-beginning 0) (match-end 
0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "empty"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_EMPTY (match-beginning 0) (match-end 
0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "__halt_compiler"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_HALT_COMPILER (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "static"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_STATIC (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "abstract"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_ABSTRACT (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "final"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_FINAL (match-beginning 0) (match-end 
0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "private"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_PRIVATE (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "protected"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_PROTECTED (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "public"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_PUBLIC (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "unset"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_UNSET (match-beginning 0) (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 "list"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_LIST (match-beginning 0) (match-end 
0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "array"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_ARRAY (match-beginning 0) (match-end 
0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "callable"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_CALLABLE (match-beginning 0) 
(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 "OR"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_OR (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "AND"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_AND (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "XOR"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_XOR (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 (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 (match-beginning 0) (match-end 
0))))
+
+      (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))
-           (phps-mode-lexer-RETURN_TOKEN "{" (match-beginning 0) (match-end 
0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and (or ST_DOUBLE_QUOTES ST_BACKQUOTE ST_HEREDOC) (looking-at 
"\\${"))
-         (lambda()
-           (phps-mode-lexer-yy_push_state '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_IN_SCRIPTING (looking-at "}"))
-         (lambda()
-           (when phps-mode-lexer-state_stack
-             (phps-mode-lexer-yy_pop_state))
-           (phps-mode-lexer-RETURN_TOKEN "}" (match-beginning 0) (match-end 
0))))
-
-        (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 '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 phps-mode-lexer-ANY_CHAR))
-         (lambda()
+           (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()
+         (phps-mode-lexer-yy_push_state '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 (or ST_DOUBLE_QUOTES ST_BACKQUOTE ST_HEREDOC) (looking-at "\\${"))
+       (lambda()
+         (phps-mode-lexer-yy_push_state '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_IN_SCRIPTING (looking-at "}"))
+       (lambda()
+         (when phps-mode-lexer-state_stack
+           (phps-mode-lexer-yy_pop_state))
+         (phps-mode-lexer-RETURN_TOKEN "}" (match-beginning 0) (match-end 0))))
+
+      (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 'ST_IN_SCRIPTING)))
-
-        (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-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 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_VAR_OFFSET (looking-at "\\([0]\\|[1-9][0-9]*\\)"))
-         (lambda()
-           (let ((start (match-beginning 0))
-                 (end (match-end 0)))
-             (phps-mode-lexer-RETURN_TOKEN 'T_NUM_STRING start end))))
-
-        (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_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 "__CLASS__"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_CLASS_C (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "__TRAIT__"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_TRAIT_C (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "__FUNCTION__"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_FUNC_C (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "__METHOD__"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_METHOD_C (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "__LINE__"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_LINE (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "__FILE__"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_FILE (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "__DIR__"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_DIR (match-beginning 0) (match-end 
0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at "__NAMESPACE__"))
-         (lambda()
-           (phps-mode-lexer-RETURN_TOKEN 'T_NS_C (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and SHEBANG (looking-at (concat "#!.*" phps-mode-lexer-NEWLINE)))
-         (lambda()
-           (phps-mode-lexer-BEGIN 'ST_INITIAL)))
-
-        (phps-mode-lexer-re2c-rule
-         (and SHEBANG (looking-at phps-mode-lexer-ANY_CHAR))
-         (lambda()
-           (phps-mode-lexer-BEGIN '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 'ST_IN_SCRIPTING)
-             (when (phps-mode-wy-macros-CG '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-yy_push_state '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 phps-mode-lexer-ANY_CHAR))
+       (lambda()
+         (phps-mode-lexer-yy_pop_state)
+         (phps-mode-lexer-yy_push_state 'ST_IN_SCRIPTING)))
+
+      (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-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 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_VAR_OFFSET (looking-at "\\([0]\\|[1-9][0-9]*\\)"))
+       (lambda()
+         (let ((start (match-beginning 0))
+               (end (match-end 0)))
+           (phps-mode-lexer-RETURN_TOKEN 'T_NUM_STRING start end))))
+
+      (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_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 "__CLASS__"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_CLASS_C (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "__TRAIT__"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_TRAIT_C (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "__FUNCTION__"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_FUNC_C (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "__METHOD__"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_METHOD_C (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "__LINE__"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_LINE (match-beginning 0) (match-end 
0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "__FILE__"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_FILE (match-beginning 0) (match-end 
0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "__DIR__"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_DIR (match-beginning 0) (match-end 
0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at "__NAMESPACE__"))
+       (lambda()
+         (phps-mode-lexer-RETURN_TOKEN 'T_NS_C (match-beginning 0) (match-end 
0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and SHEBANG (looking-at (concat "#!.*" phps-mode-lexer-NEWLINE)))
+       (lambda()
+         (phps-mode-lexer-BEGIN 'ST_INITIAL)))
+
+      (phps-mode-lexer-re2c-rule
+       (and SHEBANG (looking-at phps-mode-lexer-ANY_CHAR))
+       (lambda()
+         (phps-mode-lexer-BEGIN '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 'ST_IN_SCRIPTING)
+           (when (phps-mode-wy-macros-CG '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 (concat "<\\?php\\([ \t]\\|" 
phps-mode-lexer-NEWLINE "\\)")))
+       (lambda()
+         (let ((start (match-beginning 0))
+               (end (match-end 0)))
+           (phps-mode-lexer-BEGIN '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 "<\\?php"))
+       (lambda()
+         (let ((start (match-beginning 0))
+               (end (match-end 0)))
 
-        (phps-mode-lexer-re2c-rule
-         (and ST_INITIAL (looking-at (concat "<\\?php\\([ \t]\\|" 
phps-mode-lexer-NEWLINE "\\)")))
-         (lambda()
+           ;; Allow <?php followed by end of file.
+           (cond
+
+            ((equal end (point-max))
+             (phps-mode-lexer-BEGIN 'ST_IN_SCRIPTING)
+             (phps-mode-lexer-RETURN_OR_SKIP_TOKEN
+              'T_OPEN_TAG
+              start
+              end))
+
+            ((phps-mode-wy-macros-CG 'SHORT_TAGS)
+             (phps-mode-lexer-yyless 3)
+             (setq end (- end 3))
+             (phps-mode-lexer-BEGIN 'ST_IN_SCRIPTING)
+             (phps-mode-lexer-RETURN_OR_SKIP_TOKEN
+              'T_OPEN_TAG
+              start
+              end))
+
+            (t
+             (phps-mode-anaylzer-inline-char-handler))))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_INITIAL (looking-at "<\\?"))
+       (lambda()
+         (when (phps-mode-wy-macros-CG 'SHORT_TAGS)
            (let ((start (match-beginning 0))
                  (end (match-end 0)))
              (phps-mode-lexer-BEGIN '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 "<\\?php"))
-         (lambda()
-           (let ((start (match-beginning 0))
-                 (end (match-end 0)))
-
-             ;; Allow <?php followed by end of file.
-             (cond
-
-              ((equal end (point-max))
-               (phps-mode-lexer-BEGIN 'ST_IN_SCRIPTING)
-               (phps-mode-lexer-RETURN_OR_SKIP_TOKEN
-                'T_OPEN_TAG
-                start
-                end))
-
-              ((phps-mode-wy-macros-CG 'SHORT_TAGS)
-               (phps-mode-lexer-yyless 3)
-               (setq end (- end 3))
-               (phps-mode-lexer-BEGIN 'ST_IN_SCRIPTING)
-               (phps-mode-lexer-RETURN_OR_SKIP_TOKEN
-                'T_OPEN_TAG
-                start
-                end))
-
-              (t
-               (phps-mode-anaylzer-inline-char-handler))))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_INITIAL (looking-at "<\\?"))
-         (lambda()
-           (when (phps-mode-wy-macros-CG 'SHORT_TAGS)
-             (let ((start (match-beginning 0))
-                   (end (match-end 0)))
-               (phps-mode-lexer-BEGIN '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 phps-mode-lexer-ANY_CHAR))
-         (lambda()
-           (phps-mode-anaylzer-inline-char-handler)))
-
-        (phps-mode-lexer-re2c-rule
-         (and (or ST_DOUBLE_QUOTES ST_HEREDOC ST_BACKQUOTE)
-              (looking-at
-               (concat
-                "\\$"
-                phps-mode-lexer-LABEL
-                "->"
-                "[a-zA-Z_\x80-\xff]")))
-         (lambda()
-           (phps-mode-lexer-yy_push_state '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 (or ST_DOUBLE_QUOTES ST_HEREDOC ST_BACKQUOTE)
-              (looking-at
-               (concat
-                "\\$"
-                phps-mode-lexer-LABEL
-                "\\[")))
-         (lambda()
-           (phps-mode-lexer-yy_push_state 'ST_VAR_OFFSET)
-           (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) 
(match-end 0))))
-
-        (phps-mode-lexer-re2c-rule
-         (and (or ST_IN_SCRIPTING ST_DOUBLE_QUOTES ST_HEREDOC ST_BACKQUOTE 
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()
+             ;; (message "Starting scripting after <?")
+             (phps-mode-lexer-RETURN_TOKEN 'T_OPEN_TAG start end)))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_INITIAL (looking-at phps-mode-lexer-ANY_CHAR))
+       (lambda()
+         (phps-mode-anaylzer-inline-char-handler)))
+
+      (phps-mode-lexer-re2c-rule
+       (and (or ST_DOUBLE_QUOTES ST_HEREDOC ST_BACKQUOTE)
+            (looking-at
+             (concat
+              "\\$"
+              phps-mode-lexer-LABEL
+              "->"
+              "[a-zA-Z_\x80-\xff]")))
+       (lambda()
+         (phps-mode-lexer-yy_push_state '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 (or ST_DOUBLE_QUOTES ST_HEREDOC ST_BACKQUOTE)
+            (looking-at
+             (concat
+              "\\$"
+              phps-mode-lexer-LABEL
+              "\\[")))
+       (lambda()
+         (phps-mode-lexer-yy_push_state 'ST_VAR_OFFSET)
+         (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) 
(match-end 0))))
+
+      (phps-mode-lexer-re2c-rule
+       (and (or ST_IN_SCRIPTING ST_DOUBLE_QUOTES ST_HEREDOC ST_BACKQUOTE 
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 "]" (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 (or ST_IN_SCRIPTING ST_VAR_OFFSET) (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 "\\(#\\|//\\)"))
-         (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
-                   (phps-mode-lexer-RETURN_TOKEN 'T_COMMENT start (+ end 
(match-beginning 0))))
+           (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE start 
end))))
+
+      (phps-mode-lexer-re2c-rule
+       (and (or ST_IN_SCRIPTING ST_VAR_OFFSET) (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 "\\(#\\|//\\)"))
+       (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
-                 ;; 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))
-                  (doc-com (looking-at-p (concat "/\\*\\*" 
phps-mode-lexer-WHITESPACE))))
-             (let ((string-start (search-forward "*/" nil t)))
-               (if string-start
-                   (if doc-com
-                       (phps-mode-lexer-RETURN_TOKEN 'T_DOC_COMMENT start 
(match-end 0))
-                     (phps-mode-lexer-RETURN_TOKEN 'T_COMMENT start (match-end 
0)))
-                 (progn
-                   (display-warning 'phps-mode
-                                    (format
-                                     "PHPs Lexer Error - Unterminated comment 
starting at %s"
-                                     (point)))
-                   (phps-mode-lexer-MOVE_FORWARD (point-max))))))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_IN_SCRIPTING (looking-at (concat "\\?>" 
phps-mode-lexer-NEWLINE "?")))
-         (lambda()
-           (let ((start (match-beginning 0))
-                 (end (match-end 0)))
-             (when (= (- end start) 3)
-               (setq end (1- end)))
-             (phps-mode-lexer-BEGIN 'ST_INITIAL)
-             (when (phps-mode-wy-macros-CG '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 "'"))
-         (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
-                   (phps-mode-lexer-RETURN_TOKEN 'T_CONSTANT_ENCAPSED_STRING 
start un-escaped-end))
+                 (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))
+                (doc-com (looking-at-p (concat "/\\*\\*" 
phps-mode-lexer-WHITESPACE))))
+           (let ((string-start (search-forward "*/" nil t)))
+             (if string-start
+                 (if doc-com
+                     (phps-mode-lexer-RETURN_TOKEN 'T_DOC_COMMENT start 
(match-end 0))
+                   (phps-mode-lexer-RETURN_TOKEN 'T_COMMENT start (match-end 
0)))
                (progn
-                 ;; Unclosed single quotes
-                 (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))
-                  (open-quote t))
-
-             ;; Move forward from the double-quote
-             (forward-char)
-
-             (while open-quote
-               (let ((string-start
-                      (search-forward-regexp
-                       (concat
-                        "\\(\""
-                        "\\|\\$" phps-mode-lexer-LABEL
-                        "\\|\\${" phps-mode-lexer-LABEL
-                        "\\|{\\$" phps-mode-lexer-LABEL "\\)")
-                       nil t)))
-
-                 ;; Do we find a ending double quote or starting variable?
-                 (if string-start
-                     (let ((string-start (match-beginning 0))
-                           (is-escaped nil))
-
-                       ;; Go to character before match start
-                       (goto-char (1- string-start))
-
-                       ;; Store whether character is escaped or not
-                       (setq is-escaped (looking-at-p "\\\\"))
-
-                       ;; Do we find variable inside quote?
-                       (goto-char string-start)
-
-                       ;; Process character if it's not escaped
-                       (if is-escaped
-                           (forward-char 1)
-                         (setq open-quote nil)
-                         (if (looking-at "\"")
-                             (let ((_double-quoted-string 
(buffer-substring-no-properties start (+ string-start 1))))
-                               ;; (message "Double quoted string: %s" 
_double-quoted-string)
-                               (phps-mode-lexer-RETURN_TOKEN 
'T_CONSTANT_ENCAPSED_STRING start (+ string-start 1)))
-                           ;; (message "Found variable after '%s'" 
(buffer-substring-no-properties start string-start))
-                           (phps-mode-lexer-BEGIN '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
-                     (display-warning 'phps-mode (format "Found no ending of 
quote at %s-%s" start (point)))
-                     (phps-mode-lexer-MOVE_FORWARD (point-max))
-                     (setq open-quote nil))))))))
-
-        (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 'ST_NOWDOC))
+                 (signal 'phps-mode (list (format
+                                 "PHPs Lexer Error - Unterminated comment 
starting at %s"
+                                 (point))))))))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_IN_SCRIPTING (looking-at (concat "\\?>" phps-mode-lexer-NEWLINE 
"?")))
+       (lambda()
+         (let ((start (match-beginning 0))
+               (end (match-end 0)))
+           (when (= (- end start) 3)
+             (setq end (1- end)))
+           (phps-mode-lexer-BEGIN 'ST_INITIAL)
+           (when (phps-mode-wy-macros-CG '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 "'"))
+       (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
-                 (if (string= (substring data 0 1) "\"")
-                     (setq heredoc_label (substring data 1 (- (length data) 
1)))
-                   (setq heredoc_label data))
-                 (phps-mode-lexer-BEGIN 'ST_HEREDOC)))
-
-             ;; Check for ending label on the next line
-             (when (string= (buffer-substring-no-properties end (+ end (length 
heredoc_label))) heredoc_label)
-               (phps-mode-lexer-BEGIN '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()
-           ;; (message "Begun backquote at %s-%s" (match-beginning 0) 
(match-end 0))
-           (phps-mode-lexer-BEGIN 'ST_BACKQUOTE)
-           (phps-mode-lexer-RETURN_TOKEN "`" (match-beginning 0) (match-end 
0))))
-
-        (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 'ST_IN_SCRIPTING)
-             (phps-mode-lexer-RETURN_TOKEN 'T_END_HEREDOC start end))))
-
-        (phps-mode-lexer-re2c-rule
-         (and (or ST_DOUBLE_QUOTES ST_BACKQUOTE ST_HEREDOC) (looking-at 
(concat "{\\$")))
-         (lambda()
-           (phps-mode-lexer-yy_push_state 'ST_IN_SCRIPTING)
-           (phps-mode-lexer-RETURN_TOKEN 'T_CURLY_OPEN (match-beginning 0) (- 
(match-end 0) 1))))
+                 (phps-mode-lexer-RETURN_TOKEN 'T_CONSTANT_ENCAPSED_STRING 
start un-escaped-end))
+             (progn
+               ;; Unclosed single quotes
+               (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))
+                (open-quote t))
+
+           ;; Move forward from the double-quote
+           (forward-char)
+
+           (while open-quote
+             (let ((string-start
+                    (search-forward-regexp
+                     (concat
+                      "\\(\""
+                      "\\|\\$" phps-mode-lexer-LABEL
+                      "\\|\\${" phps-mode-lexer-LABEL
+                      "\\|{\\$" phps-mode-lexer-LABEL "\\)")
+                     nil t)))
+
+               ;; Do we find a ending double quote or starting variable?
+               (if string-start
+                   (let ((string-start (match-beginning 0))
+                         (is-escaped nil))
 
-        (phps-mode-lexer-re2c-rule
-         (and ST_DOUBLE_QUOTES (looking-at "[\"]"))
-         (lambda()
-           (phps-mode-lexer-BEGIN 'ST_IN_SCRIPTING)
-           ;; (message "Ended double-quote at %s" (match-beginning 0))
-           (phps-mode-lexer-RETURN_TOKEN "\"" (match-beginning 0) (match-end 
0))))
+                     ;; Go to character before match start
+                     (goto-char (1- string-start))
 
-        (phps-mode-lexer-re2c-rule
-         (and ST_BACKQUOTE (looking-at "[`]"))
-         (lambda()
-           (phps-mode-lexer-BEGIN 'ST_IN_SCRIPTING)
-           (phps-mode-lexer-RETURN_TOKEN "`" (match-beginning 0) (match-end 
0))))
+                     ;; Store whether character is escaped or not
+                     (setq is-escaped (looking-at-p "\\\\"))
 
-        (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))
-                         )))
+                     (goto-char string-start)
+
+                     ;; Process character if it's not escaped
+                     (if is-escaped
+                         (forward-char 1)
+                       (setq open-quote nil)
+                       (if (looking-at "\"")
+                           (let ((_double-quoted-string 
(buffer-substring-no-properties start (+ string-start 1))))
+                             ;; (message "Double quoted string: %s" 
_double-quoted-string)
+                             (phps-mode-lexer-RETURN_TOKEN 
'T_CONSTANT_ENCAPSED_STRING start (+ string-start 1)))
+                         ;; (message "Found variable after '%s'" 
(buffer-substring-no-properties start string-start))
+                         (phps-mode-lexer-BEGIN '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
-                   (display-warning 'phps-mode (format "Found no ending of 
double quoted region starting at %s" start))
-                   (phps-mode-lexer-MOVE_FORWARD (point-max))))))))
-
-        (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)
-                   )
+                   (signal 'error (list (format "Found no ending of quote at 
%s-%s" start (point))))
+                   (setq open-quote nil))))))))
+
+      (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
-                 (display-warning 'phps-mode (format "Found no ending of 
backquoted string starting at %s" (point)))
-                 (phps-mode-lexer-MOVE_FORWARD (point-max)))))))
-
-        (phps-mode-lexer-re2c-rule
-         (and ST_HEREDOC (looking-at phps-mode-lexer-ANY_CHAR))
-         (lambda()
-           ;; 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)))
+                 (setq heredoc_label (substring data 1 (- (length data) 1)))
+                 (phps-mode-lexer-BEGIN '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 '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 '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()
+         ;; (message "Begun backquote at %s-%s" (match-beginning 0) (match-end 
0))
+         (phps-mode-lexer-BEGIN 'ST_BACKQUOTE)
+         (phps-mode-lexer-RETURN_TOKEN "`" (match-beginning 0) (match-end 0))))
+
+      (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 'ST_IN_SCRIPTING)
+           (phps-mode-lexer-RETURN_TOKEN 'T_END_HEREDOC start end))))
+
+      (phps-mode-lexer-re2c-rule
+       (and (or ST_DOUBLE_QUOTES ST_BACKQUOTE ST_HEREDOC) (looking-at (concat 
"{\\$")))
+       (lambda()
+         (phps-mode-lexer-yy_push_state '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_DOUBLE_QUOTES (looking-at "[\"]"))
+       (lambda()
+         (phps-mode-lexer-BEGIN '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_BACKQUOTE (looking-at "[`]"))
+       (lambda()
+         (phps-mode-lexer-BEGIN 'ST_IN_SCRIPTING)
+         (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* ((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 '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)
-                     )
-
-                    ))
+                 (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
-                 (display-warning 'phps-mode (format "Found no ending of 
heredoc at %s" (point)))
-                 (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)
+                 (signal 'error (list (format "Found no ending of double 
quoted region starting at %s" start)))))))))
+
+      (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
+               (signal 'error (list (format "Found no ending of backquoted 
string starting at %s" (point)))))))))
+
+      (phps-mode-lexer-re2c-rule
+       (and ST_HEREDOC (looking-at phps-mode-lexer-ANY_CHAR))
+       (lambda()
+         ;; 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 '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)
                    )
-               (progn
-                 (display-warning 'phps-mode (format "Found no ending of 
newdoc starting at %s" (point)))
-                 (phps-mode-lexer-MOVE_FORWARD (point-max)))))))
 
-        (phps-mode-lexer-re2c-rule
-         (and (or ST_IN_SCRIPTING ST_VAR_OFFSET) (looking-at 
phps-mode-lexer-ANY_CHAR))
-         (lambda()
-           (display-warning 'phps-mode (format "Unexpected character at %s" 
(point)))
-           (phps-mode-lexer-MOVE_FORWARD (point-max))))
+                  ))
+             (progn
+               (signal 'error (list (format "Found no ending of heredoc at %s" 
(point)))))))))
+
+      (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 'ST_END_HEREDOC)
+                 (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE 
old-start start)
+                 )
+             (progn
+               (signal 'error (list (format "Found no ending of newdoc 
starting at %s" (point)))))))))
+
+      (phps-mode-lexer-re2c-rule
+       (and (or ST_IN_SCRIPTING ST_VAR_OFFSET) (looking-at 
phps-mode-lexer-ANY_CHAR))
+       (lambda()
+         (signal 'error (list (format "Unexpected character at %s" (point))))))
+
+      (phps-mode-lexer-re2c-execute))))
 
-        (phps-mode-lexer-re2c-execute)))))
+(define-lex phps-mode-analyzer-lex
+  "Call lexer analyzer action."
+  phps-mode-analyzer-lexer
+  semantic-lex-default-action)
 
-(define-lex phps-mode-lexer-lex
+(define-lex phps-mode-analyzer-re2c-lex
   "Call lexer analyzer action."
-  phps-mode-lexer-lex-analyzer
+  phps-mode-analyzer-re2c-lexer
   semantic-lex-default-action)
 
 (defun phps-mode-lexer--get-next-unescaped (character)
@@ -1757,10 +1769,79 @@
   (phps-mode-debug-message (message "Lexer run"))
   (setq-local phps-mode-lexer-buffer-length (1- (point-max)))
   (setq-local phps-mode-lexer-buffer-contents (buffer-substring-no-properties 
(point-min) (point-max)))
-  (setq-local phps-mode-lexer-STATE nil)
-  (setq-local phps-mode-lexer-state_stack nil)
-  (setq-local phps-mode-lexer-states nil)
-  (setq-local phps-mode-lexer-tokens (semantic-lex-buffer)))
+
+  (let ((result (phps-mode-analyzer-lex-string 
phps-mode-lexer-buffer-contents)))
+
+    ;; Move variables into this buffers variables
+    (setq phps-mode-lexer-tokens (nth 0 result))
+    (setq phps-mode-lexer-states (nth 1 result))
+    (setq phps-mode-lexer-STATE (nth 2 result))
+    (setq phps-mode-lexer-state_stack (nth 3 result))
+
+    ;; Apply syntax color on tokens
+    (dolist (token phps-mode-lexer-tokens)
+      (let ((start (car (cdr token)))
+            (end (cdr (cdr token)))
+            (token-name (car token)))
+        (let ((token-syntax-color (phps-mode-lexer-get-token-syntax-color 
token-name)))
+          (if token-syntax-color
+              (phps-mode-lexer-set-region-syntax-color start end 
token-syntax-color)
+            (phps-mode-lexer-clear-region-syntax-color start end)))))
+
+
+        (let ((errors (nth 4 result)))
+          (when errors
+            (display-warning 'phps-mode (format "Lex Errors: %s" errors))))))
+
+(defun phps-mode-analyzer-lex-string (contents &optional start end states 
state state-stack tokens)
+  "Run lexer on CONTENTS."
+  ;; Create a separate buffer, run lexer inside of it, catch errors and return 
them
+  ;; to enable nice presentation
+  (let ((errors))
+    (let ((buffer (generate-new-buffer "*PHPs Lexer*")))
+
+      ;; Create temporary buffer and run lexer in it
+      (save-excursion
+        (switch-to-buffer buffer)
+        (insert contents)
+
+        (if states
+            (setq-local phps-mode-lexer-states states)
+          (setq-local phps-mode-lexer-states nil))
+        (if state-stack
+            (setq-local phps-mode-lexer-state_stack state-stack)
+          (setq-local phps-mode-lexer-state_stack nil))
+        (if state
+            (setq-local phps-mode-lexer-STATE state)
+          (phps-mode-lexer-BEGIN 'ST_INITIAL))
+
+        (when (boundp 'phps-mode-syntax-table)
+          (setq-local semantic-lex-syntax-table phps-mode-syntax-table))
+        (when (fboundp 'phps-mode-analyzer-re2c-lex)
+          (setq-local semantic-lex-analyzer #'phps-mode-analyzer-re2c-lex))
+
+        ;; Catch any potential errors
+        (condition-case conditions
+            (progn
+              (if (and start end)
+                  (progn
+                    (phps-mode-debug-message
+                     (message "Running (semantic-lex %s %s)" start end))
+                    (let ((incremental-tokens (semantic-lex start end)))
+                      (setq-local phps-mode-lexer-tokens (append tokens 
incremental-tokens))))
+                (phps-mode-debug-message
+                 (message "Running (semantic-lex-buffer)"))
+                (setq-local phps-mode-lexer-tokens (semantic-lex-buffer))))
+          (error
+           (setq errors (car (cdr conditions)))))
+
+        ;; Move variables outside of buffer
+        (setq state phps-mode-lexer-STATE)
+        (setq state-stack phps-mode-lexer-state_stack)
+        (setq states phps-mode-lexer-states)
+        (setq tokens phps-mode-lexer-tokens)
+        (kill-buffer)))
+    (list tokens states state state-stack errors)))
 
 (defun phps-mode-lexer-move-states (start diff)
   "Move lexer states after (or equal to) START with modification DIFF."
@@ -1915,20 +1996,44 @@
 
                           ;; Do partial lex from previous-token-end to 
change-stop
 
-                          ;; Rewind lexer state here
-                          (setq-local phps-mode-lexer-states head-states)
-                          (setq-local phps-mode-lexer-STATE incremental-state)
-                          (setq-local phps-mode-lexer-state_stack 
incremental-state-stack)
+                          (let ((result (phps-mode-analyzer-lex-string
+                                         (buffer-substring-no-properties 
(point-min) (point-max))
+                                         incremental-start-new-buffer
+                                         (point-max)
+                                         head-states
+                                         incremental-state
+                                         incremental-state-stack
+                                         head-tokens)))
 
-                          ;; Generate new tokens
-                          (setq incremental-tokens (semantic-lex 
incremental-start-new-buffer (point-max)))
+                            (phps-mode-debug-message
+                             (message "Incrementally-lexed-string: %s" result))
 
-                          (setq-local phps-mode-lexer-tokens (append 
head-tokens incremental-tokens))
+                            (setq phps-mode-lexer-tokens (nth 0 result))
+                            (setq phps-mode-lexer-states (nth 1 result))
+                            (setq phps-mode-lexer-STATE (nth 2 result))
+                            (setq phps-mode-lexer-state_stack (nth 3 result))
 
-                          (push (list 'INCREMENTAL-LEX 
incremental-start-new-buffer) log)
+                            ;; Apply syntax color on token
+                            (dolist (token phps-mode-lexer-tokens)
+                              (let ((start (car (cdr token)))
+                                    (end (cdr (cdr token)))
+                                    (token-name (car token)))
 
-                          (phps-mode-debug-message
-                           (message "Incremental tokens: %s" 
incremental-tokens)))
+                                ;; Apply syntax color on token
+                                (let ((token-syntax-color 
(phps-mode-lexer-get-token-syntax-color token-name)))
+                                  (if token-syntax-color
+                                      (phps-mode-lexer-set-region-syntax-color 
start end token-syntax-color)
+                                    (phps-mode-lexer-clear-region-syntax-color 
start end)))))
+
+
+                            (let ((errors (nth 4 result)))
+                              (when errors
+                                (display-warning 'phps-mode (format 
"Incremental Lex Errors: %s" errors))))
+
+                            (push (list 'INCREMENTAL-LEX 
incremental-start-new-buffer) log)
+
+                            (phps-mode-debug-message
+                             (message "Incremental tokens: %s" 
incremental-tokens))))
                       (push (list 'FOUND-NO-HEAD-STATES 
incremental-start-new-buffer) log)
                       (phps-mode-debug-message
                        (message "Found no head states"))
@@ -1947,6 +2052,7 @@
         (phps-mode-debug-message
          (message "Running full lexer"))
         (phps-mode-lexer-run))
+
       log)))
 
 (defun phps-mode-functions-get-processed-buffer ()
@@ -3322,7 +3428,7 @@ SQUARE-BRACKET-LEVEL and ROUND-BRACKET-LEVEL."
                 (setq new-indentation (1- new-indentation)))
 
               (when (and (= bracket-level 0)
-                     line-starts-with-closing-bracket)
+                         line-starts-with-closing-bracket)
                 (setq new-indentation (+ new-indentation tab-width)))
 
               (when current-line-starts-with-closing-bracket
diff --git a/phps-mode.el b/phps-mode.el
index 8601856..3d743f9 100644
--- a/phps-mode.el
+++ b/phps-mode.el
@@ -5,8 +5,8 @@
 ;; Author: Christian Johansson <address@hidden>
 ;; Maintainer: Christian Johansson <address@hidden>
 ;; Created: 3 Mar 2018
-;; Modified: 13 Dec 2019
-;; Version: 0.3.25
+;; Modified: 19 Dec 2019
+;; Version: 0.3.26
 ;; Keywords: tools, convenience
 ;; URL: https://github.com/cjohansson/emacs-phps-mode
 
@@ -217,7 +217,7 @@
   (setq-local semantic-lex-syntax-table phps-mode-syntax-table)
 
   ;; Semantic
-  (setq-local semantic-lex-analyzer #'phps-mode-lexer-lex)
+  (setq-local semantic-lex-analyzer #'phps-mode-analyzer-lex)
 
   ;; Set semantic-lex initializer function
   (add-hook 'semantic-lex-reset-functions #'phps-mode-lexer-setup 0 t)
diff --git a/test/phps-mode-test-lexer.el b/test/phps-mode-test-lexer.el
index a24b4cc..1437e06 100644
--- a/test/phps-mode-test-lexer.el
+++ b/test/phps-mode-test-lexer.el
@@ -336,19 +336,19 @@
    "<?php\necho \"My neverending double quotation\n"
    "Neverending double quotation"
    (should (equal phps-mode-lexer-tokens
-                  '((T_OPEN_TAG 1 . 7) (T_ECHO 7 . 11)))))
+                  nil)))
 
   (phps-mode-test-with-buffer
    "<?php\n`My neverending backquotes\n"
    "Neverending backquotes"
    (should (equal phps-mode-lexer-tokens
-                  '((T_OPEN_TAG 1 . 7) ("`" 7 . 8)))))
+                  nil)))
 
   (phps-mode-test-with-buffer
    "<?php\n<<<LABEL\nMy neverending heredoc\ngoes on forever\n"
    "Neverending heredoc"
    (should (equal phps-mode-lexer-tokens
-                  '((T_OPEN_TAG 1 . 7) (T_START_HEREDOC 7 . 16)))))
+                  nil)))
 
   )
 



reply via email to

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