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

    Improved maintainability of lexer rules
---
 phps-mode-lexer-generator.el | 2020 ++++++++++++++++++++++++------------------
 phps-mode-lexer.el           |    5 +-
 2 files changed, 1142 insertions(+), 883 deletions(-)

diff --git a/phps-mode-lexer-generator.el b/phps-mode-lexer-generator.el
index b6e9122138..935984c9b6 100644
--- a/phps-mode-lexer-generator.el
+++ b/phps-mode-lexer-generator.el
@@ -9,9 +9,9 @@
 ;;; Code:
 
 
-(defvar phps-mode-lexer-generator--table (make-hash-table :test 'equal))
+(defvar phps-mode-lexer-generator--table nil)
 
-(defmacro phps-mode-lexer-generator--match-macro (states conditions &rest body)
+(defun phps-mode-lexer-generator--add-rule (table states conditions &rest body)
   "Place in STATES a check for CONDITIONS to execute BODY."
   (unless (listp states)
     (setq states (list states)))
@@ -19,357 +19,434 @@
     (let ((old-lambdas
            (gethash
             state
-            phps-mode-lexer-generator--table)))
+            table)))
       (when old-lambdas
         (setq
          old-lambdas
          (reverse old-lambdas)))
-      (push `((lambda() ,conditions) (lambda() ,@body)) old-lambdas)
+      (push (list conditions body) old-lambdas)
       (setq old-lambdas (reverse old-lambdas))
       (puthash
        state
        old-lambdas
-       phps-mode-lexer-generator--table))))
+       table))))
 
 (defun phps-mode-lexer-generator--lambdas ()
-  (setq phps-mode-lexer-generator--table (make-hash-table :test 'equal))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "exit")
-     (phps-mode-lexer--return-token-with-indent 'T_EXIT))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "die")
-     (phps-mode-lexer--return-token-with-indent 'T_EXIT))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "fn")
-     (phps-mode-lexer--return-token-with-indent 'T_FN))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "function")
-     (phps-mode-lexer--return-token-with-indent 'T_FUNCTION))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "const")
-     (phps-mode-lexer--return-token-with-indent 'T_CONST))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "return")
-     (phps-mode-lexer--return-token-with-indent 'T_RETURN))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "#\\[")
+
+  ;; NOTE We use a global variable here to prevent it from being
+  ;; included in the lambdas below
+  (setq
+   phps-mode-lexer-generator--table
+   (make-hash-table :test 'equal))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "exit"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_EXIT)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "die"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_EXIT)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "fn"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_FN)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "function"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_FUNCTION)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "const"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_CONST)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "return"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_RETURN)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "#\\["))
+   (lambda()
      (phps-mode-lexer--enter-nesting "[")
-     (phps-mode-lexer--return-token 'T_ATTRIBUTE))
+     (phps-mode-lexer--return-token 'T_ATTRIBUTE)))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda()
      (looking-at
       (concat
        "yield"
        phps-mode-lexer--whitespace
        "from"
-       "[^a-zA-Z0-9_\x80-\xff]"))
-     (phps-mode-lexer--return-token-with-indent 'T_YIELD_FROM))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "yield")
-     (phps-mode-lexer--return-token-with-indent 'T_YIELD))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "try")
-     (phps-mode-lexer--return-token-with-indent 'T_TRY))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "catch")
-     (phps-mode-lexer--return-token-with-indent 'T_CATCH))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "finally")
-     (phps-mode-lexer--return-token-with-indent 'T_FINALLY))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "throw")
-     (phps-mode-lexer--return-token-with-indent 'T_THROW))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "if")
-     (phps-mode-lexer--return-token-with-indent 'T_IF))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "elseif")
-     (phps-mode-lexer--return-token-with-indent 'T_ELSEIF))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "endif")
-     (phps-mode-lexer--return-token-with-indent 'T_ENDIF))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "else")
-     (phps-mode-lexer--return-token-with-indent 'T_ELSE))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "while")
-     (phps-mode-lexer--return-token-with-indent 'T_WHILE))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "endwhile")
-     (phps-mode-lexer--return-token-with-indent 'T_ENDWHILE))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "do")
-     (phps-mode-lexer--return-token-with-indent 'T_DO))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "for")
-     (phps-mode-lexer--return-token-with-indent 'T_FOR))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "endfor")
-     (phps-mode-lexer--return-token-with-indent 'T_ENDFOR))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "foreach")
-     (phps-mode-lexer--return-token-with-indent 'T_FOREACH))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "endforeach")
-     (phps-mode-lexer--return-token-with-indent 'T_ENDFOREACH))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "declare")
-     (phps-mode-lexer--return-token-with-indent 'T_DECLARE))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "enddeclare")
-     (phps-mode-lexer--return-token-with-indent 'T_ENDDECLARE))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "instanceof")
-     (phps-mode-lexer--return-token-with-indent 'T_INSTANCEOF))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "as")
-     (phps-mode-lexer--return-token-with-indent 'T_AS))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "switch")
-     (phps-mode-lexer--return-token-with-indent 'T_SWITCH))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "match")
-     (phps-mode-lexer--return-token-with-indent 'T_MATCH))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "endswitch")
-     (phps-mode-lexer--return-token-with-indent 'T_ENDSWITCH))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "case")
-     (phps-mode-lexer--return-token-with-indent 'T_CASE))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "default")
-     (phps-mode-lexer--return-token-with-indent 'T_DEFAULT))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "break")
-     (phps-mode-lexer--return-token-with-indent 'T_BREAK))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "continue")
-     (phps-mode-lexer--return-token-with-indent 'T_CONTINUE))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "goto")
-     (phps-mode-lexer--return-token-with-indent 'T_GOTO))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "echo")
-     (phps-mode-lexer--return-token-with-indent 'T_ECHO))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "print")
-     (phps-mode-lexer--return-token-with-indent 'T_PRINT))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "class")
-     (phps-mode-lexer--return-token-with-indent 'T_CLASS))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "interface")
-     (phps-mode-lexer--return-token-with-indent 'T_INTERFACE))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "trait")
-     (phps-mode-lexer--return-token-with-indent 'T_TRAIT))
-
-    ;; The enum keyword must be followed by whitespace and another identifier.
-    ;; This avoids the BC break of using enum in classes, namespaces, 
functions and constants.
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at (concat "\\(enum\\)" phps-mode-lexer--whitespace 
"\\(extends\\|implements\\)"))
+       "[^a-zA-Z0-9_\x80-\xff]")))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_YIELD_FROM)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "yield"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_YIELD)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "try"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_TRY)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "catch"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_CATCH)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "finally"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_FINALLY)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "throw"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_THROW)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "if"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_IF)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "elseif"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_ELSEIF)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "endif"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_ENDIF)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "else"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_ELSE)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "while"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_WHILE)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "endwhile"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_ENDWHILE)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "do"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_DO)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "for"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_FOR)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "endfor"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_ENDFOR)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "foreach"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_FOREACH)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "endforeach"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_ENDFOREACH)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "declare"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_DECLARE)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "enddeclare"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_ENDDECLARE)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "instanceof"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_INSTANCEOF)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "as"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_AS)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "switch"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_SWITCH)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "match"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_MATCH)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "endswitch"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_ENDSWITCH)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "case"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_CASE)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "default"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_DEFAULT)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "break"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_BREAK)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "continue"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_CONTINUE)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "goto"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_GOTO)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "echo"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_ECHO)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "print"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_PRINT)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "class"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_CLASS)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "interface"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_INTERFACE)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "trait"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_TRAIT)))
+
+  ;; The enum keyword must be followed by whitespace and another identifier.
+  ;; This avoids the BC break of using enum in classes, namespaces, functions 
and constants.
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda()
+     (looking-at (concat "\\(enum\\)" phps-mode-lexer--whitespace 
"\\(extends\\|implements\\)")))
+   (lambda()
      (phps-mode-lexer--yyless 4)
-     (phps-mode-lexer--return-token-with-str 'T_STRING))
+     (phps-mode-lexer--return-token-with-str 'T_STRING)))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at (concat "\\(enum\\)" phps-mode-lexer--whitespace 
"[a-zA-Z_\x80-\xff]"))
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at (concat "\\(enum\\)" phps-mode-lexer--whitespace 
"[a-zA-Z_\x80-\xff]")))
+   (lambda()
      (phps-mode-lexer--yyless 4)
-     (phps-mode-lexer--return-token-with-indent 'T_ENUM (match-beginning 1) 
(match-end 1)))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "extends")
-     (phps-mode-lexer--return-token-with-indent 'T_EXTENDS))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "implements")
-     (phps-mode-lexer--return-token-with-indent 'T_IMPLEMENTS))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "->")
+     (phps-mode-lexer--return-token-with-indent 'T_ENUM (match-beginning 1) 
(match-end 1))))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "extends"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_EXTENDS)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "implements"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_IMPLEMENTS)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "->"))
+   (lambda()
      (phps-mode-lexer--yy-push-state 'ST_LOOKING_FOR_PROPERTY)
-     (phps-mode-lexer--return-token-with-indent 'T_OBJECT_OPERATOR))
+     (phps-mode-lexer--return-token-with-indent 'T_OBJECT_OPERATOR)))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "?->")
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "?->"))
+   (lambda()
      (phps-mode-lexer--yy-push-state 'ST_LOOKING_FOR_PROPERTY)
-     (phps-mode-lexer--return-token-with-indent 'T_NULLSAFE_OBJECT_OPERATOR))
-
-    (phps-mode-lexer-generator--match-macro
-     (ST_IN_SCRIPTING ST_LOOKING_FOR_PROPERTY)
-     (looking-at phps-mode-lexer--whitespace)
-     (phps-mode-lexer--return-whitespace))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_LOOKING_FOR_PROPERTY
-     (looking-at "->")
-     (phps-mode-lexer--return-token 'T_OBJECT_OPERATOR))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_LOOKING_FOR_PROPERTY
-     (looking-at "?->")
-     (phps-mode-lexer--return-token 'T_NULLSAFE_OBJECT_OPERATOR))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_LOOKING_FOR_PROPERTY
-     (looking-at phps-mode-lexer--label)
+     (phps-mode-lexer--return-token-with-indent 'T_NULLSAFE_OBJECT_OPERATOR)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   '(ST_IN_SCRIPTING ST_LOOKING_FOR_PROPERTY)
+   (lambda() (looking-at phps-mode-lexer--whitespace))
+   (lambda() (phps-mode-lexer--return-whitespace)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_LOOKING_FOR_PROPERTY
+   (lambda() (looking-at "->"))
+   (lambda() (phps-mode-lexer--return-token 'T_OBJECT_OPERATOR)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_LOOKING_FOR_PROPERTY
+   (lambda() (looking-at "?->"))
+   (lambda() (phps-mode-lexer--return-token 'T_NULLSAFE_OBJECT_OPERATOR)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_LOOKING_FOR_PROPERTY
+   (lambda() (looking-at phps-mode-lexer--label))
+   (lambda() (phps-mode-lexer--yy-pop-state)
+     (phps-mode-lexer--return-token-with-str 'T_STRING 0)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_LOOKING_FOR_PROPERTY
+   (lambda() (looking-at phps-mode-lexer--any-char))
+   (lambda() (phps-mode-lexer--yyless 0)
      (phps-mode-lexer--yy-pop-state)
-     (phps-mode-lexer--return-token-with-str 'T_STRING 0))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_LOOKING_FOR_PROPERTY
-     (looking-at phps-mode-lexer--any-char)
-     (phps-mode-lexer--yyless 0)
-     (phps-mode-lexer--yy-pop-state)
-     (phps-mode-lexer--restart))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "::")
-     (phps-mode-lexer--return-token 'T_PAAMAYIM_NEKUDOTAYIM))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "\\.\\.\\.")
-     (phps-mode-lexer--return-token 'T_ELLIPSIS))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "\\?\\?")
-     (phps-mode-lexer--return-token 'T_COALESCE))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "new")
-     (phps-mode-lexer--return-token-with-indent 'T_NEW))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "clone")
-     (phps-mode-lexer--return-token-with-indent 'T_CLONE))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "var")
-     (phps-mode-lexer--return-token-with-indent 'T_VAR))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
+     (phps-mode-lexer--restart)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "::"))
+   (lambda() (phps-mode-lexer--return-token 'T_PAAMAYIM_NEKUDOTAYIM)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "\\.\\.\\."))
+   (lambda() (phps-mode-lexer--return-token 'T_ELLIPSIS)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "\\?\\?"))
+   (lambda() (phps-mode-lexer--return-token 'T_COALESCE)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "new"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_NEW)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "clone"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_CLONE)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "var"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_VAR)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda()
      (looking-at
       (concat
        "("
        phps-mode-lexer--tabs-and-spaces
        "\\(int\\|integer\\)"
        phps-mode-lexer--tabs-and-spaces
-       ")"))
-     (phps-mode-lexer--return-token 'T_INT_CAST))
+       ")")))
+   (lambda() (phps-mode-lexer--return-token 'T_INT_CAST)))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda()
      (looking-at
       (concat
        "("
        phps-mode-lexer--tabs-and-spaces
        "\\(double\\|float\\)"
        phps-mode-lexer--tabs-and-spaces
-       ")"))
-     (phps-mode-lexer--return-token 'T_DOUBLE_CAST))
+       ")")))
+   (lambda() (phps-mode-lexer--return-token 'T_DOUBLE_CAST)))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda()
      (looking-at
       (concat
        "("
        phps-mode-lexer--tabs-and-spaces
        "\\(real\\)"
        phps-mode-lexer--tabs-and-spaces
-       ")"))
+       ")")))
+   (lambda()
      (when (phps-mode-lexer--parser-mode)
        (signal
         'phps-lexer-error
@@ -379,408 +456,492 @@
           (match-beginning 0))
          (match-beginning 0)
          (match-end 0))))
-     (phps-mode-lexer--return-token 'T_DOUBLE_CAST))
+     (phps-mode-lexer--return-token 'T_DOUBLE_CAST)))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda()
      (looking-at
       (concat
        "("
        phps-mode-lexer--tabs-and-spaces
        "\\(string\\|binary\\)"
        phps-mode-lexer--tabs-and-spaces
-       ")"))
-     (phps-mode-lexer--return-token 'T_STRING_CAST))
+       ")")))
+   (lambda() (phps-mode-lexer--return-token 'T_STRING_CAST)))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda()
      (looking-at
       (concat
        "("
        phps-mode-lexer--tabs-and-spaces
        "array"
        phps-mode-lexer--tabs-and-spaces
-       ")"))
-     (phps-mode-lexer--return-token 'T_ARRAY_CAST))
+       ")")))
+   (lambda() (phps-mode-lexer--return-token 'T_ARRAY_CAST)))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda()
      (looking-at
       (concat
        "("
        phps-mode-lexer--tabs-and-spaces
        "object"
        phps-mode-lexer--tabs-and-spaces
-       ")"))
-     (phps-mode-lexer--return-token 'T_OBJECT_CAST))
+       ")")))
+   (lambda() (phps-mode-lexer--return-token 'T_OBJECT_CAST)))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda()
      (looking-at
       (concat
        "("
        phps-mode-lexer--tabs-and-spaces
        "\\(bool\\|boolean\\)"
        phps-mode-lexer--tabs-and-spaces
-       ")"))
-     (phps-mode-lexer--return-token 'T_BOOL_CAST))
+       ")")))
+   (lambda() (phps-mode-lexer--return-token 'T_BOOL_CAST)))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda()
      (looking-at
       (concat
        "("
        phps-mode-lexer--tabs-and-spaces
        "unset"
-       phps-mode-lexer--tabs-and-spaces ")"))
-     (phps-mode-lexer--return-token 'T_UNSET_CAST))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "eval")
-     (phps-mode-lexer--return-token-with-indent 'T_EVAL))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "include")
-     (phps-mode-lexer--return-token-with-indent 'T_INCLUDE))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "include_once")
-     (phps-mode-lexer--return-token-with-indent 'T_INCLUDE_ONCE))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "require")
-     (phps-mode-lexer--return-token-with-indent 'T_REQUIRE))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "require_once")
-     (phps-mode-lexer--return-token-with-indent 'T_REQUIRE_ONCE))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "namespace")
-     (phps-mode-lexer--return-token-with-indent 'T_NAMESPACE))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "use")
-     (phps-mode-lexer--return-token-with-indent 'T_USE))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "insteadof")
-     (phps-mode-lexer--return-token-with-indent 'T_INSTEADOF))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "global")
-     (phps-mode-lexer--return-token-with-indent 'T_GLOBAL))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "isset")
-     (phps-mode-lexer--return-token-with-indent 'T_ISSET))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "empty")
-     (phps-mode-lexer--return-token-with-indent 'T_EMPTY))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "__halt_compiler")
-     (phps-mode-lexer--return-token-with-indent 'T_HALT_COMPILER))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "static")
-     (phps-mode-lexer--return-token-with-indent 'T_STATIC))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "abstract")
-     (phps-mode-lexer--return-token-with-indent 'T_ABSTRACT))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "final")
-     (phps-mode-lexer--return-token-with-indent 'T_FINAL))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "private")
-     (phps-mode-lexer--return-token-with-indent 'T_PRIVATE))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "protected")
-     (phps-mode-lexer--return-token-with-indent 'T_PROTECTED))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "public")
-     (phps-mode-lexer--return-token-with-indent 'T_PUBLIC))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "readonly")
-     (phps-mode-lexer--return-token-with-indent 'T_READONLY))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "unset")
-     (phps-mode-lexer--return-token-with-indent 'T_UNSET))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "=>")
-     (phps-mode-lexer--return-token 'T_DOUBLE_ARROW))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "list")
-     (phps-mode-lexer--return-token-with-indent 'T_LIST))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "array")
-     (phps-mode-lexer--return-token-with-indent 'T_ARRAY))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "callable")
-     (phps-mode-lexer--return-token-with-indent 'T_CALLABLE))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "\\+\\+")
-     (phps-mode-lexer--return-token 'T_INC))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "--")
-     (phps-mode-lexer--return-token 'T_DEC))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "===")
-     (phps-mode-lexer--return-token 'T_IS_IDENTICAL))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "!==")
-     (phps-mode-lexer--return-token 'T_IS_NOT_IDENTICAL))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "==")
-     (phps-mode-lexer--return-token 'T_IS_EQUAL))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "\\(!=\\|<>\\)")
-     (phps-mode-lexer--return-token 'T_IS_NOT_EQUAL))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "<=>")
-     (phps-mode-lexer--return-token 'T_SPACESHIP))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "<=")
-     (phps-mode-lexer--return-token 'T_IS_SMALLER_OR_EQUAL))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at ">=")
-     (phps-mode-lexer--return-token 'T_IS_GREATER_OR_EQUAL))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "\\+=")
-     (phps-mode-lexer--return-token 'T_PLUS_EQUAL))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "-=")
-     (phps-mode-lexer--return-token 'T_MINUS_EQUAL))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "\\*=")
-     (phps-mode-lexer--return-token 'T_MUL_EQUAL))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "\\*\\\\\\*")
-     (phps-mode-lexer--return-token 'T_POW))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "\\*\\\\\\*=")
-     (phps-mode-lexer--return-token 'T_POW_EQUAL))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "/=")
-     (phps-mode-lexer--return-token 'T_DIV_EQUAL))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "\\.=")
-     (phps-mode-lexer--return-token 'T_CONCAT_EQUAL))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "%=")
-     (phps-mode-lexer--return-token 'T_MOD_EQUAL))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "<<=")
-     (phps-mode-lexer--return-token 'T_SL_EQUAL))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at ">>=")
-     (phps-mode-lexer--return-token 'T_SR_EQUAL))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "&=")
-     (phps-mode-lexer--return-token 'T_AND_EQUAL))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "|=")
-     (phps-mode-lexer--return-token 'T_OR_EQUAL))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "\\^=")
-     (phps-mode-lexer--return-token 'T_XOR_EQUAL))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "\\?\\?=")
-     (phps-mode-lexer--return-token 'T_COALESCE_EQUAL))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "||")
-     (phps-mode-lexer--return-token 'T_BOOLEAN_OR))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "&&")
-     (phps-mode-lexer--return-token 'T_BOOLEAN_AND))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "OR")
-     (phps-mode-lexer--return-token 'T_LOGICAL_OR))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "AND")
-     (phps-mode-lexer--return-token 'T_LOGICAL_AND))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "XOR")
-     (phps-mode-lexer--return-token 'T_LOGICAL_XOR))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "<<")
-     (phps-mode-lexer--return-token 'T_SL))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at ">>")
-     (phps-mode-lexer--return-token 'T_SR))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at (concat "&" "[ \t\r\n]*" "\\(\\$\\|\\.\\.\\.\\)"))
+       phps-mode-lexer--tabs-and-spaces ")")))
+   (lambda() (phps-mode-lexer--return-token 'T_UNSET_CAST)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "eval"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_EVAL)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "include"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_INCLUDE)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "include_once"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_INCLUDE_ONCE)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "require"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_REQUIRE)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "require_once"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_REQUIRE_ONCE)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "namespace"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_NAMESPACE)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "use"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_USE)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "insteadof"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_INSTEADOF)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "global"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_GLOBAL)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "isset"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_ISSET)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "empty"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_EMPTY)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "__halt_compiler"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_HALT_COMPILER)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "static"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_STATIC)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "abstract"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_ABSTRACT)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "final"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_FINAL)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "private"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_PRIVATE)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "protected"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_PROTECTED)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "public"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_PUBLIC)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "readonly"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_READONLY)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "unset"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_UNSET)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "=>"))
+   (lambda() (phps-mode-lexer--return-token 'T_DOUBLE_ARROW)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "list"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_LIST)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "array"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_ARRAY)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "callable"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_CALLABLE)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "\\+\\+"))
+   (lambda() (phps-mode-lexer--return-token 'T_INC)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "--"))
+   (lambda() (phps-mode-lexer--return-token 'T_DEC)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "==="))
+   (lambda() (phps-mode-lexer--return-token 'T_IS_IDENTICAL)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "!=="))
+   (lambda() (phps-mode-lexer--return-token 'T_IS_NOT_IDENTICAL)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "=="))
+   (lambda() (phps-mode-lexer--return-token 'T_IS_EQUAL)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "\\(!=\\|<>\\)"))
+   (lambda() (phps-mode-lexer--return-token 'T_IS_NOT_EQUAL)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "<=>"))
+   (lambda() (phps-mode-lexer--return-token 'T_SPACESHIP)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "<="))
+   (lambda() (phps-mode-lexer--return-token 'T_IS_SMALLER_OR_EQUAL)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at ">="))
+   (lambda() (phps-mode-lexer--return-token 'T_IS_GREATER_OR_EQUAL)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "\\+="))
+   (lambda() (phps-mode-lexer--return-token 'T_PLUS_EQUAL)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "-="))
+   (lambda() (phps-mode-lexer--return-token 'T_MINUS_EQUAL)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "\\*="))
+   (lambda() (phps-mode-lexer--return-token 'T_MUL_EQUAL)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "\\*\\\\\\*"))
+   (lambda() (phps-mode-lexer--return-token 'T_POW)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "\\*\\\\\\*="))
+   (lambda() (phps-mode-lexer--return-token 'T_POW_EQUAL)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "/="))
+   (lambda() (phps-mode-lexer--return-token 'T_DIV_EQUAL)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "\\.="))
+   (lambda() (phps-mode-lexer--return-token 'T_CONCAT_EQUAL)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "%="))
+   (lambda() (phps-mode-lexer--return-token 'T_MOD_EQUAL)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "<<="))
+   (lambda() (phps-mode-lexer--return-token 'T_SL_EQUAL)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at ">>="))
+   (lambda() (phps-mode-lexer--return-token 'T_SR_EQUAL)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "&="))
+   (lambda() (phps-mode-lexer--return-token 'T_AND_EQUAL)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "|="))
+   (lambda() (phps-mode-lexer--return-token 'T_OR_EQUAL)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "\\^="))
+   (lambda() (phps-mode-lexer--return-token 'T_XOR_EQUAL)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "\\?\\?="))
+   (lambda() (phps-mode-lexer--return-token 'T_COALESCE_EQUAL)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "||"))
+   (lambda() (phps-mode-lexer--return-token 'T_BOOLEAN_OR)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "&&"))
+   (lambda() (phps-mode-lexer--return-token 'T_BOOLEAN_AND)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "OR"))
+   (lambda() (phps-mode-lexer--return-token 'T_LOGICAL_OR)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "AND"))
+   (lambda() (phps-mode-lexer--return-token 'T_LOGICAL_AND)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "XOR"))
+   (lambda() (phps-mode-lexer--return-token 'T_LOGICAL_XOR)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "<<"))
+   (lambda() (phps-mode-lexer--return-token 'T_SL)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at ">>"))
+   (lambda() (phps-mode-lexer--return-token 'T_SR)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at (concat "&" "[ \t\r\n]*" "\\(\\$\\|\\.\\.\\.\\)")))
+   (lambda()
      (phps-mode-lexer--yyless 1)
      (phps-mode-lexer--return-token
       'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG
       (match-beginning 0)
-      (- (match-end 0) 1)))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "&")
-     (phps-mode-lexer--return-token 
'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
+      (- (match-end 0) 1))))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "&"))
+   (lambda() (phps-mode-lexer--return-token 
'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda()
      (looking-at
-      (concat "\\(" "]" "\\|" ")" "\\)"))
-     (phps-mode-lexer--return-exit-nesting-token))
+      (concat "\\(" "]" "\\|" ")" "\\)")))
+   (lambda() (phps-mode-lexer--return-exit-nesting-token)))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda()
      (looking-at
-      (concat "\\(" "\\[" "\\|" "(" "\\)"))
-     (phps-mode-lexer--enter-nesting)
-     (phps-mode-lexer--return-token))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at phps-mode-lexer--tokens)
-     (phps-mode-lexer--return-token))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "{")
+      (concat "\\(" "\\[" "\\|" "(" "\\)")))
+   (lambda() (phps-mode-lexer--enter-nesting)
+     (phps-mode-lexer--return-token)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at phps-mode-lexer--tokens))
+   (lambda() (phps-mode-lexer--return-token)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "{"))
+   (lambda()
      (phps-mode-lexer--yy-push-state 'ST_IN_SCRIPTING)
      (phps-mode-lexer--enter-nesting "{")
-     (phps-mode-lexer--return-token))
+     (phps-mode-lexer--return-token)))
 
-    (phps-mode-lexer-generator--match-macro
-     (ST_DOUBLE_QUOTES ST_BACKQUOTE ST_HEREDOC)
-     (looking-at "\\${")
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   '(ST_DOUBLE_QUOTES ST_BACKQUOTE ST_HEREDOC)
+   (lambda() (looking-at "\\${"))
+   (lambda()
      (phps-mode-lexer--yy-push-state 'ST_LOOKING_FOR_VARNAME)
      (phps-mode-lexer--enter-nesting "{")
-     (phps-mode-lexer--return-token 'T_DOLLAR_OPEN_CURLY_BRACES))
+     (phps-mode-lexer--return-token 'T_DOLLAR_OPEN_CURLY_BRACES)))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "}")
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "}"))
+   (lambda()
      (phps-mode-lexer--reset-doc-comment)
      (when phps-mode-lexer--state-stack
        (phps-mode-lexer--yy-pop-state))
-     (phps-mode-lexer--return-exit-nesting-token))
+     (phps-mode-lexer--return-exit-nesting-token)))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_LOOKING_FOR_VARNAME
-     (looking-at (concat phps-mode-lexer--label "[\\[}]"))
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_LOOKING_FOR_VARNAME
+   (lambda() (looking-at (concat phps-mode-lexer--label "[\\[}]")))
+   (lambda()
      (let* ((start (match-beginning 0))
             (end (1- (match-end 0)))
             (_data (buffer-substring-no-properties start end)))
        (phps-mode-lexer--yyless 1)
        (phps-mode-lexer--yy-pop-state)
        (phps-mode-lexer--yy-push-state 'ST_IN_SCRIPTING)
-       (phps-mode-lexer--return-token 'T_STRING_VARNAME start end)))
+       (phps-mode-lexer--return-token 'T_STRING_VARNAME start end))))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_LOOKING_FOR_VARNAME
-     (looking-at phps-mode-lexer--any-char)
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_LOOKING_FOR_VARNAME
+   (lambda() (looking-at phps-mode-lexer--any-char))
+   (lambda()
      (phps-mode-lexer--yyless 0)
      (phps-mode-lexer--yy-pop-state)
      (phps-mode-lexer--yy-push-state 'ST_IN_SCRIPTING)
-     (phps-mode-lexer--restart))
+     (phps-mode-lexer--restart)))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at phps-mode-lexer--bnum)
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at phps-mode-lexer--bnum))
+   (lambda()
      (let* ((start (match-beginning 0))
             (end (match-end 0))
             (data
@@ -792,11 +953,13 @@
        ;; (message "Binary number %s from %s" long-number data)
        (if (> long-number phps-mode-lexer--long-limit)
            (phps-mode-lexer--return-token 'T_DNUMBER)
-         (phps-mode-lexer--return-token 'T_LNUMBER))))
+         (phps-mode-lexer--return-token 'T_LNUMBER)))))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at phps-mode-lexer--onum)
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at phps-mode-lexer--onum))
+   (lambda()
      (let* ((start (match-beginning 0))
             (end (match-end 0))
             (data (string-to-number
@@ -807,11 +970,13 @@
                    8)))
        (if (> data phps-mode-lexer--long-limit)
            (phps-mode-lexer--return-token 'T_DNUMBER)
-         (phps-mode-lexer--return-token 'T_LNUMBER))))
+         (phps-mode-lexer--return-token 'T_LNUMBER)))))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at phps-mode-lexer--lnum)
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at phps-mode-lexer--lnum))
+   (lambda()
      (let* ((start (match-beginning 0))
             (end (match-end 0))
             (data (string-to-number
@@ -822,11 +987,13 @@
        ;; (message "Long number: %d" data)
        (if (> data phps-mode-lexer--long-limit)
            (phps-mode-lexer--return-token 'T_DNUMBER)
-         (phps-mode-lexer--return-token 'T_LNUMBER))))
+         (phps-mode-lexer--return-token 'T_LNUMBER)))))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at phps-mode-lexer--hnum)
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at phps-mode-lexer--hnum))
+   (lambda()
      (let* ((start (match-beginning 0))
             (end (match-end 0))
             (data
@@ -838,108 +1005,132 @@
        ;; (message "Hexadecimal number %s from %s" long-number data)
        (if (> long-number phps-mode-lexer--long-limit)
            (phps-mode-lexer--return-token 'T_DNUMBER)
-         (phps-mode-lexer--return-token 'T_LNUMBER))))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_VAR_OFFSET
-     (looking-at "\\([0]\\|[1-9][0-9]*\\)")
-     (phps-mode-lexer--return-token 'T_NUM_STRING))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_VAR_OFFSET
+         (phps-mode-lexer--return-token 'T_LNUMBER)))))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_VAR_OFFSET
+   (lambda() (looking-at "\\([0]\\|[1-9][0-9]*\\)"))
+   (lambda() (phps-mode-lexer--return-token 'T_NUM_STRING)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_VAR_OFFSET
+   (lambda()
      (looking-at
       (concat "\\("
               phps-mode-lexer--lnum "\\|"
               phps-mode-lexer--hnum "\\|"
               phps-mode-lexer--bnum "\\|"
-              phps-mode-lexer--onum "\\)"))
-     (phps-mode-lexer--return-token 'T_NUM_STRING))
+              phps-mode-lexer--onum "\\)")))
+   (lambda() (phps-mode-lexer--return-token 'T_NUM_STRING)))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda()
      (or (looking-at phps-mode-lexer--dnum)
-         (looking-at phps-mode-lexer--exponent-dnum))
-     (phps-mode-lexer--return-token 'T_DNUMBER))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "__CLASS__")
-     (phps-mode-lexer--return-token-with-indent 'T_CLASS_C))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "__TRAIT__")
-     (phps-mode-lexer--return-token-with-indent 'T_TRAIT_C))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "__FUNCTION__")
-     (phps-mode-lexer--return-token-with-indent 'T_FUNC_C))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "__METHOD__")
-     (phps-mode-lexer--return-token-with-indent 'T_METHOD_C))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "__LINE__")
-     (phps-mode-lexer--return-token-with-indent 'T_LINE))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "__FILE__")
-     (phps-mode-lexer--return-token-with-indent 'T_FILE))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "__DIR__")
-     (phps-mode-lexer--return-token-with-indent 'T_DIR))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "__NAMESPACE__")
-     (phps-mode-lexer--return-token-with-indent 'T_NS_C))
-
-    (phps-mode-lexer-generator--match-macro
-     'SHEBANG
-     (looking-at (concat "#!.*" phps-mode-lexer--newline))
+         (looking-at phps-mode-lexer--exponent-dnum)))
+   (lambda() (phps-mode-lexer--return-token 'T_DNUMBER)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "__CLASS__"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_CLASS_C)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "__TRAIT__"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_TRAIT_C)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "__FUNCTION__"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_FUNC_C)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "__METHOD__"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_METHOD_C)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "__LINE__"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_LINE)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "__FILE__"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_FILE)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "__DIR__"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_DIR)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "__NAMESPACE__"))
+   (lambda() (phps-mode-lexer--return-token-with-indent 'T_NS_C)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'SHEBANG
+   (lambda() (looking-at (concat "#!.*" phps-mode-lexer--newline)))
+   (lambda()
      (let ((lineno
             (1+
              (phps-mode-lexer--CG 'zend_lineno))))
        (phps-mode-lexer--CG 'zend-lineno lineno))
      (phps-mode-lexer--begin 'ST_INITIAL)
-     (phps-mode-lexer--restart))
+     (phps-mode-lexer--restart)))
 
-    (phps-mode-lexer-generator--match-macro
-     'SHEBANG
-     (looking-at phps-mode-lexer--any-char)
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'SHEBANG
+   (lambda() (looking-at phps-mode-lexer--any-char))
+   (lambda()
      (phps-mode-lexer--yyless 0)
      (phps-mode-lexer--begin 'ST_INITIAL)
-     (phps-mode-lexer--restart))
+     (phps-mode-lexer--restart)))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_INITIAL
-     (looking-at "<\\?=")
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_INITIAL
+   (lambda() (looking-at "<\\?="))
+   (lambda()
      (phps-mode-lexer--begin 'ST_IN_SCRIPTING)
      (when (phps-mode-lexer--parser-mode)
        (phps-mode-lexer--return-token-with-indent 'T_ECHO))
-     (phps-mode-lexer--return-token 'T_OPEN_TAG_WITH_ECHO))
+     (phps-mode-lexer--return-token 'T_OPEN_TAG_WITH_ECHO)))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_INITIAL
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_INITIAL
+   (lambda()
      (looking-at
       (concat
        "<\\?php\\([ \t]\\|"
        phps-mode-lexer--newline
-       "\\)"))
+       "\\)")))
+   (lambda()
      (phps-mode-lexer--handle-newline)
      (phps-mode-lexer--begin 'ST_IN_SCRIPTING)
-     (phps-mode-lexer--return-or-skip-token 'T_OPEN_TAG))
+     (phps-mode-lexer--return-or-skip-token 'T_OPEN_TAG)))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_INITIAL
-     (looking-at "<\\?php")
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_INITIAL
+   (lambda() (looking-at "<\\?php"))
+   (lambda()
      (let ((start (match-beginning 0))
            (end (match-end 0)))
 
@@ -961,163 +1152,196 @@
           end))
 
         (t
-         (phps-mode-lexer--inline-char-handler)))))
+         (phps-mode-lexer--inline-char-handler))))))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_INITIAL
-     (looking-at "<\\?")
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_INITIAL
+   (lambda() (looking-at "<\\?"))
+   (lambda()
      (if (phps-mode-lexer--CG 'short-tags)
          (progn
            (phps-mode-lexer--begin 'ST_IN_SCRIPTING)
            (phps-mode-lexer--return-or-skip-token 'T_OPEN_TAG))
-       (phps-mode-lexer--inline-char-handler)))
+       (phps-mode-lexer--inline-char-handler))))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_INITIAL
-     (looking-at phps-mode-lexer--any-char)
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_INITIAL
+   (lambda() (looking-at phps-mode-lexer--any-char))
+   (lambda()
      (if (= (point) (point-max))
          (phps-mode-lexer--return-end-token)
-       (phps-mode-lexer--inline-char-handler)))
-
-    ;; Make sure a label character follows "->" or "?->", otherwise there is 
no property
-    ;; and "->"/"?->" will be taken literally
-    (phps-mode-lexer-generator--match-macro
-     (ST_DOUBLE_QUOTES ST_HEREDOC ST_BACKQUOTE)
+       (phps-mode-lexer--inline-char-handler))))
+
+  ;; Make sure a label character follows "->" or "?->", otherwise there is no 
property
+  ;; and "->"/"?->" will be taken literally
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   '(ST_DOUBLE_QUOTES ST_HEREDOC ST_BACKQUOTE)
+   (lambda()
      (looking-at
       (concat
        "\\$"
        phps-mode-lexer--label
        "->"
-       "[a-zA-Z_\x80-\xff]"))
+       "[a-zA-Z_\x80-\xff]")))
+   (lambda()
      (phps-mode-lexer--yyless 3)
      (phps-mode-lexer--yy-push-state 'ST_LOOKING_FOR_PROPERTY)
      (phps-mode-lexer--return-token-with-str
       'T_VARIABLE
       1
       (match-beginning 0)
-      (- (match-end 0) 3)))
-
-    (phps-mode-lexer-generator--match-macro
-     (ST_DOUBLE_QUOTES ST_HEREDOC ST_BACKQUOTE)
-     (looking-at
-      (concat
-       "\\$"
-       phps-mode-lexer--label
-       "\\?->"
-       "[a-zA-Z_\x80-\xff]"))
-     (phps-mode-lexer--yyless 4)
+      (- (match-end 0) 3))))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   '(ST_DOUBLE_QUOTES ST_HEREDOC ST_BACKQUOTE)
+   (lambda() (looking-at
+              (concat
+               "\\$"
+               phps-mode-lexer--label
+               "\\?->"
+               "[a-zA-Z_\x80-\xff]")))
+   (lambda() (phps-mode-lexer--yyless 4)
      (phps-mode-lexer--yy-push-state 'ST_LOOKING_FOR_PROPERTY)
      (phps-mode-lexer--return-token-with-str
       'T_VARIABLE
       1
       (match-beginning 0)
-      (- (match-end 0) 4)))
+      (- (match-end 0) 4))))
 
-    ;; A [ always designates a variable offset, regardless of what follows
-    (phps-mode-lexer-generator--match-macro
-     (ST_DOUBLE_QUOTES ST_HEREDOC ST_BACKQUOTE)
+  ;; A [ always designates a variable offset, regardless of what follows
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   '(ST_DOUBLE_QUOTES ST_HEREDOC ST_BACKQUOTE)
+   (lambda()
      (looking-at
       (concat
        "\\$"
        phps-mode-lexer--label
-       "\\["))
+       "\\[")))
+   (lambda()
      (phps-mode-lexer--yyless 1)
      (phps-mode-lexer--yy-push-state 'ST_VAR_OFFSET)
      (phps-mode-lexer--return-token-with-str
       'T_VARIABLE
       1
       (match-beginning 0)
-      (- (match-end 0) 1)))
-
-    (phps-mode-lexer-generator--match-macro
-     (
-      ST_IN_SCRIPTING
-      ST_DOUBLE_QUOTES
-      ST_HEREDOC
-      ST_BACKQUOTE
-      ST_VAR_OFFSET)
+      (- (match-end 0) 1))))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   '(ST_IN_SCRIPTING
+     ST_DOUBLE_QUOTES
+     ST_HEREDOC
+     ST_BACKQUOTE
+     ST_VAR_OFFSET)
+   (lambda()
      (looking-at
       (concat
        "\\$"
-       phps-mode-lexer--label))
-     (phps-mode-lexer--return-token-with-str 'T_VARIABLE 1))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_VAR_OFFSET
-     (looking-at "\\]")
+       phps-mode-lexer--label)))
+   (lambda()
+     (phps-mode-lexer--return-token-with-str 'T_VARIABLE 1)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_VAR_OFFSET
+   (lambda() (looking-at "\\]"))
+   (lambda()
      (phps-mode-lexer--yy-pop-state)
-     (phps-mode-lexer--return-token-with-str "]" 1))
+     (phps-mode-lexer--return-token-with-str "]" 1)))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_VAR_OFFSET
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_VAR_OFFSET
+   (lambda()
      (looking-at
       (concat "\\(" phps-mode-lexer--tokens
-              "\\|[{}\"`]\\)"))
+              "\\|[{}\"`]\\)")))
+   (lambda()
      (let* ((start (match-beginning 0))
             (end (match-end 0))
             (data (buffer-substring-no-properties start end)))
        ;; Only '[' or '-' can be valid, but returning other tokens will allow 
a more explicit parse error
-       (phps-mode-lexer--return-token data)))
+       (phps-mode-lexer--return-token data))))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_VAR_OFFSET
-     (looking-at (concat "[ \n\r\t'#]"))
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_VAR_OFFSET
+   (lambda() (looking-at (concat "[ \n\r\t'#]")))
+   (lambda()
      ;; Invalid rule to return a more explicit parse error with proper line 
number
      (phps-mode-lexer--yyless 0)
      (phps-mode-lexer--yy-pop-state)
-     (phps-mode-lexer--return-token-with-val 'T_ENCAPSED_AND_WHITESPACE))
+     (phps-mode-lexer--return-token-with-val 'T_ENCAPSED_AND_WHITESPACE)))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda()
      (looking-at
       (concat
        "namespace"
        "\\("
        "\\\\"
        phps-mode-lexer--label
-       "\\)+"))
+       "\\)+")))
+   (lambda()
      (phps-mode-lexer--return-token-with-str
       'T_NAME_RELATIVE
-      (1- (length "namespace\\"))))
+      (1- (length "namespace\\")))))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda()
      (looking-at (concat
                   phps-mode-lexer--label
                   "\\("
                   "\\\\"
                   phps-mode-lexer--label
-                  "\\)+"))
+                  "\\)+")))
+   (lambda()
      (phps-mode-lexer--return-token-with-str
       'T_NAME_QUALIFIED
-      0))
+      0)))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda()
      (looking-at (concat
                   "\\\\"
                   phps-mode-lexer--label
                   "\\("
                   "\\\\"
                   phps-mode-lexer--label
-                  "\\)*"))
+                  "\\)*")))
+   (lambda()
      (phps-mode-lexer--return-token-with-str
       'T_NAME_FULLY_QUALIFIED
-      1))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "\\\\")
-     (phps-mode-lexer--return-token 'T_NS_SEPARATOR))
-
-    (phps-mode-lexer-generator--match-macro
-     (ST_IN_SCRIPTING ST_VAR_OFFSET)
-     (looking-at phps-mode-lexer--label)
-     (phps-mode-lexer--return-token-with-str 'T_STRING 0))
-
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "\\(#\\|//\\)")
+      1)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "\\\\"))
+   (lambda() (phps-mode-lexer--return-token 'T_NS_SEPARATOR)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   '(ST_IN_SCRIPTING ST_VAR_OFFSET)
+   (lambda() (looking-at phps-mode-lexer--label))
+   (lambda() (phps-mode-lexer--return-token-with-str 'T_STRING 0)))
+
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "\\(#\\|//\\)"))
+   (lambda()
      (let* ((start (match-beginning 0))
             (end (match-end 0))
             (_data (buffer-substring-no-properties start end))
@@ -1130,15 +1354,18 @@
          (phps-mode-lexer--return-or-skip-token
           'T_COMMENT
           start
-          (line-end-position)))))
+          (line-end-position))))))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda()
      (looking-at
       (concat
        "\\(/\\*\\|/\\*\\*"
        phps-mode-lexer--whitespace
-       "\\)"))
+       "\\)")))
+   (lambda()
      (let* ((start (match-beginning 0))
             (end (match-end 0))
             (_data (buffer-substring-no-properties start end))
@@ -1161,15 +1388,18 @@
                (format
                 "Unterminated comment starting at %d"
                 start)
-               start)))))))
+               start))))))))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda()
      (looking-at
       (concat
        "\\?>"
        phps-mode-lexer--newline
-       "?"))
+       "?")))
+   (lambda()
      (let ((start (match-beginning 0))
            (end (match-end 0)))
        (when (= (- end start) 3)
@@ -1183,11 +1413,13 @@
        (phps-mode-lexer--return-token
         'T_CLOSE_TAG
         start
-        end)))
+        end))))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "'")
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "'"))
+   (lambda()
      (let* ((start (match-beginning 0))
             (end (match-end 0))
             (_data (buffer-substring-no-properties start end))
@@ -1203,12 +1435,14 @@
           start
           (point-max))
          (phps-mode-lexer--move-forward
-          (point-max)))))
-
-    ;; Double quoted string
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "\"")
+          (point-max))))))
+
+  ;; Double quoted string
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (looking-at "\""))
+   (lambda()
      (let* ((start (match-beginning 0))
             (end (match-end 0))
             (_data (buffer-substring-no-properties start end))
@@ -1267,10 +1501,12 @@
                 'phps-lexer-error
                 (list
                  (format "Found no ending of quote at %s" start)
-                 start))))))))
+                 start)))))))))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda()
      (looking-at
       (concat
        "<<<"
@@ -1282,7 +1518,8 @@
        "'\\|\""
        phps-mode-lexer--label
        "\"\\)"
-       phps-mode-lexer--newline))
+       phps-mode-lexer--newline)))
+   (lambda() 
      (let* ((start (match-beginning 0))
             (end (match-end 0))
             (data
@@ -1328,19 +1565,24 @@
        (phps-mode-lexer--return-token
         'T_START_HEREDOC
         start
-        end)))
+        end))))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_IN_SCRIPTING
-     (looking-at "[`]")
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_IN_SCRIPTING
+   (lambda() (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 "`"))
+     (phps-mode-lexer--return-token "`")))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_END_HEREDOC
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_END_HEREDOC
+   (lambda()
      (looking-at
-      (concat phps-mode-lexer--any-char))
+      (concat phps-mode-lexer--any-char)))
+   (lambda()
      (let* ((start (match-beginning 0))
             (end (+ start
                     (length
@@ -1349,34 +1591,42 @@
        ;; (message "Found ending heredoc at %s, %s of %s" _data 
(thing-at-point 'line) phps-mode-lexer--heredoc-label)
        (pop phps-mode-lexer--heredoc-label-stack)
        (phps-mode-lexer--begin 'ST_IN_SCRIPTING)
-       (phps-mode-lexer--return-token 'T_END_HEREDOC start end)))
+       (phps-mode-lexer--return-token 'T_END_HEREDOC start end))))
 
-    (phps-mode-lexer-generator--match-macro
-     (ST_DOUBLE_QUOTES ST_BACKQUOTE ST_HEREDOC)
-     (looking-at "{\\$")
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   '(ST_DOUBLE_QUOTES ST_BACKQUOTE ST_HEREDOC)
+   (lambda() (looking-at "{\\$"))
+   (lambda()
      (phps-mode-lexer--yy-push-state 'ST_IN_SCRIPTING)
      (phps-mode-lexer--yyless 1)
      (phps-mode-lexer--enter-nesting "{")
      (phps-mode-lexer--return-token
       'T_CURLY_OPEN
       (match-beginning 0)
-      (- (match-end 0) 1)))
+      (- (match-end 0) 1))))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_DOUBLE_QUOTES
-     (looking-at "[\"]")
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_DOUBLE_QUOTES
+   (lambda() (looking-at "[\"]"))
+   (lambda()
      (phps-mode-lexer--begin 'ST_IN_SCRIPTING)
-     (phps-mode-lexer--return-token "\""))
+     (phps-mode-lexer--return-token "\"")))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_BACKQUOTE
-     (looking-at "[`]")
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_BACKQUOTE
+   (lambda() (looking-at "[`]"))
+   (lambda()
      (phps-mode-lexer--begin 'ST_IN_SCRIPTING)
-     (phps-mode-lexer--return-token "`"))
+     (phps-mode-lexer--return-token "`")))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_DOUBLE_QUOTES
-     (looking-at phps-mode-lexer--any-char)
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_DOUBLE_QUOTES
+   (lambda() (looking-at phps-mode-lexer--any-char))
+   (lambda()
      (let ((start (point))
            (start-error (car (cdr (nth 2 phps-mode-lexer--generated-tokens)))))
        (let ((string-start (search-forward-regexp "[^\\\\]\"" nil t)))
@@ -1407,11 +1657,13 @@
               'phps-lexer-error
               (list
                (format "Found no ending of double quoted region starting at 
%d" start-error)
-               start-error)))))))
+               start-error))))))))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_BACKQUOTE
-     (looking-at phps-mode-lexer--any-char)
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_BACKQUOTE
+   (lambda() (looking-at phps-mode-lexer--any-char))
+   (lambda()
      (let ((start (car (cdr (car phps-mode-lexer--generated-tokens)))))
        (let ((string-start (search-forward-regexp "\\([^\\\\]`\\|\\$\\|{\\)" 
nil t)))
          (if string-start
@@ -1426,11 +1678,13 @@
               'phps-lexer-error
               (list
                (format "Found no ending of back-quoted string starting at %d" 
start)
-               start)))))))
+               start))))))))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_HEREDOC
-     (looking-at phps-mode-lexer--any-char)
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_HEREDOC
+   (lambda() (looking-at phps-mode-lexer--any-char))
+   (lambda() 
      ;; Check for $, ${ and {$ forward
      (let ((old-start (car (cdr (car phps-mode-lexer--heredoc-label-stack))))
            (old-end (point)))
@@ -1485,11 +1739,13 @@
               'phps-lexer-error
               (list
                (format "Found no ending of heredoc starting at %d" old-start)
-               old-start)))))))
+               old-start))))))))
 
-    (phps-mode-lexer-generator--match-macro
-     ST_NOWDOC
-     (looking-at phps-mode-lexer--any-char)
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   'ST_NOWDOC
+   (lambda() (looking-at phps-mode-lexer--any-char))
+   (lambda()
      (let ((start (car (cdr (car phps-mode-lexer--generated-tokens)))))
        (let ((string-start
               (search-forward-regexp
@@ -1515,18 +1771,20 @@
               'phps-lexer-error
               (list
                (format "Found no ending of nowdoc starting at %d" start)
-               start)))))))
+               start))))))))
 
-    (phps-mode-lexer-generator--match-macro
-     (ST_IN_SCRIPTING ST_VAR_OFFSET)
-     (looking-at phps-mode-lexer--any-char)
+  (phps-mode-lexer-generator--add-rule
+   phps-mode-lexer-generator--table
+   '(ST_IN_SCRIPTING ST_VAR_OFFSET)
+   (lambda() (looking-at phps-mode-lexer--any-char))
+   (lambda() 
      (signal
       'phps-lexer-error
       (list
        (format "Unexpected character at %d" (match-beginning 0))
-       (match-beginning 0))))
+       (match-beginning 0)))))
 
-    phps-mode-lexer-generator--table)
+  phps-mode-lexer-generator--table)
 
 
 (provide 'phps-mode-lexer-generator)
diff --git a/phps-mode-lexer.el b/phps-mode-lexer.el
index a795087ed4..61cad50984 100644
--- a/phps-mode-lexer.el
+++ b/phps-mode-lexer.el
@@ -521,13 +521,14 @@
                         (setq
                          phps-mode-lexer--match-length matching-length)
                         (setq
-                         phps-mode-lexer--match-body (nth 1 lambd))
+                         phps-mode-lexer--match-body (car (nth 1 lambd)))
                         (setq
                          phps-mode-lexer--match-data (match-data))
+
                         ;; Debug new matches
                         (phps-mode-debug-message
                          (message
-                          "Found new match (%d) %s"
+                          "Found new best match, with length: %d, and body: %s"
                           phps-mode-lexer--match-length
                           phps-mode-lexer--match-body))))))))
 

Reply via email to