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

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

[elpa] externals/phps-mode cffad0d620 131/135: Merge branch 'feature/ful


From: Christian Johansson
Subject: [elpa] externals/phps-mode cffad0d620 131/135: Merge branch 'feature/full-sdt'
Date: Sun, 29 Jan 2023 03:11:12 -0500 (EST)

branch: externals/phps-mode
commit cffad0d620f5e4d3611e5049c8f239a8b86cd4ea
Merge: 5fd766964d 96eeff74f8
Author: christian <christian@cvj.se>
Commit: christian <christian@cvj.se>

    Merge branch 'feature/full-sdt'
---
 phps-mode-ast-bookkeeping.el  | 1105 ------
 phps-mode-ast-imenu.el        |   93 -
 phps-mode-ast.el              |  209 +-
 phps-mode-lex-analyzer.el     |  105 +-
 phps-mode-parser-sdt.el       | 7857 ++++++++++++++++++++++++++++++++++++-----
 phps-mode-test.el             |    7 +-
 test/phps-mode-test-ast.el    |  337 +-
 test/phps-mode-test-parser.el |   12 +-
 8 files changed, 7351 insertions(+), 2374 deletions(-)

diff --git a/phps-mode-ast-bookkeeping.el b/phps-mode-ast-bookkeeping.el
deleted file mode 100644
index ebff44a952..0000000000
--- a/phps-mode-ast-bookkeeping.el
+++ /dev/null
@@ -1,1105 +0,0 @@
-;;; phps-mode-ast-bookkeeping.el --- Bookkeeping from AST -*- lexical-binding: 
t -*-
-
-;; Copyright (C) 2018-2022  Free Software Foundation, Inc.
-
-
-;;; Commentary:
-
-
-;;; Code:
-
-
-(require 'phps-mode-ast)
-
-
-;;; Variables:
-
-
-(defvar-local
-  phps-mode-ast-bookkeeping--index
-  nil
-  "Bookkeeping for current buffer.")
-
-(defvar
-  phps-mode-ast-bookkeeping--superglobal-variable-p
-  #s(hash-table size 12 test equal rehash-size 1.5 rehash-threshold 0.8125 
data ("$_GET" 1 "$_POST" 1 "$_COOKIE" 1 "$_SESSION" 1 "$_REQUEST" 1 "$GLOBALS" 
1 "$_SERVER" 1 "$_FILES" 1 "$_ENV" 1 "$argc" 1 "$argv" 1 
"$http_​response_​header" 1))
-  "Hash-table of super-global variables.")
-
-
-;; Functions:
-
-
-(defun phps-mode-ast-bookkeeping--generate-symbol-scope-string
-    (scope name)
-  "Generate symbol scope string from SCOPE and NAME."
-  (let ((scope-string ""))
-    (dolist (bubble (reverse scope))
-      (let ((scope-type (plist-get bubble 'type))
-            (scope-name (plist-get bubble 'name)))
-        (cond
-
-         ((and
-           (equal scope-type 'namespace)
-           scope-name)
-          (setq
-           scope-string
-           (format
-            "%s namespace %s"
-            scope-string
-            scope-name)))
-
-         ((and
-           (or (equal scope-type 'class)
-               (equal scope-type 'interface))
-           scope-name)
-          (setq
-           scope-string
-           (format
-            "%s class %s"
-            scope-string
-            scope-name)))
-
-         ((and
-           (equal scope-type 'function)
-           (setq
-            scope-string
-            (format
-             "%s function %s"
-             scope-string
-             scope-name))))
-
-         ((and
-           (equal scope-type 'inline-function)
-           scope-name)
-          (setq
-           scope-string
-           (format
-            "%s anonymous function %s"
-            scope-string
-            scope-name)))
-
-         ((and
-           (equal scope-type 'arrow-function)
-           scope-name)
-          (setq
-           scope-string
-           (format
-            "%s arrow function %s"
-            scope-string
-            scope-name)))
-
-         ((and
-           (equal scope-type 'static)
-           (setq
-            scope-string
-            (format
-             "%s static"
-             scope-string))))
-
-         )))
-    (setq
-     scope-string
-     (format
-      "%s id %s"
-      scope-string
-      name))
-    scope-string))
-
-(defun phps-mode-ast-bookkeeping--generate-variable-scope-string
-    (scope name &optional read-only)
-  "Generate variable scope string from SCOPE and NAME and optionally 
READ-ONLY."
-  (let ((scope-strings)
-        (bubbles-stack (list (list "" nil nil (reverse scope))))
-        (bubbles-data))
-    (while bubbles-stack
-      (setq
-       bubbles-data
-       (pop bubbles-stack))
-      (let ((scope-string (car bubbles-data))
-            (namespace (car (cdr bubbles-data)))
-            (class (car (cdr (cdr bubbles-data))))
-            (bubbles (car (cdr (cdr (cdr bubbles-data))))))
-        (while bubbles
-          (let* ((bubble (pop bubbles))
-                 (scope-type (plist-get bubble 'type))
-                 (scope-name (plist-get bubble 'name)))
-            (cond
-
-             ((and
-               (equal scope-type 'namespace)
-               scope-name)
-              (setq
-               namespace
-               scope-name))
-
-             ((and
-               (or (equal scope-type 'class)
-                   (equal scope-type 'interface))
-               scope-name)
-              (if namespace
-                  (setq
-                   scope-string
-                   (format
-                    "%s namespace %s class %s"
-                    scope-string
-                    namespace
-                    scope-name))
-                (setq
-                 scope-string
-                 (format
-                  "%s class %s"
-                  scope-string
-                  scope-name)))
-              (setq
-               class
-               scope-name))
-
-             ((and
-               (equal scope-type 'function)
-               scope-name)
-              (if (and
-                   namespace
-                   (not class))
-                  (setq
-                   scope-string
-                   (format
-                    "%s namespace %s function %s"
-                    scope-string
-                    namespace
-                    scope-name))
-                (setq
-                 scope-string
-                 (format
-                  "%s function %s"
-                  scope-string
-                  scope-name))))
-
-             ((and
-               (equal scope-type 'inline-function)
-               scope-name)
-              (setq
-               scope-string
-               (format
-                "%s anonymous function %s"
-                scope-string
-                scope-name)))
-
-             ((and
-               (equal scope-type 'defined)
-               scope-name)
-              (when read-only
-                ;; Branch off here in alternative scope without this defined 
context
-                ;; but only for read-only contexts
-                (push
-                 (list
-                  scope-string
-                  namespace
-                  class
-                  bubbles)
-                 bubbles-stack))
-              (setq
-               scope-string
-               (format
-                "%s defined %s"
-                scope-string
-                scope-name)))
-
-             ((and
-               (equal scope-type 'arrow-function)
-               scope-name)
-              (when read-only
-                ;; Branch off here in alternative scope without arrow context
-                ;; but only for read-only contexts
-                (push
-                 (list
-                  scope-string
-                  namespace
-                  class
-                  bubbles)
-                 bubbles-stack))
-              (setq
-               scope-string
-               (format
-                "%s arrow function %s"
-                scope-string
-                scope-name)))
-
-             ((and
-               (equal scope-type 'static)
-               (setq
-                scope-string
-                (format
-                 "%s static"
-                 scope-string))))
-
-             )))
-        (setq
-         scope-string
-         (format
-          "%s id %s"
-          scope-string
-          name))
-        (push scope-string scope-strings)))
-    scope-strings))
-
-(defun phps-mode-ast-bookkeeping--generate (&optional tree)
-  "Generate AST for current buffer or optionally for TREE."
-  (let ((bookkeeping (make-hash-table :test 'equal))
-        (bookkeeping-stack (if tree tree phps-mode-ast--tree))
-        (inline-function-count 0)
-        (arrow-function-count 0)
-        (defined-count 0))
-    (while bookkeeping-stack
-      (let ((item-raw (pop bookkeeping-stack))
-            (item)
-            (scope))
-        (if (listp (car item-raw))
-            (progn
-              (setq
-               scope
-               (car item-raw))
-              (setq
-               item
-               (car (cdr item-raw))))
-          (setq
-           item
-           item-raw))
-
-        (let ((type (plist-get item 'ast-type)))
-          (cond
-
-           ((equal type 'simple-variable)
-            (let ((ids
-                   (phps-mode-ast-bookkeeping--generate-variable-scope-string
-                    scope
-                    (plist-get item 'name)
-                    t))
-                  (object
-                   (list
-                    (plist-get item 'start)
-                    (plist-get item 'end)))
-                  (defined-p 0))
-
-              (dolist (id ids)
-                (when (gethash id bookkeeping)
-                  (setq
-                   defined-p
-                   1)))
-
-              ;; Is a super-global variable?
-              (when (gethash
-                     (plist-get item 'name)
-                     phps-mode-ast-bookkeeping--superglobal-variable-p)
-                (setq
-                 defined-p
-                 1))
-              (puthash
-               object
-               defined-p
-               bookkeeping)))
-
-           ((equal type 'static-variables-statement)
-            (when-let ((variables (reverse (plist-get item 'static-var-list))))
-              (dolist (variable variables)
-                (let ((ids
-                       
(phps-mode-ast-bookkeeping--generate-variable-scope-string
-                        scope
-                        (plist-get variable 'name)))
-                      (object
-                       (list
-                        (plist-get variable 'start)
-                        (plist-get variable 'end))))
-                  (dolist (id ids)
-                    (puthash
-                     id
-                     1
-                     bookkeeping))
-                  (puthash
-                   object
-                   1
-                   bookkeeping)))))
-
-           ((equal type 'function)
-            (let ((name (plist-get item 'name))
-                  (sub-scope scope))
-              (push `(type function name ,name) sub-scope)
-              (when-let ((parameter-list (plist-get item 'parameter-list)))
-                (dolist (parameter parameter-list)
-                  (let ((ids
-                         
(phps-mode-ast-bookkeeping--generate-variable-scope-string
-                          sub-scope
-                          (plist-get parameter 'name)))
-                        (object
-                         (list
-                          (plist-get parameter 'start)
-                          (plist-get parameter 'end))))
-                    (dolist (id ids)
-                      (puthash
-                       id
-                       1
-                       bookkeeping))
-                    (puthash
-                     object
-                     1
-                     bookkeeping))))
-
-              (when-let ((children (reverse (plist-get item 'children))))
-                (dolist (child children)
-                  (push `(,sub-scope ,child) bookkeeping-stack)))))
-
-           ((equal type 'return-statement)
-            (when-let ((expr (reverse (plist-get item 'optional-expr))))
-              (dolist (e expr)
-                (push `(,scope ,e) bookkeeping-stack))))
-
-           ((equal type 'method)
-            (let ((name (plist-get item 'name))
-                  (sub-scope scope)
-                  (parent-is-interface)
-                  (is-static))
-              (push `(type function name ,name) sub-scope)
-
-              (when-let ((modifiers (plist-get item 'modifiers)))
-                (dolist (modifier modifiers)
-                  (when (equal modifier 'static)
-                    (setq
-                     is-static
-                     t))))
-
-              (when (equal (plist-get (car scope) 'type) 'interface)
-                (setq parent-is-interface t))
-
-              (unless (or
-                       is-static
-                       parent-is-interface)
-                (let ((this-ids
-                       
(phps-mode-ast-bookkeeping--generate-variable-scope-string
-                        sub-scope
-                        "$this")))
-                  (dolist (this-id this-ids)
-                    (puthash
-                     this-id
-                     1
-                     bookkeeping))))
-
-              (when-let ((parameter-list (plist-get item 'parameter-list)))
-                (dolist (parameter parameter-list)
-                  (let ((ids
-                         
(phps-mode-ast-bookkeeping--generate-variable-scope-string
-                          sub-scope
-                          (plist-get parameter 'name)))
-                        (object
-                         (list
-                          (plist-get parameter 'start)
-                          (plist-get parameter 'end))))
-                    (dolist (id ids)
-                      (puthash
-                       id
-                       1
-                       bookkeeping))
-                    (puthash
-                     object
-                     1
-                     bookkeeping))))
-
-              (when-let ((children (reverse (plist-get item 'children))))
-                (dolist (child children)
-                  (push `(,sub-scope ,child) bookkeeping-stack)))))
-
-           ((equal type 'namespace)
-            (let ((name (plist-get item 'name))
-                  (sub-scope scope))
-              (push `(type namespace name ,name) sub-scope)
-              (when-let ((children (reverse (plist-get item 'children))))
-                (dolist (child children)
-                  (push `(,sub-scope ,child) bookkeeping-stack)))))
-
-           ((equal type 'class)
-            (let ((name (plist-get item 'name))
-                  (sub-scope scope))
-              (push `(type class name ,name) sub-scope)
-              (when-let ((children (reverse (plist-get item 'children))))
-                (dolist (child children)
-                  (push `(,sub-scope ,child) bookkeeping-stack)))))
-
-           ((equal type 'interface)
-            (let ((name (plist-get item 'name))
-                  (sub-scope scope))
-              (push `(type interface name ,name) sub-scope)
-              (when-let ((children (reverse (plist-get item 'children))))
-                (dolist (child children)
-                  (push `(,sub-scope ,child) bookkeeping-stack)))))
-
-           ((equal type 'if)
-            (let* ((conditions (reverse (plist-get item 'condition)))
-                   (condition-stack conditions)
-                   (found-defined-scope)
-                   (sub-scope scope))
-              (while condition-stack
-                (let ((condition (pop condition-stack)))
-                  (when-let ((condition-type (plist-get condition 'ast-type)))
-                    (cond
-
-                     ((or (equal condition-type 'boolean-and-expression)
-                          (equal condition-type 'boolean-or-expression))
-                      (let ((as (reverse (plist-get condition 'a)))
-                            (bs (reverse (plist-get condition 'b))))
-                        (dolist (b bs)
-                          (push b condition-stack))
-                        (dolist (a as)
-                          (push a condition-stack))))
-
-                     ((equal condition-type 'isset-variables)
-                      (let ((sub-scope scope))
-                        (unless found-defined-scope
-                          (setq defined-count (1+ defined-count))
-                          (setq found-defined-scope t))
-                        (push `(type defined name ,defined-count) sub-scope)
-                        (let ((isset-variables (plist-get condition 
'variables)))
-                          (dolist (isset-variable isset-variables)
-                            (let ((ids
-                                   
(phps-mode-ast-bookkeeping--generate-variable-scope-string
-                                    sub-scope
-                                    (plist-get isset-variable 'name))))
-                              (dolist (id ids)
-                                (puthash
-                                 id
-                                 1
-                                 bookkeeping)))))))
-
-                     ((and
-                       (equal condition-type 'negated-expression)
-                       (equal (plist-get (plist-get condition 'expression) 
'ast-type) 'empty-expression))
-                      (let ((sub-scope scope))
-                        (unless found-defined-scope
-                          (setq defined-count (1+ defined-count))
-                          (setq found-defined-scope t))
-                        (push `(type defined name ,defined-count) sub-scope)
-                        (let ((not-empty-variables (plist-get (plist-get 
condition 'expression) 'variables)))
-                          (dolist (not-empty-variable not-empty-variables)
-                            (let ((ids
-                                   
(phps-mode-ast-bookkeeping--generate-variable-scope-string
-                                    sub-scope
-                                    (plist-get not-empty-variable 'name))))
-                              (dolist (id ids)
-                                (puthash
-                                 id
-                                 1
-                                 bookkeeping)))))))
-
-                     ))))
-              (when found-defined-scope
-                (push `(type defined name ,defined-count) sub-scope))
-              (when-let ((children (reverse (plist-get item 'children))))
-                (dolist (child children)
-                  (push `(,sub-scope, child) bookkeeping-stack)))
-              (when conditions
-                (dolist (condition conditions)
-                  (push `(,sub-scope ,condition) bookkeeping-stack)))))
-
-           ((equal type 'isset-variables)
-            (let ((isset-variables (reverse (plist-get item 'variables))))
-              (dolist (isset-variable isset-variables)
-                (push `(,scope ,isset-variable) bookkeeping-stack))))
-
-           ((equal type 'empty-expression)
-            (let ((not-empty-variables (reverse (plist-get item 'variables))))
-              (dolist (not-empty-variable not-empty-variables)
-                (push `(,scope ,not-empty-variable) bookkeeping-stack))))
-
-           ((equal type 'foreach)
-            (when-let ((children (reverse (plist-get item 'children))))
-              (dolist (child children)
-                (push `(,scope ,child) bookkeeping-stack)))
-            (when-let ((value (plist-get item 'value)))
-              (if (equal (plist-get value 'ast-type) 
'foreach-referenced-variable)
-                  (push
-                   (list
-                    scope
-                    (list
-                     'ast-type
-                     'assign-variable
-                     'key
-                     (plist-get value 'variable)))
-                   bookkeeping-stack)
-                (push
-                 (list
-                  scope
-                  (list
-                   'ast-type
-                   'assign-variable
-                   'key
-                   value))
-                 bookkeeping-stack)))
-            (when-let ((key (plist-get item 'key)))
-              (push
-               (list
-                scope
-                (list
-                 'ast-type
-                 'assign-variable
-                 'key
-                 key))
-               bookkeeping-stack))
-            (when-let ((expression (reverse (plist-get item 'expression))))
-              (dolist (expr expression)
-                (push `(,scope ,expr) bookkeeping-stack))))
-
-           ((equal type 'for)
-            (when-let ((children (reverse (plist-get item 'children))))
-              (dolist (child children)
-                (push `(,scope ,child) bookkeeping-stack)))
-            (when-let ((children (reverse (plist-get item 'incremental))))
-              (dolist (child children)
-                (push `(,scope ,child) bookkeeping-stack)))
-            (when-let ((children (reverse (plist-get item 'test))))
-              (dolist (child children)
-                (push `(,scope ,child) bookkeeping-stack)))
-            (when-let ((children (reverse (plist-get item 'initial))))
-              (dolist (child children)
-                (push `(,scope ,child) bookkeeping-stack))))
-
-           ((equal type 'while)
-            (when-let ((children (reverse (plist-get item 'children))))
-              (dolist (child children)
-                (push `(,scope ,child) bookkeeping-stack)))
-            (when-let ((conditions (reverse (plist-get item 'condition))))
-              (dolist (condition conditions)
-                (push `(,scope ,condition) bookkeeping-stack))))
-
-           ((equal type 'do-while)
-            (when-let ((conditions (reverse (plist-get item 'condition))))
-              (dolist (condition conditions)
-                (push `(,scope ,condition) bookkeeping-stack)))
-            (when-let ((children (reverse (plist-get item 'children))))
-              (dolist (child children)
-                (push `(,scope ,child) bookkeeping-stack))))
-
-           ((equal type 'assign-property-variable)
-            (let ((ids
-                   (phps-mode-ast-bookkeeping--generate-variable-scope-string
-                    scope
-                    (plist-get item 'key)))
-                  (object
-                   (list
-                    (plist-get item 'start)
-                    (plist-get item 'end)))
-                  (defined 1))
-              (dolist (id ids)
-                (when-let ((predefined (gethash id bookkeeping)))
-                  (setq
-                   defined
-                   (1+ predefined))))
-              (dolist (id ids)
-                (puthash
-                 id
-                 defined
-                 bookkeeping))
-              (puthash
-               object
-               defined
-               bookkeeping)))
-
-           ;; Infix expressions
-           ((or
-             (equal type 'boolean-or-expression)
-             (equal type 'boolean-and-expression)
-             (equal type 'logical-or-expression)
-             (equal type 'logical-and-expression)
-             (equal type 'logical-xor-expression)
-             (equal type 'bitwise-or-expression)
-             (equal type 'bitwise-and-expression)
-             (equal type 'bitwise-xor-expression)
-             (equal type 'concat-expression)
-             (equal type 'addition-expression)
-             (equal type 'subtraction-expression)
-             (equal type 'multiplication-expression)
-             (equal type 'exponentiation-expression)
-             (equal type 'division-expression)
-             (equal type 'modulo-expression)
-             (equal type 'bitwise-shift-left-expression)
-             (equal type 'bitwise-shift-right-expression))
-            (when-let ((bs (reverse (plist-get item 'b))))
-              (dolist (b bs)
-                (push `(,scope ,b) bookkeeping-stack)))
-            (when-let ((as (reverse (plist-get item 'a))))
-              (dolist (a as)
-                (push `(,scope ,a) bookkeeping-stack))))
-
-           ((equal type 'global-statement)
-            (when-let ((global-var-list (reverse (plist-get item 
'global-var-list))))
-              (dolist (global-var global-var-list)
-                (push
-                 (list
-                  scope
-                  (list
-                   'ast-type
-                   'assign-variable
-                   'key
-                   global-var))
-                 bookkeeping-stack))))
-
-           ((equal type 'assign-variables-from-array)
-            (when-let ((keys (reverse (plist-get item 'keys))))
-              (dolist (key keys)
-                (push
-                 (list
-                  scope
-                  (list
-                   'ast-type
-                   'assign-variable
-                   'key
-                   key))
-                 bookkeeping-stack))))
-
-           ((and
-             (equal type 'assign-variable)
-             (plist-get (plist-get item 'key) 'name))
-            (let ((ids
-                   (phps-mode-ast-bookkeeping--generate-variable-scope-string
-                    scope
-                    (plist-get (plist-get item 'key) 'name)))
-                  (object
-                   (list
-                    (plist-get (plist-get item 'key) 'start)
-                    (plist-get (plist-get item 'key) 'end)))
-                  (defined 1))
-              (dolist (id ids)
-                (when-let ((predefined (gethash id bookkeeping)))
-                  (setq
-                   defined
-                   (1+ predefined))))
-              (dolist (id ids)
-                (puthash
-                 id
-                 defined
-                 bookkeeping))
-              (puthash
-               object
-               defined
-               bookkeeping)
-              (when-let ((exps (plist-get item 'value)))
-                (when (listp exps)
-                  (dolist (exp exps)
-                    (push `(,scope ,exp) bookkeeping-stack))))))
-
-           ((equal type 'property)
-            (let ((subject (plist-get item 'subject))
-                  (static-p)
-                  (sub-scope scope))
-              (when-let ((modifiers (plist-get item 'modifiers)))
-                (dolist (modifier modifiers)
-                  (when (equal modifier 'static)
-                    (setq
-                     static-p
-                     t))))
-              (when static-p
-                (push '(type static) sub-scope))
-              (if (stringp subject)
-                  (let ((ids))
-                    (setq
-                     ids
-                     (phps-mode-ast-bookkeeping--generate-variable-scope-string
-                      sub-scope
-                      subject))
-                    (let ((object
-                           (list
-                            (plist-get item 'start)
-                            (plist-get item 'end)))
-                          (defined 1))
-                      (dolist (id ids)
-                        (when-let ((predefined (gethash id bookkeeping)))
-                          (setq
-                           defined
-                           (1+ predefined))))
-                      (dolist (id ids)
-                        (puthash
-                         id
-                         defined
-                         bookkeeping))
-                      (puthash
-                       object
-                       defined
-                       bookkeeping)))
-                (push `(,sub-scope ,subject) bookkeeping-stack))))
-
-           ((equal type 'function-call)
-            (when-let ((arguments (plist-get item 'argument-list)))
-              (dolist (argument arguments)
-                (push `(,scope ,argument) bookkeeping-stack))))
-
-           ((equal type 'increment-variable)
-            (push `(,scope ,(plist-get item 'variable)) bookkeeping-stack))
-
-           ((equal type 'negated-expression)
-            (push `(,scope ,(plist-get item 'expression)) bookkeeping-stack))
-
-           ((equal type 'try)
-            (when-let ((children (reverse (plist-get item 
'inner-statement-list))))
-              (dolist (child children)
-                (push `(,scope ,child) bookkeeping-stack)))
-            (when-let ((children (reverse (plist-get item 'catch-list))))
-              (dolist (child children)
-                (push `(,scope ,child) bookkeeping-stack)))
-            (when-let ((children (reverse (plist-get item 
'finally-statement))))
-              (dolist (child children)
-                (push `(,scope ,child) bookkeeping-stack))))
-
-           ((equal type 'catch)
-            (when-let ((optional-variable
-                        (plist-get item 'optional-variable)))
-              (let ((ids
-                     (phps-mode-ast-bookkeeping--generate-variable-scope-string
-                      scope
-                      optional-variable)))
-                (dolist (id ids)
-                  (puthash
-                   id
-                   1
-                   bookkeeping))
-                (puthash
-                 (list
-                  (plist-get item 'optional-variable-start)
-                  (plist-get item 'optional-variable-end))
-                 1
-                 bookkeeping)))
-            (when-let ((children (reverse (plist-get item 'children))))
-              (dolist (child children)
-                (push `(,scope ,child) bookkeeping-stack))))
-
-           ((equal type 'array-object-dereferencable)
-            (let* ((subject (plist-get item 'subject))
-                   (downcase-subject-name (downcase (plist-get subject 'name)))
-                   (property-name (plist-get item 'property-name)))
-
-              (when downcase-subject-name
-                (cond
-
-                 ((string= downcase-subject-name "$this")
-                  (puthash
-                   (list
-                    (plist-get subject 'start)
-                    (plist-get subject 'end))
-                   1
-                   bookkeeping)
-                  ;; When current scope is arrow function
-                  ;; we should go up in scope until we get out of
-                  ;; arrow functions scope
-                  (let ((sub-scope scope)
-                        (head-scope)
-                        (is-arrow-function-scope t))
-                    (while (and
-                            sub-scope
-                            is-arrow-function-scope)
-                      (setq
-                       head-scope
-                       (car sub-scope))
-                      (setq
-                       sub-scope
-                       (cdr sub-scope))
-                      (unless (equal
-                               (plist-get head-scope 'type)
-                               'arrow-function)
-                        (setq is-arrow-function-scope nil)))
-                    (let* ((predefined)
-                           (variable-ids
-                            
(phps-mode-ast-bookkeeping--generate-variable-scope-string
-                             sub-scope
-                             (concat "$" property-name)
-                             t))
-                           (symbol-id
-                            
(phps-mode-ast-bookkeeping--generate-symbol-scope-string
-                             sub-scope
-                             property-name))
-                           (bookkeeping-object
-                            (list
-                             (plist-get item 'property-start)
-                             (plist-get item 'property-end))))
-                      (when (gethash symbol-id bookkeeping)
-                        (setq
-                         predefined
-                         t))
-                      (dolist (variable-id variable-ids)
-                        (when (gethash variable-id bookkeeping)
-                          (setq
-                           predefined
-                           t)))
-                      (if predefined
-                          (puthash
-                           bookkeeping-object
-                           1
-                           bookkeeping)
-                        (puthash
-                         bookkeeping-object
-                         0
-                         bookkeeping)))))
-
-                 (t
-                  (let ((variable-ids
-                         
(phps-mode-ast-bookkeeping--generate-variable-scope-string
-                          scope
-                          (plist-get subject 'name)
-                          t))
-                        (predefined 0))
-                    (dolist (variable-id variable-ids)
-                      (when (gethash
-                             variable-id
-                             bookkeeping)
-                        (setq
-                         predefined
-                         1)))
-                    (puthash
-                     (list
-                      (plist-get subject 'start)
-                      (plist-get subject 'end))
-                     predefined
-                     bookkeeping)))
-
-                 ))))
-
-           ((equal type 'variable)
-            (let* ((subject (plist-get item 'array-object-dereferencable))
-                   (downcase-subject-name (downcase (plist-get subject 'name)))
-                   (property-name (plist-get item 'property-name)))
-
-              (when downcase-subject-name
-                (cond
-
-                 ((string= downcase-subject-name "$this")
-                  (puthash
-                   (list
-                    (plist-get subject 'start)
-                    (plist-get subject 'end))
-                   1
-                   bookkeeping)
-                  ;; When current scope is arrow function
-                  ;; we should go up in scope until we get out of
-                  ;; arrow functions scope
-                  (let ((sub-scope scope)
-                        (head-scope)
-                        (is-arrow-function-scope t))
-                    (while (and
-                            sub-scope
-                            is-arrow-function-scope)
-                      (setq
-                       head-scope
-                       (car sub-scope))
-                      (setq
-                       sub-scope
-                       (cdr sub-scope))
-                      (unless (equal
-                               (plist-get head-scope 'type)
-                               'arrow-function)
-                        (setq is-arrow-function-scope nil)))
-                    (let* ((predefined)
-                           (variable-ids
-                            
(phps-mode-ast-bookkeeping--generate-variable-scope-string
-                             sub-scope
-                             (concat "$" property-name)
-                             t))
-                           (symbol-id
-                            
(phps-mode-ast-bookkeeping--generate-symbol-scope-string
-                             sub-scope
-                             property-name))
-                           (bookkeeping-object
-                            (list
-                             (plist-get item 'property-start)
-                             (plist-get item 'property-end))))
-                      (when (gethash symbol-id bookkeeping)
-                        (setq
-                         predefined
-                         t))
-                      (dolist (variable-id variable-ids)
-                        (when (gethash variable-id bookkeeping)
-                          (setq
-                           predefined
-                           t)))
-                      (if predefined
-                          (puthash
-                           bookkeeping-object
-                           1
-                           bookkeeping)
-                        (puthash
-                         bookkeeping-object
-                         0
-                         bookkeeping)))))
-
-                 (t
-                  (let ((variable-ids
-                         
(phps-mode-ast-bookkeeping--generate-variable-scope-string
-                          scope
-                          (plist-get subject 'name)
-                          t))
-                        (predefined 0))
-                    (dolist (variable-id variable-ids)
-                      (when (gethash
-                             variable-id
-                             bookkeeping)
-                        (setq
-                         predefined
-                         1)))
-                    (puthash
-                     (list
-                      (plist-get subject 'start)
-                      (plist-get subject 'end))
-                     predefined
-                     bookkeeping)))
-
-                 ))))
-
-           ((equal type 'static-member)
-            (let* ((parent-class (plist-get item 'class))
-                   (downcased-parent-class (downcase parent-class))
-                   (member (plist-get item 'member))
-                   (member-type (plist-get member 'ast-type)))
-
-              (cond
-
-               ((or (string= downcased-parent-class "self")
-                    (string= downcased-parent-class "static"))
-
-                (cond
-
-                 ((equal member-type 'simple-variable)
-                  ;; When current scope is arrow function
-                  ;; we should go up in scope until we get out of
-                  ;; arrow functions scope
-                  (let ((sub-scope scope)
-                        (head-scope)
-                        (is-arrow-function-scope t))
-                    (while (and
-                            sub-scope
-                            is-arrow-function-scope)
-                      (setq
-                       head-scope
-                       (car sub-scope))
-                      (setq
-                       sub-scope
-                       (cdr sub-scope))
-                      (unless (equal
-                               (plist-get head-scope 'type)
-                               'arrow-function)
-                        (setq is-arrow-function-scope nil)))
-                    (push '(type static) sub-scope)
-                    (let ((predefined)
-                          (variable-ids
-                           
(phps-mode-ast-bookkeeping--generate-variable-scope-string
-                            sub-scope
-                            (plist-get member 'name)
-                            t))
-                          (bookkeeping-object
-                           (list
-                            (plist-get member 'start)
-                            (plist-get member 'end))))
-                      (dolist (variable-id variable-ids)
-                        (when (gethash variable-id bookkeeping)
-                          (setq
-                           predefined
-                           t)))
-                      (if predefined
-                          (puthash
-                           bookkeeping-object
-                           1
-                           bookkeeping)
-                        (puthash
-                         bookkeeping-object
-                         0
-                         bookkeeping)))))
-
-                 )
-
-                ))))
-
-           ((equal type 'static-inline-function)
-            (push `(,scope ,(plist-get item 'inline-function)) 
bookkeeping-stack))
-
-           ((equal type 'echo-statement)
-            (let ((children (reverse (plist-get item 'children))))
-              (dolist (child children)
-                (when (listp child)
-                  (push `(,scope ,child) bookkeeping-stack)))))
-
-           ((equal type 'arrow-function)
-            (let ((sub-scope scope))
-              (setq arrow-function-count (1+ arrow-function-count))
-              (push `(type arrow-function name ,arrow-function-count) 
sub-scope)
-              (when-let ((expr (reverse (plist-get item 'expr))))
-                (dolist (e expr)
-                  (push `(,sub-scope ,e) bookkeeping-stack)))
-              (when-let ((parameter-list (plist-get item 'parameter-list)))
-                (dolist (parameter parameter-list)
-                  (let ((ids
-                         
(phps-mode-ast-bookkeeping--generate-variable-scope-string
-                          sub-scope
-                          (plist-get parameter 'name)))
-                        (object
-                         (list
-                          (plist-get parameter 'start)
-                          (plist-get parameter 'end))))
-                    (dolist (id ids)
-                      (puthash
-                       id
-                       1
-                       bookkeeping))
-                    (puthash
-                     object
-                     1
-                     bookkeeping))))))
-
-           ((equal type 'inline-function)
-            (let ((sub-scope scope))
-              (setq inline-function-count (1+ inline-function-count))
-              (push `(type inline-function name ,inline-function-count) 
sub-scope)
-              (when-let ((inner-statement-list (reverse (plist-get item 
'inner-statement-list))))
-                (dolist (inner-statement inner-statement-list)
-                  (push `(,sub-scope ,inner-statement) bookkeeping-stack)))
-              (when-let ((parameter-list (plist-get item 'parameter-list)))
-                (dolist (parameter parameter-list)
-                  (let ((ids
-                         
(phps-mode-ast-bookkeeping--generate-variable-scope-string
-                          sub-scope
-                          (plist-get parameter 'name)))
-                        (object
-                         (list
-                          (plist-get parameter 'start)
-                          (plist-get parameter 'end))))
-                    (dolist (id ids)
-                      (puthash
-                       id
-                       1
-                       bookkeeping))
-                    (puthash
-                     object
-                     1
-                     bookkeeping))))
-              (when-let ((lexical-vars (plist-get item 'lexical-vars)))
-                (dolist (lexical-var lexical-vars)
-                  (let ((ids
-                         
(phps-mode-ast-bookkeeping--generate-variable-scope-string
-                          sub-scope
-                          (plist-get lexical-var 'name)))
-                        (object
-                         (list
-                          (plist-get lexical-var 'start)
-                          (plist-get lexical-var 'end))))
-                    (dolist (id ids)
-                      (puthash
-                       id
-                       1
-                       bookkeeping))
-                    (puthash
-                     object
-                     1
-                     bookkeeping))))))
-
-           ))))
-    (setq
-     phps-mode-ast-bookkeeping--index
-     bookkeeping)
-
-    ;; (message "\nBookkeeping\n:%S\n" bookkeeping)
-    phps-mode-ast-bookkeeping--index))
-
-
-(provide 'phps-mode-ast-bookkeeping)
-;;; phps-mode-ast-bookkeeping.el ends here
diff --git a/phps-mode-ast-imenu.el b/phps-mode-ast-imenu.el
deleted file mode 100644
index e61e6bfe9d..0000000000
--- a/phps-mode-ast-imenu.el
+++ /dev/null
@@ -1,93 +0,0 @@
-;;; phps-mode-ast-imenu.el --- Imenu from AST -*- lexical-binding: t -*-
-
-;; Copyright (C) 2018-2022  Free Software Foundation, Inc.
-
-
-;;; Commentary:
-
-
-;;; Code:
-
-
-(require 'phps-mode-ast)
-
-(defvar-local
-  phps-mode-ast-imenu--index
-  nil
-  "Imenu for current buffer.")
-
-(defun phps-mode-ast-imenu--generate (&optional tree)
-  "Generate imenu from current buffer AST or optionally from TREE."
-  (let ((imenu-index)
-        (ast-tree (if tree tree phps-mode-ast--tree)))
-    (dolist (item ast-tree)
-      (let ((children (plist-get item 'children))
-            (item-type (plist-get item 'ast-type))
-            (item-index (plist-get item 'index))
-            (item-name (plist-get item 'name))
-            (parent))
-        (when (and
-               item-index
-               item-name
-               item-type)
-          (if (and
-               (or
-                (equal item-type 'namespace)
-                (equal item-type 'class)
-                (equal item-type 'interface))
-               children)
-              (progn
-                (dolist (child children)
-                  (let ((grand-children (plist-get child 'children))
-                        (child-type (plist-get child 'ast-type))
-                        (child-name (plist-get child 'name))
-                        (child-index (plist-get child 'index))
-                        (subparent))
-                    (when (and
-                           child-name
-                           child-index)
-                      (if (and
-                           (or
-                            (equal child-type 'class)
-                            (equal child-type 'interface))
-                           grand-children)
-                          (progn
-                            (dolist (grand-child grand-children)
-                              (let ((grand-child-index
-                                     (plist-get grand-child 'index))
-                                    (grand-child-name
-                                     (plist-get grand-child 'name)))
-                                (when (and
-                                       grand-child-index
-                                       grand-child-name)
-                                  (push
-                                   `(,grand-child-name . ,grand-child-index)
-                                   subparent))))
-                            (when subparent
-                              (push
-                               (append
-                                (list child-name)
-                                (reverse subparent))
-                               parent)))
-                        (push
-                         `(,child-name . ,child-index)
-                         parent)))))
-                (when parent
-                  (push
-                   (append
-                    (list item-name)
-                    (reverse parent))
-                   imenu-index)))
-            (push
-             `(,item-name . ,item-index)
-             imenu-index)))))
-    (setq
-     phps-mode-ast-imenu--index
-     (reverse imenu-index)))
-
-  ;; (message "imenu:\n%S\n\n" phps-mode-ast-imenu--index)
-  phps-mode-ast-imenu--index)
-
-
-(provide 'phps-mode-ast-imenu)
-;;; phps-mode-ast-imenu.el ends here
diff --git a/phps-mode-ast.el b/phps-mode-ast.el
index eca2c86800..1e5e09fcb1 100644
--- a/phps-mode-ast.el
+++ b/phps-mode-ast.el
@@ -9,11 +9,13 @@
 ;;; Code:
 
 
+(require 'phps-mode-macros)
 (require 'phps-mode-parser-sdt)
 
 
 ;;; Variables:
 
+
 (defvar-local
   phps-mode-ast--parse-trail
   nil
@@ -30,71 +32,168 @@
 
 (defun phps-mode-ast--generate ()
   "Generate AST for current buffer."
+  (setq
+   phps-mode-parser-sdt-bookkeeping
+   (make-hash-table :test 'equal))
+  (setq
+   phps-mode-parser-sdt-symbol-table-index
+   0)
+  (setq
+   phps-mode-parser-sdt-symbol-imenu--table
+   (make-hash-table :test 'equal))
+  (setq
+   phps-mode-parser-sdt-symbol-imenu--namespace
+   nil)
+  (setq
+   phps-mode-parser-sdt-symbol-imenu--stack
+   nil)
+  (setq
+   phps-mode-parser-sdt-symbol-table
+   (make-hash-table :test 'equal))
+  (setq
+   phps-mode-parser-sdt-symbol-table-by-uri
+   (make-hash-table :test 'equal))
+  (setq
+   phps-mode-parser-sdt--bookkeeping-namespace
+   nil)
+  (setq
+   phps-mode-parser-sdt--bookkeeping-symbol-stack
+   nil)
+  (setq
+   phps-mode-parser-sdt--bookkeeping-anonymous-function-count
+   0)
+  (setq
+   phps-mode-parser-sdt--bookkeeping-arrow-function-count
+   0)
   (let* ((result (phps-mode-parser--parse t))
          (parse-trail (nth 0 result))
-         (translation (nth 1 result))
-         (namespace)
-         (namespace-children)
-         (ast))
+         (translation (nth 1 result)))
     (setq
      phps-mode-ast--parse-trail
      parse-trail)
 
-    ;; (message "\nTranslation:\n%S\n\n" translation)
-
-    (when translation
-      (dolist (item translation)
-        (when (listp item)
+    (phps-mode-debug-message
+     (message "\nTranslation:\n%S\n\n" translation))
+
+    ;; Convert imenu index from hash-table to list structure here
+    (let ((imenu-index))
+      (maphash
+       (lambda (k v)
+         (if (hash-table-p v)
+             (let ((v-list)
+                   (v-index))
+               (maphash
+                (lambda (k2 v2)
+                  (if (hash-table-p v2)
+                      (let ((v2-list)
+                            (v2-index))
+                        (maphash
+                         (lambda (k3 v3)
+                           (if (hash-table-p v3)
+                               (let ((v3-list)
+                                     (v3-index))
+                                 (maphash
+                                  (lambda (k4 v4)
+                                    (if (symbolp k4)
+                                        (setq v3-index v4)
+                                      (push `(,k4 . ,v4) v3-list)))
+                                  v3)
+
+                                 ;; Sort level 4
+                                 (setq
+                                  v3-list
+                                  (sort
+                                   v3-list
+                                   (lambda (a b)
+                                     (cond
+                                      ((and
+                                        (listp (cdr a))
+                                        (listp (cdr b)))
+                                       (< (cdr (car (cdr a))) (cdr (car (cdr 
b)))))
+                                      ((listp (cdr a))
+                                       (< (cdr (car (cdr a))) (cdr b)))
+                                      ((listp (cdr b))
+                                       (< (cdr a) (cdr (car (cdr b)))))
+                                      (t
+                                       (< (cdr a) (cdr b)))))))
+                                 (push `("declaration" . ,v3-index) v3-list)
+                                 (push (append (list k3) v3-list) v2-list))
+                             (if (symbolp k3)
+                                 (setq v2-index v3)
+                             (push `(,k3 . ,v3) v2-list))))
+                         v2)
+
+                        ;; Sort level 3
+                        (setq
+                         v2-list
+                         (sort
+                          v2-list
+                          (lambda (a b)
+                            (cond
+                             ((and
+                               (listp (cdr a))
+                               (listp (cdr b)))
+                              (< (cdr (car (cdr a))) (cdr (car (cdr b)))))
+                             ((listp (cdr a))
+                              (< (cdr (car (cdr a))) (cdr b)))
+                             ((listp (cdr b))
+                              (< (cdr a) (cdr (car (cdr b)))))
+                             (t
+                              (< (cdr a) (cdr b)))))))
+                        (push `("declaration" . ,v2-index) v2-list)
+                        (push (append (list k2) v2-list) v-list))
+                    (if (symbolp k2)
+                        (setq v-index v2)
+                      (push `(,k2 . ,v2) v-list))))
+                v)
+
+               ;; Sort level 2
+               (setq
+                v-list
+                (sort
+                 v-list
+                 (lambda (a b)
+                   (cond
+                    ((and
+                      (listp (cdr a))
+                      (listp (cdr b)))
+                     (< (cdr (car (cdr a))) (cdr (car (cdr b)))))
+                    ((listp (cdr a))
+                     (< (cdr (car (cdr a))) (cdr b)))
+                    ((listp (cdr b))
+                     (< (cdr a) (cdr (car (cdr b)))))
+                    (t
+                     (< (cdr a) (cdr b)))))))
+               (push `("declaration" . ,v-index) v-list)
+               (push (append (list k) v-list) imenu-index))
+           (push `(,k . ,v) imenu-index)))
+       phps-mode-parser-sdt-symbol-imenu--table)
+
+      ;; Sort level 1
+      (setq
+       imenu-index
+       (sort
+        imenu-index
+        (lambda (a b)
           (cond
-
-           ((plist-get item 'ast-type)
-            (if (and
-                 (not namespace)
-                 (equal (plist-get item 'ast-type) 'namespace)
-                 (equal (plist-get item 'end) 'max))
-                (progn
-                  ;; (message "Found global namespace: %S" item)
-                  (setq
-                   namespace
-                   item))
-              (if namespace
-                  (push
-                   item
-                   namespace-children)
-                (push
-                 item
-                 ast))))
-
-           ((listp (car item))
-            (dolist (sub-item item)
-              (when (and
-                     (listp sub-item)
-                     (plist-get sub-item 'ast-type))
-                (if namespace
-                    (push
-                     sub-item
-                     namespace-children)
-                  (push
-                   sub-item
-                   ast)))))))))
-
-    (when namespace
-      (plist-put
-       namespace
-       'children
-       (reverse namespace-children))
-      (push
-       namespace
-       ast))
-    (setq
-     ast
-     (reverse ast))
-
-    ;; (message "AST:\n%S\n\n" ast)
+           ((and
+             (listp (cdr a))
+             (listp (cdr b)))
+            (< (cdr (car (cdr a))) (cdr (car (cdr b)))))
+           ((listp (cdr a))
+            (< (cdr (car (cdr a))) (cdr b)))
+           ((listp (cdr b))
+            (< (cdr a) (cdr (car (cdr b)))))
+           (t
+            (< (cdr a) (cdr b)))))))
+
+      (setq
+       phps-mode-parser-sdt-symbol-imenu
+       imenu-index))
 
     (setq
      phps-mode-ast--tree
-     ast)
+     translation)
     phps-mode-ast--tree))
 
 
diff --git a/phps-mode-lex-analyzer.el b/phps-mode-lex-analyzer.el
index 8d1c61225b..802c1c1cd1 100644
--- a/phps-mode-lex-analyzer.el
+++ b/phps-mode-lex-analyzer.el
@@ -24,8 +24,6 @@
 (require 'phps-mode-serial)
 (require 'phps-mode-syntax-color)
 (require 'phps-mode-ast)
-(require 'phps-mode-ast-bookkeeping)
-(require 'phps-mode-ast-imenu)
 
 (require 'subr-x)
 
@@ -67,6 +65,9 @@
 (defvar-local phps-mode-lex-analyzer--bookkeeping nil
   "Bookkeeping of all variables in tokens.")
 
+(defvar-local phps-mode-lex-analyzer--symbol-table nil
+  "Symbol-table of all symbols found in parse.")
+
 (defvar-local phps-mode-lex-analyzer--tokens nil
   "Latest tokens.")
 
@@ -166,9 +167,9 @@
     (cond
 
      ((when bookkeeping-value
-        (if (> bookkeeping-value 0)
-            'font-lock-variable-name-face
-          'font-lock-warning-face)))
+        (if (= bookkeeping-value 0)
+            'font-lock-warning-face
+          'font-lock-variable-name-face)))
 
      ((when-let ((face
                   (gethash
@@ -261,46 +262,27 @@ ALLOW-CACHE-READ and ALLOW-CACHE-WRITE."
            (setq phps-mode-lex-analyzer--parse-trail (nth 7 lex-result))
            (setq phps-mode-lex-analyzer--parse-error (nth 8 lex-result))
            (setq phps-mode-lex-analyzer--ast (nth 9 lex-result))
-
-           ;; Catch errors in bookkeeping generation
-           (condition-case conditions
-               (phps-mode-ast-bookkeeping--generate
-                phps-mode-lex-analyzer--ast)
-             (error
-              (display-warning
-               'phps-mode
-               (format "Failed to generate bookkeeping: %S" conditions)
-               :warning
-               "*PHPs Bookkeeping Generation Errors*")))
-           (setq phps-mode-lex-analyzer--bookkeeping
-                 phps-mode-ast-bookkeeping--index)
-
-           ;; Catch errors in imenu generation
-           (condition-case conditions
-               (phps-mode-ast-imenu--generate
-                phps-mode-lex-analyzer--ast)
-             (error
-              (display-warning
-               'phps-mode
-               (format "Failed to generate imenu: %S" conditions)
-               :warning
-               "*PHPs Imenu Generation Errors*")))
-           (setq phps-mode-lex-analyzer--imenu phps-mode-ast-imenu--index)
+           (setq phps-mode-lex-analyzer--bookkeeping (nth 10 lex-result))
+           (setq phps-mode-lex-analyzer--imenu (nth 11 lex-result))
+           (setq phps-mode-lex-analyzer--symbol-table (nth 12 lex-result))
 
            (setq phps-mode-lex-analyzer--processed-buffer-p t)
            (phps-mode-lex-analyzer--reset-imenu)
 
-           ;; Apply syntax color on tokens
+           ;; Apply syntax color
+           (phps-mode-lex-analyzer--clear-region-syntax-color
+            (point-min)
+            (point-max))
            (dolist (token phps-mode-lex-analyzer--tokens)
              (let ((start (car (cdr token)))
                    (end (cdr (cdr token))))
                (let ((token-syntax-color
                       (phps-mode-lex-analyzer--get-token-syntax-color token)))
-                 (if token-syntax-color
+                 (when token-syntax-color
                      (phps-mode-lex-analyzer--set-region-syntax-color
-                      start end (list 'font-lock-face token-syntax-color))
-                   (phps-mode-lex-analyzer--clear-region-syntax-color
-                    start end)))))
+                      start
+                      end
+                      (list 'font-lock-face token-syntax-color))))))
 
            ;; Reset buffer changes minimum index
            (phps-mode-lex-analyzer--reset-changes)
@@ -426,49 +408,31 @@ ALLOW-CACHE-READ and ALLOW-CACHE-WRITE."
            (setq phps-mode-lex-analyzer--parse-trail (nth 7 lex-result))
            (setq phps-mode-lex-analyzer--parse-error (nth 8 lex-result))
            (setq phps-mode-lex-analyzer--ast (nth 9 lex-result))
-
-           ;; Catch errors in bookkeeping generation
-           (condition-case conditions
-               (phps-mode-ast-bookkeeping--generate
-                phps-mode-lex-analyzer--ast)
-             (error
-              (display-warning
-               'phps-mode
-               (format "Failed to generate bookkeeping: %S" conditions)
-               :warning
-               "*PHPs Bookkeeping Generation Errors*")))
-           (setq phps-mode-lex-analyzer--bookkeeping
-                 phps-mode-ast-bookkeeping--index)
-
-           ;; Catch errors in imenu generation
-           (condition-case conditions
-               (phps-mode-ast-imenu--generate
-                phps-mode-lex-analyzer--ast)
-             (error
-              (display-warning
-               'phps-mode
-               (format "Failed to generate imenu: %S" conditions)
-               :warning
-               "*PHPs Imenu Generation Errors*")))
-           (setq phps-mode-lex-analyzer--imenu phps-mode-ast-imenu--index)
+           (setq phps-mode-lex-analyzer--bookkeeping (nth 10 lex-result))
+           (setq phps-mode-lex-analyzer--imenu (nth 11 lex-result))
+           (setq phps-mode-lex-analyzer--symbol-table (nth 12 lex-result))
 
            (phps-mode-debug-message
-            (message "Incremental tokens: %s" phps-mode-lex-analyzer--tokens))
+            (message
+             "Incremental tokens: %s"
+             phps-mode-lex-analyzer--tokens))
 
            ;; Save processed result
            (setq phps-mode-lex-analyzer--processed-buffer-p t)
            (phps-mode-lex-analyzer--reset-imenu)
 
            ;; Apply syntax color on tokens
+           (phps-mode-lex-analyzer--clear-region-syntax-color
+            incremental-start-new-buffer
+            point-max)
            (dolist (token phps-mode-lex-analyzer--tokens)
              (let ((start (car (cdr token)))
                    (end (cdr (cdr token))))
 
                ;; Apply syntax color on token
                (let ((token-syntax-color 
(phps-mode-lex-analyzer--get-token-syntax-color token)))
-                 (if token-syntax-color
-                     (phps-mode-lex-analyzer--set-region-syntax-color start 
end (list 'font-lock-face token-syntax-color))
-                   (phps-mode-lex-analyzer--clear-region-syntax-color start 
end)))))
+                 (when token-syntax-color
+                     (phps-mode-lex-analyzer--set-region-syntax-color start 
end (list 'font-lock-face token-syntax-color))))))
 
            ;; Reset buffer changes minimum index
            (phps-mode-lex-analyzer--reset-changes)
@@ -1192,7 +1156,10 @@ of performed operations.  Optionally do it 
FORCE-SYNCHRONOUS."
               (generate-new-buffer "*PHPs Lexer*"))
              (parse-error)
              (parse-trail)
-             (ast-tree))
+             (ast-tree)
+             (bookkeeping)
+             (imenu)
+             (symbol-table))
 
         ;; Create temporary buffer and run lexer in it
         (when (get-buffer buffer)
@@ -1276,6 +1243,9 @@ of performed operations.  Optionally do it 
FORCE-SYNCHRONOUS."
             ;; Need to copy buffer-local values before killing buffer
             (setq parse-trail phps-mode-ast--parse-trail)
             (setq ast-tree phps-mode-ast--tree)
+            (setq bookkeeping phps-mode-parser-sdt-bookkeeping)
+            (setq imenu phps-mode-parser-sdt-symbol-imenu)
+            (setq symbol-table phps-mode-parser-sdt-symbol-table)
 
             (kill-buffer)))
 
@@ -1290,7 +1260,10 @@ of performed operations.  Optionally do it 
FORCE-SYNCHRONOUS."
                 nest-location-stack
                 parse-trail
                 parse-error
-                ast-tree)))
+                ast-tree
+                bookkeeping
+                imenu
+                symbol-table)))
 
           ;; Save cache if possible and permitted
           (when (and
diff --git a/phps-mode-parser-sdt.el b/phps-mode-parser-sdt.el
index 6748c729ca..853fa94320 100644
--- a/phps-mode-parser-sdt.el
+++ b/phps-mode-parser-sdt.el
@@ -583,1386 +583,7509 @@
 
 ;;; Code:
 
-;; TODO Add SDT for
-;; argument_list
-;; array_pair_list
-;; catch_list
-;; catch_name_list
-;; class_statement_list
-;; echo_expr_list
-;; expr
-;; extends_from
-;; for_exprs
-;; for_statement
-;; foreach_statement
-;; global_var_list
-;; implements_list
-;; inner_statement_list
-;; inner_statement_list
-;; interface_extends_list
-;; isset_variables
-;; lexical_vars
-;; method_body
-;; method_modifiers
-;; optional_expr
-;; statement
-;; variable_modifiers
-
-;; TODO Remove function (phps-mode-parser-sdt--get-list-of-object)
 
+(require 'phps-mode-parser)
+
+(defvar-local
+  phps-mode-parser-sdt-bookkeeping
+  (make-hash-table :test 'equal)
+  "Bookkeeping of symbol references.")
+
+(defvar-local
+  phps-mode-parser-sdt-symbol-table-index
+  0
+  "Symbol table index.")
+
+(defvar-local
+  phps-mode-parser-sdt-symbol-table
+  (make-hash-table :test 'equal)
+  "Symbol table of parse, symbol ID => (list URI start end)")
+
+(defvar-local
+  phps-mode-parser-sdt-symbol-table-by-uri
+  (make-hash-table :test 'equal)
+  "Symbol table of parse, symbol URI => list of symbol IDs.")
+
+(defvar-local
+  phps-mode-parser-sdt-symbol-imenu
+  nil
+  "Imenu for symbols of parse.")
+
+(defvar-local
+  phps-mode-parser-sdt-symbol-imenu--table
+  nil
+  "Symbols inside namespaces.")
+
+(defvar-local
+  phps-mode-parser-sdt-symbol-imenu--stack
+  nil
+  "Current imenu namespace.")
+
+(defvar-local
+  phps-mode-parser-sdt-symbol-imenu--namespace
+  nil
+  "Current imenu namespace.")
+
+(defvar-local
+  phps-mode-parser-sdt--bookkeeping-namespace
+  nil
+  "Current bookkeeping namespace.")
+
+(defvar-local
+  phps-mode-parser-sdt--bookkeeping-symbol-stack
+  nil
+  "Current bookkeeping symbol stack.")
+
+(defvar-local
+  phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack
+  nil
+  "Current bookkeeping assignment symbol stack.")
+
+(defvar-local
+  phps-mode-parser-sdt--bookkeeping-anonymous-function-count
+  nil
+  "Count of anonymous functions.")
+
+(defvar-local
+  phps-mode-parser-sdt--bookkeeping-arrow-function-count
+  nil
+  "Count of arrow functions.")
+
+(defvar
+  phps-mode-parser-sdt--bookkeeping--superglobal-variable-p
+  #s(hash-table size 12 test equal rehash-size 1.5 rehash-threshold 0.8125 
data ("$_GET" 1 "$_POST" 1 "$_COOKIE" 1 "$_SESSION" 1 "$_REQUEST" 1 "$GLOBALS" 
1 "$_SERVER" 1 "$_FILES" 1 "$_ENV" 1 "$argc" 1 "$argv" 1 
"$http_​response_​header" 1))
+  "Hash-table of super-global variables.")
+
+(defun phps-mode-parser-sdt--get-symbol-uri (name scope)
+  "Get URI from symbol NAME in SCOPE."
+  (if (gethash
+       name
+       phps-mode-parser-sdt--bookkeeping--superglobal-variable-p)
+      (list
+       name
+       (list 'namespace nil 'class nil 'trait nil 'interface nil 'function nil 
'superglobal t 'object-operator nil 'static-member nil))
+    (let ((potential-uris (list ""))
+          (scope-namespace)
+          (scope-class)
+          (scope-trait)
+          (scope-interface)
+          (scope-function)
+          (scope-object-operator)
+          (scope-static-member))
+      (when scope
+        (let ((scope-count (length scope))
+              (scope-index 0))
+          (while (< scope-index scope-count)
+            (let ((item (nth scope-index scope))
+                  (next-scope)
+                  (next-scope-type)
+                  (next-scope-is-global)
+                  (next-scope-is-this-object-operator)
+                  (next-scope-is-self-static-member-operator))
+
+              ;; Should add one scope look-ahead to determine if we should
+              ;; ignore function scope before a $this-> or self:: or static:: 
operator
+              (when (< scope-index (1- scope-count))
+                (let ((next-scope-index (1+ scope-index)))
+                  (setq next-scope (nth next-scope-index scope))
+                  (setq next-scope-type (car next-scope))
+
+                  ;; When next scope is arrow function, ignore it
+                  (while (and
+                          (equal next-scope-type 'arrow-function)
+                          (< next-scope-index (1- scope-count)))
+                    (setq next-scope-index (1+ next-scope-index))
+                    (setq next-scope (nth next-scope-index scope))
+                    (setq next-scope-type (car next-scope)))
+
+                  (cond
+                   ((equal next-scope-type 'global)
+                    (setq next-scope-is-global t))
+                   ((equal next-scope-type 'object-operator)
+                    (setq scope-object-operator (car (cdr next-scope)))
+                    (let ((downcased-scope-name (downcase (car (cdr 
next-scope)))))
+                      (when (string= downcased-scope-name "$this")
+                        (setq next-scope-is-this-object-operator t))))
+                   ((equal next-scope-type 'static-member)
+                    (setq scope-static-member t)
+                    (let ((downcased-scope-name (downcase (car (cdr 
next-scope)))))
+                      (when (or
+                             (string= downcased-scope-name "self")
+                             (string= downcased-scope-name "static"))
+                        (when (equal next-scope-index (1+ scope-index))
+                          (let ((potential-uri-count (length potential-uris))
+                                (potential-uri-index 0))
+                            (while (< potential-uri-index potential-uri-count)
+                              (setf
+                               (nth potential-uri-index potential-uris)
+                               (format "static %s" (nth potential-uri-index 
potential-uris)))
+                              (setq potential-uri-index (1+ 
potential-uri-index)))))
+                        (setq next-scope-is-self-static-member-operator 
t)))))))
+
+              (let ((space-type (nth 0 item))
+                    (space-name (nth 1 item)))
+                (cond
+
+                 ((equal space-type 'namespace)
+                  (unless next-scope-is-global
+                    (setq scope-namespace (list space-name (nth 2 item)))
+                    (let ((potential-uri-count (length potential-uris))
+                          (potential-uri-index 0))
+                      (while (< potential-uri-index potential-uri-count)
+                        (setf
+                         (nth potential-uri-index potential-uris)
+                         (format
+                          "namespace %s %s"
+                          space-name
+                          (nth potential-uri-index potential-uris)))
+                        (setq potential-uri-index (1+ potential-uri-index))))))
+
+                 ((equal space-type 'class)
+                  (unless next-scope-is-global
+                    (setq scope-class (list space-name (nth 2 item)))
+                    (let ((potential-uri-count (length potential-uris))
+                          (potential-uri-index 0))
+                      (while (< potential-uri-index potential-uri-count)
+                        (setf
+                         (nth potential-uri-index potential-uris)
+                         (format
+                          "class %s %s"
+                          space-name
+                          (nth potential-uri-index potential-uris)))
+                        (setq potential-uri-index (1+ potential-uri-index))))))
+
+                 ((equal space-type 'interface)
+                  (unless next-scope-is-global
+                    (setq scope-interface (list space-name (nth 2 item)))
+                    (let ((potential-uri-count (length potential-uris))
+                          (potential-uri-index 0))
+                      (while (< potential-uri-index potential-uri-count)
+                        (setf
+                         (nth potential-uri-index potential-uris)
+                         (format
+                          "interface %s %s"
+                          space-name
+                          (nth potential-uri-index potential-uris)))
+                        (setq potential-uri-index (1+ potential-uri-index))))))
+
+                 ((equal space-type 'trait)
+                  (unless next-scope-is-global
+                    (setq scope-trait (list space-name (nth 2 item)))
+                    (let ((potential-uri-count (length potential-uris))
+                          (potential-uri-index 0))
+                      (while (< potential-uri-index potential-uri-count)
+                        (setf
+                         (nth potential-uri-index potential-uris)
+                         (format
+                          "trait %s %s"
+                          space-name
+                          (nth potential-uri-index potential-uris)))
+                        (setq potential-uri-index (1+ potential-uri-index))))))
+
+                 ((equal space-type 'function)
+                  (unless (or
+                           next-scope-is-global
+                           next-scope-is-this-object-operator
+                           next-scope-is-self-static-member-operator)
+                    (setq scope-function (list space-name (nth 2 item)))
+                    (let ((potential-uri-count (length potential-uris))
+                          (potential-uri-index 0))
+                      (while (< potential-uri-index potential-uri-count)
+                        (setf
+                         (nth potential-uri-index potential-uris)
+                         (format
+                          "function %s %s"
+                          space-name
+                          (nth potential-uri-index potential-uris)))
+                        (setq potential-uri-index (1+ potential-uri-index))))))
+
+                 ((equal space-type 'anonymous-function)
+                  (let ((potential-uri-count (length potential-uris))
+                        (potential-uri-index 0))
+                    (while (< potential-uri-index potential-uri-count)
+                      (setf
+                       (nth potential-uri-index potential-uris)
+                       (format
+                        "anonymous %s %s"
+                        space-name
+                        (nth potential-uri-index potential-uris)))
+                      (setq potential-uri-index (1+ potential-uri-index)))))
+
+                 ((equal space-type 'static)
+                  (let ((potential-uri-count (length potential-uris))
+                        (potential-uri-index 0))
+                    (while (< potential-uri-index potential-uri-count)
+                      (setf
+                       (nth potential-uri-index potential-uris)
+                       (format
+                        "static %s"
+                        (nth potential-uri-index potential-uris)))
+                      (setq potential-uri-index (1+ potential-uri-index)))))
+
+                 ((equal space-type 'arrow-function)
+                  ;; branch of two alternative namespaces here
+                  ;; one with and one without the arrow function scope
+                  (let ((potential-uri-count (length potential-uris))
+                        (potential-uri-index 0)
+                        (new-potential-uris))
+                    (while (< potential-uri-index potential-uri-count)
+                      (push
+                       (format
+                        "arrow %s %s"
+                        space-name
+                        (nth potential-uri-index potential-uris))
+                       new-potential-uris)
+                      (setq potential-uri-index (1+ potential-uri-index)))
+                    (setq potential-uris (append new-potential-uris 
potential-uris))
+                    ;; (message "new-potential-uris: %S" new-potential-uris)
+                    ;; (message "potential-uris: %S" potential-uris)
+                    ))
+
+                 ((equal space-type 'object-operator)
+                  (setq scope-object-operator space-name))
+
+                 ((equal space-type 'static-member)
+                  (setq scope-static-member space-name))
+
+                 )))
+            (setq scope-index (1+ scope-index)))))
+
+      (let ((potential-uri-count (length potential-uris))
+            (potential-uri-index 0)
+            (matching-uri))
+
+        ;; Iterate potential-uris, select first match or if no match just 
return the first
+        (while (and
+                (< potential-uri-index potential-uri-count)
+                (not matching-uri))
+          (let ((potential-uri (nth potential-uri-index potential-uris)))
+            (setq
+             potential-uri
+             (format
+              "%sid %s"
+              potential-uri
+              name))
+            (setf
+             (nth potential-uri-index potential-uris)
+             potential-uri)
+            (when (gethash potential-uri 
phps-mode-parser-sdt-symbol-table-by-uri)
+              (setq matching-uri potential-uri))
+            (setq potential-uri-index (1+ potential-uri-index))))
+        (if matching-uri
+            (list
+             matching-uri
+             (list 'namespace scope-namespace 'class scope-class 'trait 
scope-trait 'interface scope-interface 'function scope-function 'superglobal 
nil 'object-operator scope-object-operator 'static-member scope-static-member))
+          (list
+           (nth 0 potential-uris)
+           (list 'namespace scope-namespace 'class scope-class 'trait 
scope-trait 'interface scope-interface 'function scope-function 'superglobal 
nil 'object-operator scope-object-operator 'static-member 
scope-static-member)))))))
+
+(defun phps-mode-parser-sdt--parse-top-statement ()
+  "Parse latest top statement."
+   ;; (message "phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack: %S" 
phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack)
+  ;; (message "phps-mode-parser-sdt--bookkeeping-symbol-stack: %S" 
phps-mode-parser-sdt--bookkeeping-symbol-stack)
+
+  ;; Add imenu class, trait, interface and functions here
+  (when
+      phps-mode-parser-sdt-symbol-imenu--namespace
+    ;; (message "phps-mode-parser-sdt-symbol-imenu--namespace: %S" 
phps-mode-parser-sdt-symbol-imenu--namespace)
+    (let ((imenu-nail (format "namespace %s" (nth 0 
phps-mode-parser-sdt-symbol-imenu--namespace))))
+      (unless
+          (gethash
+           imenu-nail
+           phps-mode-parser-sdt-symbol-imenu--table)
+        (puthash
+         imenu-nail
+         (make-hash-table :test 'equal)
+         phps-mode-parser-sdt-symbol-imenu--table))))
+
+    ;; (message "\nphps-mode-parser-sdt-symbol-imenu--stack: %S" 
phps-mode-parser-sdt-symbol-imenu--stack)
+  (when phps-mode-parser-sdt-symbol-imenu--stack
+    ;; Go through imenu stack and add new items to imenu index
+    (let ((imenu-namespace
+           phps-mode-parser-sdt-symbol-imenu--namespace))
+      (dolist (imenu-scopes phps-mode-parser-sdt-symbol-imenu--stack)
+        (let ((imenu-class)
+              (imenu-trait)
+              (imenu-interface)
+              (imenu-function))
+          (dolist (imenu-scope imenu-scopes)
+            (let ((imenu-item-type (nth 0 imenu-scope))
+                  (imenu-item-name (nth 1 imenu-scope))
+                  (imenu-item-start (nth 2 imenu-scope)))
+              (cond
+               ((equal imenu-item-type 'namespace)
+                (setq imenu-namespace (list imenu-item-name imenu-item-start)))
+               ((equal imenu-item-type 'class)
+                (setq imenu-class (list imenu-item-name imenu-item-start)))
+               ((equal imenu-item-type 'interface)
+                (setq imenu-interface (list imenu-item-name imenu-item-start)))
+               ((equal imenu-item-type 'trait)
+                (setq imenu-trait (list imenu-item-name imenu-item-start)))
+               ((equal imenu-item-type 'function)
+                (setq imenu-function (list imenu-item-name 
imenu-item-start))))))
+
+          ;; (message "\nimenu-namespace: %S" imenu-namespace)
+          ;; (message "imenu-class: %S" imenu-class)
+          ;; (message "imenu-trait: %S" imenu-trait)
+          ;; (message "imenu-interface: %S" imenu-interface)
+          ;; (message "imenu-function: %S" imenu-function)
+
+
+          (cond
+
+           (imenu-namespace
+            (let ((imenu-nail (format "namespace %s" (nth 0 imenu-namespace))))
+              (unless (gethash imenu-nail 
phps-mode-parser-sdt-symbol-imenu--table)
+                (let ((imenu-object (make-hash-table :test 'equal)))
+                  (puthash 'declaration (nth 1 imenu-namespace) imenu-object)
+                  (puthash imenu-nail imenu-object 
phps-mode-parser-sdt-symbol-imenu--table)))
+              (cond
+               (imenu-class
+                (let ((imenu-nail2 (format "class %s" (nth 0 imenu-class))))
+                  (unless
+                      (gethash
+                       imenu-nail2
+                       (gethash
+                        imenu-nail
+                        phps-mode-parser-sdt-symbol-imenu--table))
+                    (let ((imenu-object (make-hash-table :test 'equal)))
+                      (puthash 'declaration (nth 1 imenu-class) imenu-object)
+                      (puthash
+                       imenu-nail2
+                       imenu-object
+                       (gethash
+                        imenu-nail
+                        phps-mode-parser-sdt-symbol-imenu--table))))
+                  (when imenu-function
+                    (let ((imenu-nail3 (format "function %s" (nth 0 
imenu-function))))
+                      (unless
+                          (gethash
+                           imenu-nail3
+                           (gethash
+                            imenu-nail2
+                            (gethash
+                             imenu-nail
+                             phps-mode-parser-sdt-symbol-imenu--table)))
+                        (let ((imenu-object (make-hash-table :test 'equal)))
+                          (puthash 'declaration (nth 1 imenu-function) 
imenu-object)
+                          (puthash
+                           imenu-nail3
+                           imenu-object
+                           (gethash
+                            imenu-nail2
+                            (gethash
+                             imenu-nail
+                             phps-mode-parser-sdt-symbol-imenu--table)))))))))
+
+               (imenu-trait
+                (let ((imenu-nail2 (format "trait %s" (nth 0 imenu-trait))))
+                  (unless
+                      (gethash
+                       imenu-nail2
+                       (gethash
+                        imenu-nail
+                        phps-mode-parser-sdt-symbol-imenu--table))
+                    (let ((imenu-object (make-hash-table :test 'equal)))
+                      (puthash 'declaration (nth 1 imenu-class) imenu-object)
+                      (puthash
+                       imenu-nail2
+                       imenu-object
+                       (gethash
+                        imenu-nail
+                        phps-mode-parser-sdt-symbol-imenu--table))))
+                  (when imenu-function
+                    (let ((imenu-nail3 (format "function %s" (nth 0 
imenu-function))))
+                      (unless
+                          (gethash
+                           imenu-nail3
+                           (gethash
+                            imenu-nail2
+                            (gethash
+                             imenu-nail
+                             phps-mode-parser-sdt-symbol-imenu--table)))
+                        (let ((imenu-object (make-hash-table :test 'equal)))
+                          (puthash 'declaration (nth 1 imenu-function) 
imenu-object)
+                          (puthash
+                           imenu-nail3
+                           imenu-object
+                           (gethash
+                            imenu-nail2
+                            (gethash
+                             imenu-nail
+                             phps-mode-parser-sdt-symbol-imenu--table)))))))))
+
+               (imenu-interface
+                (let ((imenu-nail2 (format "interface %s" (nth 0 
imenu-interface))))
+                  (unless
+                      (gethash
+                       imenu-nail2
+                       (gethash
+                        imenu-nail
+                        phps-mode-parser-sdt-symbol-imenu--table))
+                    (let ((imenu-object (make-hash-table :test 'equal)))
+                      (puthash 'declaration (nth 1 imenu-interface) 
imenu-object)
+                      (puthash
+                       imenu-nail2
+                       imenu-object
+                       (gethash
+                        imenu-nail
+                        phps-mode-parser-sdt-symbol-imenu--table))))
+                  (when imenu-function
+                    (let ((imenu-nail3 (format "function %s" (nth 0 
imenu-function))))
+                      (unless
+                          (gethash
+                           imenu-nail3
+                           (gethash
+                            imenu-nail2
+                            (gethash
+                             imenu-nail
+                             phps-mode-parser-sdt-symbol-imenu--table)))
+                        (let ((imenu-object (make-hash-table :test 'equal)))
+                          (puthash 'declaration (nth 1 imenu-function) 
imenu-object)
+                          (puthash
+                           imenu-nail3
+                           imenu-object
+                           (gethash
+                            imenu-nail2
+                            (gethash
+                             imenu-nail
+                             
phps-mode-parser-sdt-symbol-imenu--table))))))))))))
+
+           (imenu-class
+            (let ((imenu-nail (format "class %s" (nth 0 imenu-class))))
+              (unless
+                  (gethash
+                   imenu-nail
+                   phps-mode-parser-sdt-symbol-imenu--table)
+                (let ((imenu-object (make-hash-table :test 'equal)))
+                  (puthash 'declaration (nth 1 imenu-class) imenu-object)
+                  (puthash
+                   imenu-nail
+                   imenu-object
+                   phps-mode-parser-sdt-symbol-imenu--table)))
+              (when imenu-function
+                (let ((imenu-nail2 (format "function %s" (nth 0 
imenu-function))))
+                  (unless
+                      (gethash
+                       imenu-nail2
+                       (gethash
+                        imenu-nail
+                        phps-mode-parser-sdt-symbol-imenu--table))
+                    (let ((imenu-object (make-hash-table :test 'equal)))
+                      (puthash 'declaration (nth 1 imenu-function) 
imenu-object)
+                      (puthash
+                       imenu-nail2
+                       imenu-object
+                       (gethash
+                        imenu-nail
+                        phps-mode-parser-sdt-symbol-imenu--table))))))))
+
+           (imenu-trait
+            (let ((imenu-nail (format "trait %s" (nth 0 imenu-trait))))
+              (unless
+                  (gethash
+                   imenu-nail
+                   phps-mode-parser-sdt-symbol-imenu--table)
+                (let ((imenu-object (make-hash-table :test 'equal)))
+                  (puthash 'declaration (nth 1 imenu-class) imenu-object)
+                  (puthash
+                   imenu-nail
+                   imenu-object
+                   phps-mode-parser-sdt-symbol-imenu--table)))
+              (when imenu-function
+                (let ((imenu-nail2 (format "function %s" (nth 0 
imenu-function))))
+                  (unless
+                      (gethash
+                       imenu-nail2
+                       (gethash
+                        imenu-nail
+                        phps-mode-parser-sdt-symbol-imenu--table))
+                    (let ((imenu-object (make-hash-table :test 'equal)))
+                      (puthash 'declaration (nth 1 imenu-function) 
imenu-object)
+                      (puthash
+                       imenu-nail2
+                       imenu-object
+                       (gethash
+                        imenu-nail
+                        phps-mode-parser-sdt-symbol-imenu--table))))))))
+
+           (imenu-interface
+            (let ((imenu-nail (format "interface %s" (nth 0 imenu-interface))))
+              (unless
+                  (gethash
+                   imenu-nail
+                   phps-mode-parser-sdt-symbol-imenu--table)
+                (let ((imenu-object (make-hash-table :test 'equal)))
+                  (puthash 'declaration (nth 1 imenu-interface) imenu-object)
+                  (puthash
+                   imenu-nail
+                   imenu-object
+                   phps-mode-parser-sdt-symbol-imenu--table)))
+              (when imenu-function
+                (let ((imenu-nail2 (format "function %s" (nth 0 
imenu-function))))
+                  (unless
+                      (gethash
+                       imenu-nail2
+                       (gethash
+                        imenu-nail
+                        phps-mode-parser-sdt-symbol-imenu--table))
+                    (let ((imenu-object (make-hash-table :test 'equal)))
+                      (puthash 'declaration (nth 1 imenu-function) 
imenu-object)
+                      (puthash
+                       imenu-nail2
+                       imenu-object
+                       (gethash
+                        imenu-nail
+                        phps-mode-parser-sdt-symbol-imenu--table))))))))
+
+           (imenu-function
+            (let ((imenu-nail (format "function %s" (nth 0 imenu-function))))
+              (unless
+                  (gethash
+                   imenu-nail
+                   phps-mode-parser-sdt-symbol-imenu--table)
+                (let ((imenu-object (make-hash-table :test 'equal)))
+                  (puthash 'declaration (nth 1 imenu-function) imenu-object)
+                  (puthash
+                   imenu-nail
+                   imenu-object
+                   phps-mode-parser-sdt-symbol-imenu--table)))))))))
+    (setq phps-mode-parser-sdt-symbol-imenu--stack nil))
+
+    ;; (message "phps-mode-parser-sdt-symbol-imenu--table: %S" 
phps-mode-parser-sdt-symbol-imenu--table)
+
+  ;; Parse bookkeeping writes and reads at every statement terminus
+  (when phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack
+    ;; Declare variables
+    (dolist (
+             symbol-list
+             (reverse 
phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack))
+      (let* ((symbol-name (car symbol-list))
+             (symbol-scope (car (cdr symbol-list)))
+             (symbol-start (car (cdr (cdr symbol-list))))
+             (symbol-end (car (cdr (cdr (cdr symbol-list)))))
+             (symbol-uri-object
+              (phps-mode-parser-sdt--get-symbol-uri
+               symbol-name
+               symbol-scope))
+             (symbol-uri (car symbol-uri-object))
+             (symbol-namespace)
+             (symbol-class)
+             (symbol-interface)
+             (symbol-trait)
+             (symbol-function)
+             (symbol-is-superglobal)
+             (symbol-is-this (string= (downcase symbol-name) "$this")))
+
+        ;; Collect namespace, class, interface, trait and function here
+        (when (nth 1 (nth 1 symbol-uri-object))
+          (setq symbol-namespace (car (nth 1 (nth 1 symbol-uri-object)))))
+        (when (nth 3 (nth 1 symbol-uri-object))
+          (setq symbol-class (car (nth 3 (nth 1 symbol-uri-object)))))
+        (when (nth 5 (nth 1 symbol-uri-object))
+          (setq symbol-trait (car (nth 5 (nth 1 symbol-uri-object)))))
+        (when (nth 7 (nth 1 symbol-uri-object))
+          (setq symbol-interface (car (nth 7 (nth 1 symbol-uri-object)))))
+        (when (nth 9 (nth 1 symbol-uri-object))
+          (setq symbol-function (car (nth 9 (nth 1 symbol-uri-object)))))
+        (when (nth 11 (nth 1 symbol-uri-object))
+          (setq symbol-is-superglobal t))
+
+        ;; (message "\nsymbol-name: %S" symbol-name)
+        ;; (message "symbol-scope: %S" symbol-scope)
+        ;; (message "symbol-namespace: %S" symbol-namespace)
+        ;; (message "symbol-class: %S" symbol-class)
+        ;; (message "symbol-trait: %S" symbol-trait)
+        ;; (message "symbol-interface: %S" symbol-interface)
+        ;; (message "symbol-function: %S" symbol-function)
+
+        ;; Place symbol in imenu if not there already
+        ;; and is not superglobal
+        ;; and is not $this
+        (unless (or
+                 symbol-is-this
+                 symbol-is-superglobal)
+          (cond
+
+           ;; Symbol is inside namespace
+           (symbol-namespace
+            (let ((imenu-nail (format "namespace %s" symbol-namespace)))
+              (cond
+
+               ;; Symbol is inside class inside a namespace
+               (symbol-class
+                (let ((imenu-nail2 (format "class %s" symbol-class)))
+                  (cond
+
+                   ;; Symbol is inside function inside class inside namespace
+                   (symbol-function
+                    (let ((imenu-nail3 (format "function %s" symbol-function)))
+                      (unless
+                          (gethash
+                           symbol-name
+                           (gethash
+                            imenu-nail3
+                            (gethash
+                             imenu-nail2
+                             (gethash
+                              imenu-nail
+                              phps-mode-parser-sdt-symbol-imenu--table))))
+                        (puthash
+                         symbol-name
+                         symbol-start
+                         (gethash
+                          imenu-nail3
+                          (gethash
+                           imenu-nail2
+                           (gethash
+                            imenu-nail
+                            phps-mode-parser-sdt-symbol-imenu--table)))))))
+
+                   ;; Symbol is inside class inside namespace
+                   (t
+                    (unless
+                        (gethash
+                         symbol-name
+                         (gethash
+                          imenu-nail2
+                          (gethash
+                           imenu-nail
+                           phps-mode-parser-sdt-symbol-imenu--table)))
+                      (puthash
+                       symbol-name
+                       symbol-start
+                       (gethash
+                        imenu-nail2
+                        (gethash
+                         imenu-nail
+                         phps-mode-parser-sdt-symbol-imenu--table))))))))
+
+               ;; Symbol is inside interface inside namespace
+               (symbol-interface
+                (let ((imenu-nail2 (format "interface %s" symbol-interface)))
+                  (cond
+
+                   ;; Symbol is inside function inside interface inside 
namespace
+                   (symbol-function
+                    (let ((imenu-nail3 (format "function %s" symbol-function)))
+                      (unless
+                          (gethash
+                           symbol-name
+                           (gethash
+                            imenu-nail3
+                            (gethash
+                             imenu-nail2
+                             (gethash
+                              imenu-nail
+                              phps-mode-parser-sdt-symbol-imenu--table))))
+                        (puthash
+                         symbol-name
+                         symbol-start
+                         (gethash
+                          imenu-nail3
+                          (gethash
+                           imenu-nail2
+                           (gethash
+                            imenu-nail
+                            phps-mode-parser-sdt-symbol-imenu--table)))))))
+
+                   ;; Symbol is inside interface inside namespace
+                   (t
+                    (unless
+                        (gethash
+                         symbol-name
+                         (gethash
+                          imenu-nail2
+                          (gethash
+                           imenu-nail
+                           phps-mode-parser-sdt-symbol-imenu--table)))
+                      (puthash
+                       symbol-name
+                       symbol-start
+                       (gethash
+                        imenu-nail2
+                        (gethash
+                         imenu-nail
+                         phps-mode-parser-sdt-symbol-imenu--table))))))))
+
+               ;; Symbol is inside trait inside namespace
+               (symbol-trait
+                (let ((imenu-nail2 (format "trait %s" symbol-trait)))
+                  (cond
+
+                   ;; Symbol is inside function inside trait inside a namespace
+                   (symbol-function
+                    (let ((imenu-nail3 (format "function %s" symbol-function)))
+                      (unless
+                          (gethash
+                           symbol-name
+                           (gethash
+                            imenu-nail3
+                            (gethash
+                             imenu-nail2
+                             (gethash
+                              imenu-nail
+                              phps-mode-parser-sdt-symbol-imenu--table))))
+                        (puthash
+                         symbol-name
+                         symbol-start
+                         (gethash
+                          imenu-nail3
+                          (gethash
+                           imenu-nail2
+                           (gethash
+                            imenu-nail
+                            phps-mode-parser-sdt-symbol-imenu--table)))))))
+
+                   ;; Symbol is inside trait inside namespace
+                   (t
+                    (unless
+                        (gethash
+                         symbol-name
+                         (gethash
+                          imenu-nail2
+                          (gethash
+                           imenu-nail
+                           phps-mode-parser-sdt-symbol-imenu--table)))
+                      (puthash
+                       symbol-name
+                       symbol-start
+                       (gethash
+                        imenu-nail2
+                        (gethash
+                         imenu-nail
+                         phps-mode-parser-sdt-symbol-imenu--table))))))))
+
+               ;; Symbol is inside a namespace
+               (t
+                (cond
+
+                 ;; Symbol is inside function inside namespace
+                 (symbol-function
+                  (let ((imenu-nail2 (format "function %s" symbol-function)))
+                    (unless
+                        (gethash
+                         symbol-name
+                         (gethash
+                          imenu-nail2
+                          (gethash
+                           imenu-nail
+                           phps-mode-parser-sdt-symbol-imenu--table)))
+                      (puthash
+                       symbol-name
+                       symbol-start
+                       (gethash
+                        imenu-nail2
+                        (gethash
+                         imenu-nail
+                         phps-mode-parser-sdt-symbol-imenu--table))))))
+
+                 ;; Symbol is inside a namespace
+                 (t
+                  (unless
+                      (gethash
+                       symbol-name
+                       (gethash
+                        imenu-nail
+                        phps-mode-parser-sdt-symbol-imenu--table))
+                    (puthash
+                     symbol-name
+                     symbol-start
+                     (gethash
+                      imenu-nail
+                      phps-mode-parser-sdt-symbol-imenu--table)))))))))
+
+           ;; Symbol is inside class
+           (symbol-class
+            (let ((imenu-nail (format "class %s" symbol-class)))
+              (cond
+
+               ;; Symbol is inside function inside class
+               (symbol-function
+                (let ((imenu-nail2 (format "function %s" symbol-function)))
+                  (unless
+                      (gethash
+                       symbol-name
+                       (gethash
+                        imenu-nail2
+                        (gethash
+                         imenu-nail
+                         phps-mode-parser-sdt-symbol-imenu--table)))
+                    (puthash
+                     symbol-name
+                     symbol-start
+                     (gethash
+                      imenu-nail2
+                      (gethash
+                       imenu-nail
+                       phps-mode-parser-sdt-symbol-imenu--table))))))
+
+               ;; Symbol is inside class
+               (t
+                (unless
+                    (gethash
+                     symbol-name
+                     (gethash
+                      imenu-nail
+                      phps-mode-parser-sdt-symbol-imenu--table))
+                  (puthash
+                   symbol-name
+                   symbol-start
+                   (gethash
+                    imenu-nail
+                    phps-mode-parser-sdt-symbol-imenu--table)))))))
+
+           ;; Symbol is inside trait
+           (symbol-trait
+            (let ((imenu-nail (format "trait %s" symbol-trait)))
+              (cond
+
+               ;; Symbol is inside function inside trait
+               (symbol-function
+                (let ((imenu-nail2 (format "function %s" symbol-function)))
+                  (unless
+                      (gethash
+                       symbol-name
+                       (gethash
+                        imenu-nail2
+                        (gethash
+                         imenu-nail
+                         phps-mode-parser-sdt-symbol-imenu--table)))
+                    (puthash
+                     symbol-name
+                     symbol-start
+                     (gethash
+                      imenu-nail2
+                      (gethash
+                       imenu-nail
+                       phps-mode-parser-sdt-symbol-imenu--table))))))
+
+               ;; Symbol is inside trait
+               (t
+                (unless
+                    (gethash
+                     symbol-name
+                     (gethash
+                      imenu-nail
+                      phps-mode-parser-sdt-symbol-imenu--table))
+                  (puthash
+                   symbol-name
+                   symbol-start
+                   (gethash
+                    imenu-nail
+                    phps-mode-parser-sdt-symbol-imenu--table)))))))
+
+           ;; Symbol is inside interface
+           (symbol-interface
+            (let ((imenu-nail (format "interface %s" symbol-interface)))
+              (cond
+
+               ;; Symbol is inside function inside interface
+               (symbol-function
+                (let ((imenu-nail2 (format "function %s" symbol-function)))
+                  (unless
+                      (gethash
+                       symbol-name
+                       (gethash
+                        imenu-nail2
+                        (gethash
+                         imenu-nail
+                         phps-mode-parser-sdt-symbol-imenu--table)))
+                    (puthash
+                     symbol-name
+                     symbol-start
+                     (gethash
+                      imenu-nail2
+                      (gethash
+                       imenu-nail
+                       phps-mode-parser-sdt-symbol-imenu--table))))))
+
+               ;; Symbol is inside interface
+               (t
+                (unless
+                    (gethash
+                     symbol-name
+                     (gethash
+                      imenu-nail
+                      phps-mode-parser-sdt-symbol-imenu--table))
+                  (puthash
+                   symbol-name
+                   symbol-start
+                   (gethash
+                    imenu-nail
+                    phps-mode-parser-sdt-symbol-imenu--table)))))))
+
+           (symbol-function
+            (let ((imenu-nail (format "function %s" symbol-function)))
+              (unless
+                  (gethash
+                   symbol-name
+                   (gethash
+                    imenu-nail
+                    phps-mode-parser-sdt-symbol-imenu--table))
+                (puthash
+                 symbol-name
+                 symbol-start
+                 (gethash
+                  imenu-nail
+                  phps-mode-parser-sdt-symbol-imenu--table)))))
+
+           ;; Symbol is in no scope
+           (t
+            (unless (gethash symbol-name 
phps-mode-parser-sdt-symbol-imenu--table)
+              (puthash
+               symbol-name
+               symbol-start
+               phps-mode-parser-sdt-symbol-imenu--table)))))
+
+
+        ;; (message
+        ;;  "assign symbol uri: %S from %S + %S, start: %S, end: %S, object: 
%S"
+        ;;  symbol-uri
+        ;;  symbol-name
+        ;;  symbol-scope
+        ;;  symbol-start
+        ;;  symbol-end
+        ;;  symbol-uri-object)
+
+        (setq
+         phps-mode-parser-sdt-symbol-table-index
+         (1+ phps-mode-parser-sdt-symbol-table-index))
+
+        ;; Register new symbol in symbol-table
+        ;; and place a reference to it in the symbol URI hash-map
+        (if (gethash symbol-uri phps-mode-parser-sdt-symbol-table-by-uri)
+            (progn
+              (puthash
+               phps-mode-parser-sdt-symbol-table-index
+               (list
+                symbol-uri
+                symbol-start
+                symbol-end)
+               phps-mode-parser-sdt-symbol-table)
+              (puthash
+               symbol-uri
+               (append
+                (gethash symbol-uri phps-mode-parser-sdt-symbol-table-by-uri)
+                (list phps-mode-parser-sdt-symbol-table-index))
+               phps-mode-parser-sdt-symbol-table-by-uri))
+
+          (puthash
+           phps-mode-parser-sdt-symbol-table-index
+           (list
+            symbol-uri
+            symbol-start
+            symbol-end)
+           phps-mode-parser-sdt-symbol-table)
+          (puthash
+           symbol-uri
+           (list phps-mode-parser-sdt-symbol-table-index)
+           phps-mode-parser-sdt-symbol-table-by-uri))))
+    (setq
+     phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack
+     nil))
+
+  (when phps-mode-parser-sdt--bookkeeping-symbol-stack
+    ;; Bookkeeping hit / misses of symbol references here
+    (dolist (
+             symbol-list
+             phps-mode-parser-sdt--bookkeeping-symbol-stack)
+      (let* ((symbol-name (nth 0 symbol-list))
+             (symbol-scope (nth 1 symbol-list))
+             (symbol-start (nth 2 symbol-list))
+             (symbol-end (nth 3 symbol-list))
+             (symbol-uri-object
+              (phps-mode-parser-sdt--get-symbol-uri
+               symbol-name
+               symbol-scope))
+             (symbol-uri (car symbol-uri-object))
+             (symbol-object-operator
+              (nth 13 (nth 1 symbol-uri-object)))
+             (symbol-hit 0))
+
+        (unless (and
+                 symbol-object-operator
+                 (not (string= (downcase symbol-object-operator) "$this")))
+          (cond
+
+           ;; Super-global variable
+           ((gethash
+             symbol-name
+             phps-mode-parser-sdt--bookkeeping--superglobal-variable-p)
+            (setq symbol-hit -1))
+
+           ;; Declared variable
+           ((gethash
+             symbol-uri
+             phps-mode-parser-sdt-symbol-table-by-uri)
+            ;; (message "matches: %S" (gethash
+            ;;  symbol-uri
+            ;;  phps-mode-parser-sdt-symbol-table-by-uri))
+            (let* ((matching-symbol-ids
+                    (gethash
+                     symbol-uri
+                     phps-mode-parser-sdt-symbol-table-by-uri))
+                   (matching-symbol-index 0)
+                   (matching-symbol-count (length matching-symbol-ids))
+                   (matching-hit))
+              (while (and
+                      (not matching-hit)
+                      (< matching-symbol-index matching-symbol-count))
+                (let* ((matching-symbol-id
+                        (nth matching-symbol-index matching-symbol-ids))
+                       (matching-symbol
+                        (gethash
+                         matching-symbol-id
+                         phps-mode-parser-sdt-symbol-table))
+                       (matching-symbol-start
+                        (nth 1 matching-symbol)))
+                  ;; (message "matching-symbol: %S" matching-symbol)
+                  ;; (message "matching-symbol-start: %S" 
matching-symbol-start)
+                  (when (<= matching-symbol-start symbol-start)
+                    (setq matching-hit t)
+                    (setq symbol-hit matching-symbol-id)))
+                (setq matching-symbol-index (1+ matching-symbol-index))))))
+
+          (puthash
+           (list
+            symbol-start
+            symbol-end)
+           symbol-hit
+           phps-mode-parser-sdt-bookkeeping))
+
+        ;; (message
+        ;;  "reference symbol uri: %S from %S + %S, start: %S, end: %S, 
object: %S, hit?: %S"
+        ;;  symbol-uri
+        ;;  symbol-name
+        ;;  symbol-scope
+        ;;  symbol-start
+        ;;  symbol-end
+        ;;  symbol-uri-object
+        ;;  symbol-hit)
+
+        ))
+    (setq
+     phps-mode-parser-sdt--bookkeeping-symbol-stack
+     nil)))
+
+
+;; SDT starts here
+
+;; 0 ((start) (top_statement_list))
+(puthash 0 (lambda(args _terminals) args) phps-mode-parser--table-translations)
+
+;; 1 ((reserved_non_modifiers) (T_INCLUDE))
+(puthash 1 (lambda(_args _terminals) 'T_INCLUDE) 
phps-mode-parser--table-translations)
+
+;; 2 ((reserved_non_modifiers) (T_INCLUDE_ONCE))
+(puthash 2 (lambda(_args _terminals) 'T_INCLUDE_ONCE) 
phps-mode-parser--table-translations)
+
+;; 3 ((reserved_non_modifiers) (T_EVAL))
+(puthash 3 (lambda(_args _terminals) 'T_EVAL) 
phps-mode-parser--table-translations)
+
+;; 4 ((reserved_non_modifiers) (T_REQUIRE))
+(puthash 4 (lambda(_args _terminals) 'T_REQUIRE) 
phps-mode-parser--table-translations)
+
+;; 5 ((reserved_non_modifiers) (T_REQUIRE_ONCE))
+(puthash 5 (lambda(_args _terminals) 'T_REQUIRE_ONCE) 
phps-mode-parser--table-translations)
+
+;; 6 ((reserved_non_modifiers) (T_LOGICAL_OR))
+(puthash 6 (lambda(_args _terminals) 'T_LOGICAL_OR) 
phps-mode-parser--table-translations)
+
+;; 7 ((reserved_non_modifiers) (T_LOGICAL_XOR))
+(puthash 7 (lambda(_args _terminals) 'T_LOGICAL_XOR) 
phps-mode-parser--table-translations)
+
+;; 8 ((reserved_non_modifiers) (T_LOGICAL_AND))
+(puthash 8 (lambda(_args _terminals) 'T_LOGICAL_AND) 
phps-mode-parser--table-translations)
+
+;; 9 ((reserved_non_modifiers) (T_INSTANCEOF))
+(puthash 9 (lambda(_args _terminals) 'T_INSTANCEOF) 
phps-mode-parser--table-translations)
+
+;; 10 ((reserved_non_modifiers) (T_NEW))
+(puthash 10 (lambda(_args _terminals) 'T_NEW) 
phps-mode-parser--table-translations)
+
+;; 11 ((reserved_non_modifiers) (T_CLONE))
+(puthash 11 (lambda(_args _terminals) 'T_CLONE) 
phps-mode-parser--table-translations)
+
+;; 12 ((reserved_non_modifiers) (T_EXIT))
+(puthash 12 (lambda(_args _terminals) 'T_EXIT) 
phps-mode-parser--table-translations)
+
+;; 13 ((reserved_non_modifiers) (T_IF))
+(puthash 13 (lambda(_args _terminals) 'T_IF) 
phps-mode-parser--table-translations)
+
+;; 14 ((reserved_non_modifiers) (T_ELSEIF))
+(puthash 14 (lambda(_args _terminals) 'T_ELSEIF) 
phps-mode-parser--table-translations)
+
+;; 15 ((reserved_non_modifiers) (T_ELSE))
+(puthash 15 (lambda(_args _terminals) 'T_ELSE) 
phps-mode-parser--table-translations)
+
+;; 16 ((reserved_non_modifiers) (T_ENDIF))
+(puthash 16 (lambda(_args _terminals) 'T_ENDIF) 
phps-mode-parser--table-translations)
+
+;; 17 ((reserved_non_modifiers) (T_ECHO))
+(puthash 17 (lambda(_args _terminals) 'T_ECHO) 
phps-mode-parser--table-translations)
+
+;; 18 ((reserved_non_modifiers) (T_DO))
+(puthash 18 (lambda(_args _terminals) 'T_DO) 
phps-mode-parser--table-translations)
+
+;; 19 ((reserved_non_modifiers) (T_WHILE))
+(puthash 19 (lambda(_args _terminals) 'T_WHILE) 
phps-mode-parser--table-translations)
+
+;; 20 ((reserved_non_modifiers) (T_ENDWHILE))
+(puthash 20 (lambda(_args _terminals) 'T_ENDWHILE) 
phps-mode-parser--table-translations)
+
+;; 21 ((reserved_non_modifiers) (T_FOR))
+(puthash 21 (lambda(_args _terminals) 'T_FOR) 
phps-mode-parser--table-translations)
+
+;; 22 ((reserved_non_modifiers) (T_ENDFOR))
+(puthash 22 (lambda(_args _terminals) 'T_ENDFOR) 
phps-mode-parser--table-translations)
+
+;; 23 ((reserved_non_modifiers) (T_FOREACH))
+(puthash 23 (lambda(_args _terminals) 'T_FOREACH) 
phps-mode-parser--table-translations)
+
+;; 24 ((reserved_non_modifiers) (T_ENDFOREACH))
+(puthash 24 (lambda(_args _terminals) 'T_ENDFOREACH) 
phps-mode-parser--table-translations)
+
+;; 25 ((reserved_non_modifiers) (T_DECLARE))
+(puthash 25 (lambda(_args _terminals) 'T_DECLARE) 
phps-mode-parser--table-translations)
+
+;; 26 ((reserved_non_modifiers) (T_ENDDECLARE))
+(puthash 26 (lambda(_args _terminals) 'T_ENDDECLARE) 
phps-mode-parser--table-translations)
+
+;; 27 ((reserved_non_modifiers) (T_AS))
+(puthash 27 (lambda(_args _terminals) 'T_AS) 
phps-mode-parser--table-translations)
+
+;; 28 ((reserved_non_modifiers) (T_TRY))
+(puthash 28 (lambda(_args _terminals) 'T_TRY) 
phps-mode-parser--table-translations)
+
+;; 29 ((reserved_non_modifiers) (T_CATCH))
+(puthash 29 (lambda(_args _terminals) 'T_CATCH) 
phps-mode-parser--table-translations)
+
+;; 30 ((reserved_non_modifiers) (T_FINALLY))
+(puthash 30 (lambda(_args _terminals) 'T_FINALLY) 
phps-mode-parser--table-translations)
+
+;; 31 ((reserved_non_modifiers) (T_THROW))
+(puthash 31 (lambda(_args _terminals) 'T_THROW) 
phps-mode-parser--table-translations)
+
+;; 32 ((reserved_non_modifiers) (T_USE))
+(puthash 32 (lambda(_args _terminals) 'T_USE) 
phps-mode-parser--table-translations)
+
+;; 33 ((reserved_non_modifiers) (T_INSTEADOF))
+(puthash 33 (lambda(_args _terminals) 'T_INSTEADOF) 
phps-mode-parser--table-translations)
+
+;; 34 ((reserved_non_modifiers) (T_GLOBAL))
+(puthash 34 (lambda(_args _terminals) 'T_GLOBAL) 
phps-mode-parser--table-translations)
+
+;; 35 ((reserved_non_modifiers) (T_VAR))
+(puthash 35 (lambda(_args _terminals) 'T_VAR) 
phps-mode-parser--table-translations)
+
+;; 36 ((reserved_non_modifiers) (T_UNSET))
+(puthash 36 (lambda(_args _terminals) 'T_UNSET) 
phps-mode-parser--table-translations)
+
+;; 37 ((reserved_non_modifiers) (T_ISSET))
+(puthash 37 (lambda(_args _terminals) 'T_ISSET) 
phps-mode-parser--table-translations)
+
+;; 38 ((reserved_non_modifiers) (T_EMPTY))
+(puthash 38 (lambda(_args _terminals) 'T_EMPTY) 
phps-mode-parser--table-translations)
+
+;; 39 ((reserved_non_modifiers) (T_CONTINUE))
+(puthash 39 (lambda(_args _terminals) 'T_CONTINUE) 
phps-mode-parser--table-translations)
+
+;; 40 ((reserved_non_modifiers) (T_GOTO))
+(puthash 40 (lambda(_args _terminals) 'T_GOTO) 
phps-mode-parser--table-translations)
+
+;; 41 ((reserved_non_modifiers) (T_FUNCTION))
+(puthash 41 (lambda(_args _terminals) 'T_FUNCTION) 
phps-mode-parser--table-translations)
+
+;; 42 ((reserved_non_modifiers) (T_CONST))
+(puthash 42 (lambda(_args _terminals) 'T_CONST) 
phps-mode-parser--table-translations)
+
+;; 43 ((reserved_non_modifiers) (T_RETURN))
+(puthash 43 (lambda(_args _terminals) 'T_RETURN) 
phps-mode-parser--table-translations)
+
+;; 44 ((reserved_non_modifiers) (T_PRINT))
+(puthash 44 (lambda(_args _terminals) 'T_PRINT) 
phps-mode-parser--table-translations)
+
+;; 45 ((reserved_non_modifiers) (T_YIELD))
+(puthash 45 (lambda(_args _terminals) 'T_YIELD) 
phps-mode-parser--table-translations)
+
+;; 46 ((reserved_non_modifiers) (T_LIST))
+(puthash 46 (lambda(_args _terminals) 'T_LIST) 
phps-mode-parser--table-translations)
+
+;; 47 ((reserved_non_modifiers) (T_SWITCH))
+(puthash 47 (lambda(_args _terminals) 'T_SWITCH) 
phps-mode-parser--table-translations)
+
+;; 48 ((reserved_non_modifiers) (T_ENDSWITCH))
+(puthash 48 (lambda(_args _terminals) 'T_ENDSWITCH) 
phps-mode-parser--table-translations)
+
+;; 49 ((reserved_non_modifiers) (T_CASE))
+(puthash 49 (lambda(_args _terminals) 'T_CASE) 
phps-mode-parser--table-translations)
+
+;; 50 ((reserved_non_modifiers) (T_DEFAULT))
+(puthash 50 (lambda(_args _terminals) 'T_DEFAULT) 
phps-mode-parser--table-translations)
+
+;; 51 ((reserved_non_modifiers) (T_BREAK))
+(puthash 51 (lambda(_args _terminals) 'T_BREAK) 
phps-mode-parser--table-translations)
+
+;; 52 ((reserved_non_modifiers) (T_ARRAY))
+(puthash 52 (lambda(_args _terminals) 'T_ARRAY) 
phps-mode-parser--table-translations)
+
+;; 53 ((reserved_non_modifiers) (T_CALLABLE))
+(puthash 53 (lambda(_args _terminals) 'T_CALLABLE) 
phps-mode-parser--table-translations)
+
+;; 54 ((reserved_non_modifiers) (T_EXTENDS))
+(puthash 54 (lambda(_args _terminals) 'T_EXTENDS) 
phps-mode-parser--table-translations)
+
+;; 55 ((reserved_non_modifiers) (T_IMPLEMENTS))
+(puthash 55 (lambda(_args _terminals) 'T_IMPLEMENTS) 
phps-mode-parser--table-translations)
+
+;; 56 ((reserved_non_modifiers) (T_NAMESPACE))
+(puthash 56 (lambda(_args _terminals) 'T_NAMESPACE) 
phps-mode-parser--table-translations)
+
+;; 57 ((reserved_non_modifiers) (T_TRAIT))
+(puthash 57 (lambda(_args _terminals) 'T_TRAIT) 
phps-mode-parser--table-translations)
+
+;; 58 ((reserved_non_modifiers) (T_INTERFACE))
+(puthash 58 (lambda(_args _terminals) 'T_INTERFACE) 
phps-mode-parser--table-translations)
+
+;; 59 ((reserved_non_modifiers) (T_CLASS))
+(puthash 59 (lambda(_args _terminals) 'T_CLASS) 
phps-mode-parser--table-translations)
+
+;; 60 ((reserved_non_modifiers) (T_CLASS_C))
+(puthash 60 (lambda(_args _terminals) 'T_CLASS_C) 
phps-mode-parser--table-translations)
+
+;; 61 ((reserved_non_modifiers) (T_TRAIT_C))
+(puthash 61 (lambda(_args _terminals) 'T_TRAIT_C) 
phps-mode-parser--table-translations)
+
+;; 62 ((reserved_non_modifiers) (T_FUNC_C))
+(puthash 62 (lambda(_args _terminals) 'T_FUNC_C) 
phps-mode-parser--table-translations)
+
+;; 63 ((reserved_non_modifiers) (T_METHOD_C))
+(puthash 63 (lambda(_args _terminals) 'T_METHOD_C) 
phps-mode-parser--table-translations)
+
+;; 64 ((reserved_non_modifiers) (T_LINE))
+(puthash 64 (lambda(_args _terminals) 'T_LINE) 
phps-mode-parser--table-translations)
+
+;; 65 ((reserved_non_modifiers) (T_FILE))
+(puthash 65 (lambda(_args _terminals) 'T_FILE) 
phps-mode-parser--table-translations)
+
+;; 66 ((reserved_non_modifiers) (T_DIR))
+(puthash 66 (lambda(_args _terminals) 'T_DIR) 
phps-mode-parser--table-translations)
+
+;; 67 ((reserved_non_modifiers) (T_NS_C))
+(puthash 67 (lambda(_args _terminals) 'T_NS_C) 
phps-mode-parser--table-translations)
+
+;; 68 ((reserved_non_modifiers) (T_FN))
+(puthash 68 (lambda(_args _terminals) 'T_FN) 
phps-mode-parser--table-translations)
+
+;; 69 ((reserved_non_modifiers) (T_MATCH))
+(puthash 69 (lambda(_args _terminals) 'T_MATCH) 
phps-mode-parser--table-translations)
+
+;; 70 ((reserved_non_modifiers) (T_ENUM))
+(puthash 70 (lambda(_args _terminals) 'T_ENUM) 
phps-mode-parser--table-translations)
+
+;; 71 ((semi_reserved) (reserved_non_modifiers))
+(puthash 71 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 72 ((semi_reserved) (T_STATIC))
+(puthash 72 (lambda(_args _terminals) 'T_STATIC) 
phps-mode-parser--table-translations)
+
+;; 73 ((semi_reserved) (T_ABSTRACT))
+(puthash 73 (lambda(_args _terminals) 'T_ABSTRACT) 
phps-mode-parser--table-translations)
+
+;; 74 ((semi_reserved) (T_FINAL))
+(puthash 74 (lambda(_args _terminals) 'T_FINAL) 
phps-mode-parser--table-translations)
+
+;; 75 ((semi_reserved) (T_PRIVATE))
+(puthash 75 (lambda(_args _terminals) 'T_PRIVATE) 
phps-mode-parser--table-translations)
+
+;; 76 ((semi_reserved) (T_PROTECTED))
+(puthash 76 (lambda(_args _terminals) 'T_PROTECTED) 
phps-mode-parser--table-translations)
+
+;; 77 ((semi_reserved) (T_PUBLIC))
+(puthash 77 (lambda(_args _terminals) 'T_PUBLIC) 
phps-mode-parser--table-translations)
+
+;; 78 ((semi_reserved) (T_READONLY))
+(puthash 78 (lambda(_args _terminals) 'T_READONLY) 
phps-mode-parser--table-translations)
+
+;; 79 ((ampersand) (T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG))
+(puthash 79 (lambda(_args _terminals) 'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG) 
phps-mode-parser--table-translations)
+
+;; 80 ((ampersand) (T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG))
+(puthash 80 (lambda(_args _terminals) 
'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG) 
phps-mode-parser--table-translations)
+
+;; 81 ((identifier) (T_STRING))
+(puthash 81 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 82 ((identifier) (semi_reserved))
+(puthash 82 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 83 ((top_statement_list) (top_statement_list top_statement))
+(puthash
+ 83
+ (lambda(args _terminals)
+   (if (car args) (append (car args) (cdr args)) (cdr args)))
+ phps-mode-parser--table-translations)
+
+;; 84 ((top_statement_list) (%empty))
+(puthash 84 (lambda(_args _terminals) nil) 
phps-mode-parser--table-translations)
+
+;; 85 ((namespace_declaration_name) (identifier))
+(puthash
+ 85
+ (lambda(args terminals)
+   (let ((name args)
+         (index (car (cdr terminals))))
+
+     ;; Add to imenu if not there already
+     (let ((imenu-nail (format "namespace %s" name)))
+       (unless (gethash
+                imenu-nail
+                phps-mode-parser-sdt-symbol-imenu--table)
+         (let ((namespace-table (make-hash-table :test 'equal)))
+           (puthash
+            'declaration
+            index
+            namespace-table)
+           (puthash
+            imenu-nail
+            namespace-table
+            phps-mode-parser-sdt-symbol-imenu--table))))
+
+     (push
+      (list 'namespace name index)
+      phps-mode-parser-sdt--bookkeeping-namespace)
+     (setq
+      phps-mode-parser-sdt-symbol-imenu--namespace
+      (list name (car (cdr terminals))))
+
+     args))
+ phps-mode-parser--table-translations)
+
+;; 86 ((namespace_declaration_name) (T_NAME_QUALIFIED))
+(puthash
+ 86
+ (lambda(args terminals)
+   (let ((name args)
+         (index (car (cdr terminals))))
+
+     ;; Add to imenu if not there already
+     (let ((imenu-nail (format "namespace %s" name)))
+       (unless (gethash
+                imenu-nail
+                phps-mode-parser-sdt-symbol-imenu--table)
+         (let ((namespace-table (make-hash-table :test 'equal)))
+           (puthash
+            'declaration
+            index
+            namespace-table)
+           (puthash
+            imenu-nail
+            namespace-table
+            phps-mode-parser-sdt-symbol-imenu--table))))
+
+     (push
+      (list 'namespace name index)
+      phps-mode-parser-sdt--bookkeeping-namespace)
+     (setq
+      phps-mode-parser-sdt-symbol-imenu--namespace
+      (list name (car (cdr terminals))))
+
+     args))
+ phps-mode-parser--table-translations)
+
+;; 87 ((namespace_name) (T_STRING))
+(puthash 87 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 88 ((namespace_name) (T_NAME_QUALIFIED))
+(puthash 88 (lambda(_args terminals) terminals) 
phps-mode-parser--table-translations)
+
+;; 89 ((legacy_namespace_name) (namespace_name))
+(puthash 89 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 90 ((legacy_namespace_name) (T_NAME_FULLY_QUALIFIED))
+(puthash 90 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 91 ((name) (T_STRING))
+(puthash 91 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 92 ((name) (T_NAME_QUALIFIED))
+(puthash 92 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 93 ((name) (T_NAME_FULLY_QUALIFIED))
+(puthash 93 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 94 ((name) (T_NAME_RELATIVE))
+(puthash 94 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 95 ((attribute_decl) (class_name))
+(puthash
+ 95
+ (lambda(args _terminals)
+   `(
+     ast-type
+     attribute-decl
+     class-name
+     ,args
+     ))
+ phps-mode-parser--table-translations)
+
+;; 96 ((attribute_decl) (class_name argument_list))
+(puthash
+ 96
+ (lambda(args _terminals)
+   `(
+     ast-type
+     attribute-decl
+     class-name
+     ,(nth 0 args)
+     argument-list
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 97 ((attribute_group) (attribute_decl))
+(puthash
+ 97
+ (lambda(args _terminals)
+   `(
+     ast-type
+     attribute-group
+     attribute-decl
+     (,args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 98 ((attribute_group) (attribute_group "," attribute_decl))
+(puthash
+ 98
+ (lambda(args _terminals)
+   `(
+     ast-type
+     attribute-group
+     attribute-group
+     ,(append (plist-get (nth 0 args) 'ast-type) (list (nth 2 args)))
+     ))
+ phps-mode-parser--table-translations)
+
+;; 99 ((attribute) (T_ATTRIBUTE attribute_group possible_comma "]"))
+(puthash
+ 99
+ (lambda(args _terminals)
+   `(
+     ast-type
+     attribute
+     attribute-group
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 100 ((attributes) (attribute))
+(puthash
+ 100
+ (lambda(args _terminals)
+   `(
+     ast-type
+     attributes
+     attributes
+     (,args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 101 ((attributes) (attributes attribute))
+(puthash 101 (lambda(args _terminals) (append (nth 0 args) (list (nth 1 
args)))) phps-mode-parser--table-translations)
+
+;; 102 ((attributed_statement) (function_declaration_statement))
+(puthash 102 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 103 ((attributed_statement) (class_declaration_statement))
+(puthash 103 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 104 ((attributed_statement) (trait_declaration_statement))
+(puthash 104 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 105 ((attributed_statement) (interface_declaration_statement))
+(puthash 105 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 106 ((attributed_statement) (enum_declaration_statement))
+(puthash 106 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 107 ((top_statement) (statement))
+(puthash
+ 107
+ (lambda(args _terminals)
+   (phps-mode-parser-sdt--parse-top-statement)
+   args)
+ phps-mode-parser--table-translations)
+
+;; 108 ((top_statement) (attributed_statement))
+(puthash
+ 108
+ (lambda(args _terminals)
+   (phps-mode-parser-sdt--parse-top-statement)
+   args)
+ phps-mode-parser--table-translations)
+
+;; 109 ((top_statement) (attributes attributed_statement))
+(puthash
+ 109
+ (lambda(args _terminals)
+   (phps-mode-parser-sdt--parse-top-statement)
+   args)
+ phps-mode-parser--table-translations)
+
+;; 110 ((top_statement) (T_HALT_COMPILER "(" ")" ";"))
+(puthash
+ 109
+ (lambda(args _terminals)
+   (phps-mode-parser-sdt--parse-top-statement)
+   (nth 0 args))
+ phps-mode-parser--table-translations)
+
+;; 111 top_statement -> (T_NAMESPACE namespace_declaration_name ";")
+(puthash
+ 111
+ (lambda(args terminals)
+   (phps-mode-parser-sdt--parse-top-statement)
+   `(
+     ast-type
+     namespace
+     ast-name
+     ,(nth 1 args)
+     ast-index
+     ,(car (cdr (nth 1 terminals)))
+     ast-start
+     ,(car (cdr (nth 1 terminals)))
+     ast-end
+     ,(cdr (cdr (nth 1 terminals)))))
+ phps-mode-parser--table-translations)
+
+;; 112 top_statement -> (T_NAMESPACE namespace_declaration_name "{" 
top_statement_list "}")
+(puthash
+ 112
+ (lambda(args terminals)
+   (phps-mode-parser-sdt--parse-top-statement)
+   (setq
+    phps-mode-parser-sdt-symbol-imenu--namespace
+    nil)
+   (setq
+    phps-mode-parser-sdt--bookkeeping-namespace
+    nil)
+   `(
+     ast-type
+     namespace
+     ast-name
+     ,(nth 1 args)
+     ast-index
+     ,(car (cdr (nth 1 terminals)))
+     ast-start
+     ,(car (cdr (nth 2 terminals)))
+     ast-end
+     ,(cdr (cdr (nth 2 terminals)))
+     top-statement-list
+     ,(nth 3 args)))
+ phps-mode-parser--table-translations)
+
+;; 113 top_statement -> (T_NAMESPACE "{" top_statement_list "}")
+(puthash
+ 113
+ (lambda(args terminals)
+   (phps-mode-parser-sdt--parse-top-statement)
+   `(
+     ast-type
+     namespace
+     ast-index
+     ,(car (cdr (nth 0 terminals)))
+     ast-start
+     ,(car (cdr (nth 1 terminals)))
+     ast-end
+     ,(car (cdr (nth 3 terminals)))
+     top-statement-list
+     ,(nth 2 args)))
+ phps-mode-parser--table-translations)
+
+;; 114 ((top_statement) (T_USE mixed_group_use_declaration ";"))
+(puthash
+ 114
+ (lambda(args _terminals)
+   (phps-mode-parser-sdt--parse-top-statement)
+   `(
+     ast-type
+     mixed-group-use-declaration-top-statement
+     ast-value
+     ,(nth 1 args)))
+ phps-mode-parser--table-translations)
+
+;; 115 ((top_statement) (T_USE use_type group_use_declaration ";"))
+(puthash
+ 115
+ (lambda(args _terminals)
+   (phps-mode-parser-sdt--parse-top-statement)
+   `(
+     ast-type
+     type-group-use-declaration-top-statement
+     use-type
+     ,(nth 1 args)
+     group-use-declaration
+     ,(nth 2 args)))
+ phps-mode-parser--table-translations)
+
+;; 116 ((top_statement) (T_USE use_declarations ";"))
+(puthash
+ 116
+ (lambda(args _terminals)
+   (phps-mode-parser-sdt--parse-top-statement)
+   `(
+     ast-type
+     use-declarations-top-statement
+     ast-value
+     ,(nth 1 args)))
+ phps-mode-parser--table-translations)
+
+;; 117 ((top_statement) (T_USE use_type use_declarations ";"))
+(puthash
+ 117
+ (lambda(args _terminals)
+   (phps-mode-parser-sdt--parse-top-statement)
+   `(
+     ast-type
+     type-use-declarations-top-statement
+     ast-value
+     ,(nth 1 args)))
+ phps-mode-parser--table-translations)
+
+;; 118 ((top_statement) (T_CONST const_list ";"))
+(puthash
+ 118
+ (lambda(args _terminals)
+   (phps-mode-parser-sdt--parse-top-statement)
+   `(
+     ast-type
+     const-list-top-statement
+     ast-value
+     ,(nth 1 args)))
+ phps-mode-parser--table-translations)
+
+;; 119 ((use_type) (T_FUNCTION))
+(puthash 119 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 120 ((use_type) (T_CONST))
+(puthash 120 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 121 ((group_use_declaration) (legacy_namespace_name T_NS_SEPARATOR "{" 
unprefixed_use_declarations possible_comma "}"))
+(puthash
+ 121
+ (lambda(args _terminals)
+   `(
+     ast-type
+     legacy-group-use-declaration
+     unprefixed-use-declarations
+     ,(nth 3 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 122 ((mixed_group_use_declaration) (legacy_namespace_name T_NS_SEPARATOR 
"{" inline_use_declarations possible_comma "}"))
+(puthash
+ 122
+ (lambda(args _terminals)
+   `(
+     ast-type
+     mixed-group-use-declaration
+     inline-use-declarations
+     ,(nth 3 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 123 ((possible_comma) (%empty))
+(puthash 123 (lambda(_args _terminals) nil) 
phps-mode-parser--table-translations)
+
+;; 124 ((possible_comma) (","))
+(puthash 124 (lambda(_args _terminals) nil) 
phps-mode-parser--table-translations)
+
+;; 125 ((inline_use_declarations) (inline_use_declarations "," 
inline_use_declaration))
+(puthash
+ 125
+ (lambda(args _terminals)
+   `(
+     ast-type
+     inline-use-declarations
+     ,(append (nth 0 args) (list (nth 2 args)))
+     ))
+ phps-mode-parser--table-translations)
+
+;; 126 ((inline_use_declarations) (inline_use_declaration))
+(puthash
+ 126
+ (lambda(args _terminals)
+   `(
+     ast-type
+     inline-use-declarations
+     ,(list (nth 1 args))
+     ))
+ phps-mode-parser--table-translations)
+
+;; 127 ((unprefixed_use_declarations) (unprefixed_use_declarations "," 
unprefixed_use_declaration))
+(puthash
+ 127
+ (lambda(args _terminals)
+   `(
+     ast-type
+     unprefixed-use-declarations
+     ,(append (nth 0 args) (list (nth 2 args)))
+     ))
+ phps-mode-parser--table-translations)
+
+;; 128 ((unprefixed_use_declarations) (unprefixed_use_declaration))
+(puthash
+ 128
+ (lambda(args _terminals)
+   `(
+     ast-type
+     unprefixed-use-declarations
+     ,(list args))
+   )
+ phps-mode-parser--table-translations)
+
+;; 129 ((use_declarations) (use_declarations "," use_declaration))
+(puthash
+ 129
+ (lambda(args _terminals)
+   `(
+     ast-type
+     use-declarations
+     ,(append (nth 0 args) (list (nth 2 args)))
+     ))
+ phps-mode-parser--table-translations)
+
+;; 130 ((use_declarations) (use_declaration))
+(puthash
+ 130
+ (lambda(args _terminals)
+   `(
+     ast-type
+     use-declarations
+     ,(list args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 131 ((inline_use_declaration) (unprefixed_use_declaration))
+(puthash
+ 131
+ (lambda(args _terminals)
+   `(
+     ast-type
+     inline-use-declaration
+     declation
+     ,(list args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 132 ((inline_use_declaration) (use_type unprefixed_use_declaration))
+(puthash
+ 132
+ (lambda(args _terminals)
+   `(
+     ast-type
+     inline-use-declaration
+     use-type
+     ,(nth 0 args)
+     declaration
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 133 ((unprefixed_use_declaration) (namespace_name))
+(puthash
+ 133
+ (lambda(args _terminals)
+   `(
+     namespace-name
+     ,args
+     ))
+ phps-mode-parser--table-translations)
+
+;; 134 ((unprefixed_use_declaration) (namespace_name T_AS T_STRING))
+(puthash
+ 134
+ (lambda(args _terminals)
+   `(
+     namespace-name
+     ,(nth 0 args)
+     as
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 135 ((use_declaration) (legacy_namespace_name))
+(puthash
+ 135
+ (lambda(args _terminals)
+   `(
+     ast-type
+     use-declaration
+     legacy-namespace-name
+     ,args
+     ))
+ phps-mode-parser--table-translations)
+
+;; 136 ((use_declaration) (legacy_namespace_name T_AS T_STRING))
+(puthash
+ 136
+ (lambda(args _terminals)
+   `(
+     ast-type
+     use-declaration
+     legacy-namespace-name
+     ,(nth 0 args)
+     as
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 137 ((const_list) (const_list "," const_decl))
+(puthash 137 (lambda(args _terminals) (append (nth 0 args) (list (nth 2 
args)))) phps-mode-parser--table-translations)
+
+;; 138 ((const_list) (const_decl))
+(puthash 138 (lambda(args _terminals) (list args)) 
phps-mode-parser--table-translations)
+
+;; 139 inner_statement_list -> (inner_statement_list inner_statement)
+(puthash
+ 139
+ (lambda(args _terminals)
+   (if (car args)
+       (append (car args) (cdr args))
+     (cdr args)))
+ phps-mode-parser--table-translations)
+
+;; 140 ((inner_statement_list) (%empty))
+(puthash 140 (lambda(_args _terminals) nil) 
phps-mode-parser--table-translations)
+
+;; 141 ((inner_statement) (statement))
+(puthash 141 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 142 ((inner_statement) (attributed_statement))
+(puthash 142 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 143 ((inner_statement) (attributes attributed_statement))
+(puthash 143 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 144 ((inner_statement) (T_HALT_COMPILER "(" ")" ";"))
+(puthash 144 (lambda(_args _terminals) '(ast-type 
halt-compiler-inner-statement)) phps-mode-parser--table-translations)
+
+;; 145 ((statement) ("{" inner_statement_list "}"))
+(puthash
+ 145
+ (lambda(args _terminals)
+   (nth 1 args))
+ phps-mode-parser--table-translations)
+
+;; 146 ((statement) (if_stmt))
+(puthash
+ 146
+ (lambda(args _terminals)
+   args)
+ phps-mode-parser--table-translations)
+
+;; 147 ((statement) (alt_if_stmt))
+(puthash
+ 147
+ (lambda(args _terminals)
+   args)
+ phps-mode-parser--table-translations)
+
+;; 148 ((statement) (T_WHILE "(" expr ")" while_statement))
+(puthash
+ 148
+ (lambda(args _terminals)
+   `(
+     ast-type
+     while-statement
+     expr
+     ,(nth 2 args)
+     while-statement
+     ,(nth 4 args))
+   )
+ phps-mode-parser--table-translations)
+
+;; 149 ((statement) (T_DO statement T_WHILE "(" expr ")" ";"))
+(puthash
+ 149
+ (lambda(args _terminals)
+   `(
+     ast-type
+     do-statement
+     statement
+     ,(nth 1 args)
+     expr
+     ,(nth 4 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 150 ((statement) (T_FOR "(" for_exprs ";" for_exprs ";" for_exprs ")" 
for_statement))
+(puthash
+ 150
+ (lambda(args _terminals)
+   `(
+     ast-type
+     for-statement
+     initial
+     ,(nth 2 args)
+     test
+     ,(nth 4 args)
+     incremental
+     ,(nth 6 args)
+     for-statement
+     ,(nth 8 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 151 ((statement) (T_SWITCH "(" expr ")" switch_case_list))
+(puthash
+ 151
+ (lambda(args _terminals)
+   `(
+     ast-type
+     switch-statement
+     expr
+     ,(nth 2 args)
+     switch-case-list
+     ,(nth 4 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 152 ((statement) (T_BREAK optional_expr ";"))
+(puthash
+ 152
+ (lambda(args _terminals)
+   `(
+     ast-type
+     break-statement
+     optional-expr
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 153 ((statement) (T_CONTINUE optional_expr ";"))
+(puthash
+ 153
+ (lambda(args _terminals)
+   `(
+     ast-type
+     continue-statement
+     optional-expr
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 154 ((statement) (T_RETURN optional_expr ";"))
+(puthash
+ 154
+ (lambda(args _terminals)
+   `(
+     ast-type
+     return-statement
+     optional-expr
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 155 ((statement) (T_GLOBAL global_var_list ";"))
+(puthash
+ 155
+ (lambda(args _terminals)
+   (dolist (stack-item phps-mode-parser-sdt--bookkeeping-symbol-stack)
+     (push '(global) (nth 1 stack-item)))
+   (let ((global-var-list (nth 1 args)))
+     (dolist (global-var global-var-list)
+       (let ((global-var-type (plist-get global-var 'ast-type)))
+         (cond
+          ((equal global-var-type 'simple-variable-variable)
+           (let ((variable-name (plist-get global-var 'variable))
+                 (variable-start (plist-get global-var 'ast-start))
+                 (variable-end (plist-get global-var 'ast-end)))
+             (push
+              (list
+               variable-name
+               phps-mode-parser-sdt--bookkeeping-namespace
+               variable-start
+               variable-end)
+              phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack)))))))
+   `(
+     ast-type
+     global-statement
+     global-var-list
+     ,(nth 1 args)))
+ phps-mode-parser--table-translations)
+
+;; 156 ((statement) (T_STATIC static_var_list ";"))
+(puthash
+ 156
+ (lambda(args _terminals)
+   (let ((static-var-list (nth 1 args)))
+     (dolist (static-var static-var-list)
+       (let ((static-var-type (plist-get static-var 'ast-type)))
+         (cond
+          ((equal static-var-type 'variable)
+           (let* ((variable-name (plist-get static-var 'ast-name))
+                  (variable-start (plist-get static-var 'ast-start))
+                  (variable-end (plist-get static-var 'ast-end)))
+             (push
+              (list
+               variable-name
+               phps-mode-parser-sdt--bookkeeping-namespace
+               variable-start
+               variable-end)
+              phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack)
+             (push
+              (list
+               variable-name
+               phps-mode-parser-sdt--bookkeeping-namespace
+               variable-start
+               variable-end)
+              phps-mode-parser-sdt--bookkeeping-symbol-stack)))))))
+   `(
+     ast-type
+     static-statement
+     static-var-list
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 157 ((statement) (T_ECHO echo_expr_list ";"))
+(puthash
+ 157
+ (lambda(args _terminals)
+   `(
+     ast-type
+     echo-statement
+     echo-expr-list
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 158 ((statement) (T_INLINE_HTML))
+(puthash
+ 158
+ (lambda(args _terminals)
+   args)
+ phps-mode-parser--table-translations)
+
+;; 159 ((statement) (expr ";"))
+(puthash
+ 159
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-statement
+     expr
+     ,(nth 0 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 160 ((statement) (T_UNSET "(" unset_variables possible_comma ")" ";"))
+(puthash
+ 160
+ (lambda(args _terminals)
+   (nth 0 args))
+ phps-mode-parser--table-translations)
+
+;; 161 ((statement) (T_FOREACH "(" expr T_AS foreach_variable ")" 
foreach_statement))
+(puthash
+ 161
+ (lambda(args _terminals)
+   `(
+     ast-type
+     foreach-statement
+     expr
+     ,(nth 2 args)
+     as
+     ,(nth 4 args)
+     foreach-statement
+     ,(nth 6 args)))
+ phps-mode-parser--table-translations)
+
+;; 162 ((statement) (T_FOREACH "(" expr T_AS foreach_variable T_DOUBLE_ARROW 
foreach_variable ")" foreach_statement))
+(puthash
+ 162
+ (lambda(args _terminals)
+   `(
+     ast-type
+     foreach-statement
+     expr
+     ,(nth 2 args)
+     as
+     ,(nth 4 args)
+     value
+     ,(nth 6 args)
+     foreach-statement
+     ,(nth 8 args)))
+ phps-mode-parser--table-translations)
+
+;; 163 ((statement) (T_DECLARE "(" const_list ")" declare_statement))
+(puthash
+ 163
+ (lambda(args _terminals)
+   `(
+     ast-type
+     declare-statement
+     const-list
+     ,(nth 2 args)
+     declare-statement
+     ,(nth 4 args)
+     value
+     ,(nth 6 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 164 ((statement) (";"))
+(puthash
+ 164
+ (lambda(_args _terminals)
+   nil)
+ phps-mode-parser--table-translations)
+
+;; 165 ((statement) (T_TRY "{" inner_statement_list "}" catch_list 
finally_statement))
+(puthash
+ 165
+ (lambda(args _terminals)
+   `(
+     ast-type
+     try-statement
+     inner-statement-list
+     ,(nth 2 args)
+     catch-list
+     ,(nth 4 args)
+     finally-statement
+     ,(nth 5 args)))
+ phps-mode-parser--table-translations)
+
+;; 166 ((statement) (T_GOTO T_STRING ";"))
+(puthash
+ 166
+ (lambda(args _terminals)
+   `(
+     ast-type
+     goto-statement
+     label
+     ,(nth 1 args)))
+ phps-mode-parser--table-translations)
+
+;; 167 ((statement) (T_STRING ":"))
+(puthash
+ 167
+ (lambda(args _terminals)
+   `(
+     ast-type
+     label-statement
+     label
+     ,(nth 0 args)))
+ phps-mode-parser--table-translations)
+
+;; 168 ((catch_list) (%empty))
+(puthash 168 (lambda(_args _terminals) nil) 
phps-mode-parser--table-translations)
+
+;; 169 ((catch_list) (catch_list T_CATCH "(" catch_name_list optional_variable 
")" "{" inner_statement_list "}"))
+(puthash
+ 169
+ (lambda(args terminals)
+   (let ((optional-variable (nth 4 args))
+         (optional-variable-start)
+         (optional-variable-end))
+     (when optional-variable
+       (setq optional-variable-start (car (cdr (nth 4 terminals))))
+       (setq optional-variable-end (cdr (cdr (nth 4 terminals))))
+       (push
+        (list
+         optional-variable
+         phps-mode-parser-sdt--bookkeeping-namespace
+         optional-variable-start
+         optional-variable-end)
+        phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack)
+       (push
+        (list
+         optional-variable
+         phps-mode-parser-sdt--bookkeeping-namespace
+         optional-variable-start
+         optional-variable-end)
+        phps-mode-parser-sdt--bookkeeping-symbol-stack))
+   `(
+     ast-type
+     catch-list
+     catch-name-list
+     ,(nth 3 args)
+     optional-variable
+     ,optional-variable
+     optional-variable-start
+     ,optional-variable-start
+     optional-variable-end
+     ,optional-variable-end
+     inner-statement-list
+     ,(nth 7 args))))
+ phps-mode-parser--table-translations)
+
+;; 170 ((catch_name_list) (class_name))
+(puthash
+ 170
+ (lambda(args _terminals)
+   `(
+     ast-type
+     catch-name-list
+     class-names
+     (,args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 171 ((catch_name_list) (catch_name_list "|" class_name))
+(puthash
+ 171
+ (lambda(args _terminals)
+   `(
+     ast-type
+     catch-name-list
+     class-names
+     ,(append (nth 0 args) (list (nth 2 args)))
+     ))
+ phps-mode-parser--table-translations)
+
+;; 172 ((optional_variable) (%empty))
+(puthash 172 (lambda(_args _terminals) nil) 
phps-mode-parser--table-translations)
+
+;; 173 ((optional_variable) (T_VARIABLE))
+(puthash 173 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 174 ((finally_statement) (%empty))
+(puthash 174 (lambda(_args _terminals) nil) 
phps-mode-parser--table-translations)
+
+;; 175 ((finally_statement) (T_FINALLY "{" inner_statement_list "}"))
+(puthash
+ 175
+ (lambda(args _terminals)
+   `(
+     ast-type
+     finally-statement
+     inner-statement-list
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 176 ((unset_variables) (unset_variable))
+(puthash
+ 176
+ (lambda(args _terminals)
+   `(
+     ast-type
+     unset-variables
+     variables
+     ,(list args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 177 ((unset_variables) (unset_variables "," unset_variable))
+(puthash
+ 177
+ (lambda(args _terminals)
+   `(
+     ast-type
+     unset-variables
+     variables
+     ,(append (nth 0 args) (nth 2 args))
+     ))
+ phps-mode-parser--table-translations)
+
+;; 178 ((unset_variable) (variable))
+(puthash 178 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 179 ((function_declaration_statement) (function returns_ref T_STRING 
backup_doc_comment "(" parameter_list ")" return_type backup_fn_flags "{" 
inner_statement_list "}" backup_fn_flags))
+(puthash
+ 179
+ (lambda(args terminals)
+   ;; (message "179-parameter_list-args: %S" (nth 5 args))
+   ;; (message "parameter_list-terminals: %S" (nth 5 terminals))
+
+   ;; Iterate optional parameters are declare them as new variable declarations
+   (when-let ((parameter-list (nth 5 args)))
+     (dolist (parameter parameter-list)
+       (let ((parameter-ast-type (plist-get parameter 'ast-type)))
+         (cond
+          ((equal parameter-ast-type 'attributed-parameter)
+           (let* ((attributed-parameter
+                  (plist-get
+                   parameter
+                   'parameter))
+                  (attributed-parameter-name
+                   (plist-get attributed-parameter 'ast-name))
+                  (symbol-name
+                   attributed-parameter-name)
+                  (symbol-scope
+                   phps-mode-parser-sdt--bookkeeping-namespace)
+                  (symbol-start
+                   (plist-get attributed-parameter 'ast-start))
+                  (symbol-end
+                   (plist-get attributed-parameter 'ast-end)))
+             (push
+              (list
+               symbol-name
+               symbol-scope
+               symbol-start
+               symbol-end)
+              phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack)
+             (push
+              (list
+               symbol-name
+               symbol-scope
+               symbol-start
+               symbol-end)
+              phps-mode-parser-sdt--bookkeeping-symbol-stack)))))))
+
+   ;; (message "before:")
+   ;; (message
+   ;;  "phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack: %S"
+   ;;  phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack)
+   ;; (message
+   ;;  "phps-mode-parser-sdt--bookkeeping-symbol-stack: %S"
+   ;;  phps-mode-parser-sdt--bookkeeping-symbol-stack)
+
+   ;; Go through stacks and modify symbol namespaces
+   ;; - add function scope but only for non-super-global variables
+   (let ((function-name (nth 2 args))
+         (function-start (car (cdr (nth 2 terminals))))
+         (function-end (car (cdr (nth 11 terminals)))))
+
+     ;; Add function to imenu stack
+     (if phps-mode-parser-sdt-symbol-imenu--stack
+         (push
+          (list (list 'function function-name function-start function-end))
+          phps-mode-parser-sdt-symbol-imenu--stack)
+       (setq
+        phps-mode-parser-sdt-symbol-imenu--stack
+        (list (list (list 'function function-name function-start 
function-end)))))
+
+     (when phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack
+       (dolist (
+                symbol-list
+                phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack)
+         (let ((symbol-name (car symbol-list)))
+           (unless (gethash
+                    symbol-name
+                    phps-mode-parser-sdt--bookkeeping--superglobal-variable-p)
+             (let ((symbol-scope (car (cdr symbol-list))))
+               (push
+                (list 'function function-name function-start function-end)
+                symbol-scope)
+               (setcar
+                (cdr symbol-list)
+                symbol-scope))))))
+     (when phps-mode-parser-sdt--bookkeeping-symbol-stack
+       (dolist (
+                symbol-list
+                phps-mode-parser-sdt--bookkeeping-symbol-stack)
+         (let ((symbol-name (car symbol-list)))
+           (unless (gethash
+                    symbol-name
+                    phps-mode-parser-sdt--bookkeeping--superglobal-variable-p)
+             (let ((symbol-scope (car (cdr symbol-list))))
+               (push
+                (list 'function function-name function-start function-end)
+                symbol-scope)
+               (setcar
+                (cdr symbol-list)
+                symbol-scope)))))))
+
+
+   ;; (message "after:")
+   ;; (message
+   ;;  "phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack: %S"
+   ;;  phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack)
+   ;; (message
+   ;;  "phps-mode-parser-sdt--bookkeeping-symbol-stack: %S"
+   ;;  phps-mode-parser-sdt--bookkeeping-symbol-stack)
+
+
+   `(
+     ast-type
+     function
+     ast-name
+     ,(nth 2 args)
+     ast-index
+     ,(car (cdr (nth 2 terminals)))
+     ast-start
+     ,(car (cdr (nth 9 terminals)))
+     ast-end
+     ,(car (cdr (nth 11 terminals)))
+     returns-reference-p
+     ,(not (equal (nth 1 args) nil))
+     parameter-list
+     ,(nth 5 args)
+     return-type
+     ,(nth 7 args)
+     inner-statement-list
+     ,(nth 10 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 180 ((is_reference) (%empty))
+(puthash 180 (lambda(_args _terminals) nil) 
phps-mode-parser--table-translations)
+
+;; 181 ((is_reference) (T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG))
+(puthash 181 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 182 ((is_variadic) (%empty))
+(puthash 182 (lambda(_args _terminals) nil) 
phps-mode-parser--table-translations)
+
+;; 183 ((is_variadic) (T_ELLIPSIS))
+(puthash 183 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 184 ((class_declaration_statement) (class_modifiers T_CLASS T_STRING 
extends_from implements_list backup_doc_comment "{" class_statement_list "}"))
+(puthash
+ 184
+ (lambda(args terminals)
+   ;; Go through stacks and modify symbol name-spaces
+   ;; but only for non-super-global variables.
+   ;; 
+   ;; Should place class scope first in scope
+   ;; unless a namespace exists, in that case it should be placed second in 
scope
+   (let ((class-name (nth 2 args))
+         (class-start (car (cdr (nth 2 terminals))))
+         (class-end (cdr (cdr (nth 8 terminals)))))
+
+     ;; Add class scope to all functions in class
+     (when phps-mode-parser-sdt-symbol-imenu--stack
+       (let ((imenu-stack-count
+              (length phps-mode-parser-sdt-symbol-imenu--stack))
+             (imenu-stack-index 0))
+         (while (< imenu-stack-index imenu-stack-count)
+           (let* ((items (nth imenu-stack-index 
phps-mode-parser-sdt-symbol-imenu--stack))
+                  (item-count (length items))
+                  (item-index 0))
+             (while (< item-index item-count)
+               (let* ((item (nth item-index items))
+                      (item-start (nth 2 item))
+                      (item-end (nth 3 item)))
+                 (when (and
+                        (>= item-start class-start)
+                        (<= item-end class-end))
+                   (push
+                    (list 'class class-name class-start class-end)
+                    (nth imenu-stack-index 
phps-mode-parser-sdt-symbol-imenu--stack))
+                   (setq item-index item-count)))
+               (setq item-index (1+ item-index))))
+           (setq imenu-stack-index (1+ imenu-stack-index)))))
+
+     ;; Add class to imenu stack
+     (if phps-mode-parser-sdt-symbol-imenu--stack
+         (push
+          (list (list 'class class-name class-start class-end))
+          phps-mode-parser-sdt-symbol-imenu--stack)
+       (setq
+        phps-mode-parser-sdt-symbol-imenu--stack
+        (list (list (list 'class class-name class-start class-end)))))
+
+     (when phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack
+       (dolist (
+                symbol-list
+                phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack)
+         (let ((symbol-name (car symbol-list)))
+           (unless (gethash
+                    symbol-name
+                    phps-mode-parser-sdt--bookkeeping--superglobal-variable-p)
+             (let ((symbol-scope (reverse (car (cdr symbol-list)))))
+               (if (equal (car (car symbol-scope)) 'namespace)
+                   (let ((namespace-name (nth 1 (car symbol-scope)))
+                         (namespace-start (nth 2 (car symbol-scope)))
+                         (namespace-end (nth 3 (car symbol-scope))))
+                     (setcar
+                      symbol-scope
+                      (list 'class class-name class-start class-end))
+                     (push
+                      (list 'namespace namespace-name namespace-start 
namespace-end)
+                      symbol-scope))
+                 (push
+                  (list 'class class-name class-start class-end)
+                  symbol-scope))
+               (setcar
+                (cdr symbol-list)
+                (reverse symbol-scope)))))))
+
+     (when phps-mode-parser-sdt--bookkeeping-symbol-stack
+       (dolist (
+                symbol-list
+                phps-mode-parser-sdt--bookkeeping-symbol-stack)
+         (let ((symbol-name (car symbol-list)))
+           (unless (gethash
+                    symbol-name
+                    phps-mode-parser-sdt--bookkeeping--superglobal-variable-p)
+             (let ((symbol-scope (reverse (car (cdr symbol-list)))))
+               (if (equal (car (car symbol-scope)) 'namespace)
+                   (let ((namespace-name (nth 1 (car symbol-scope)))
+                         (namespace-start (nth 2 (car symbol-scope)))
+                         (namespace-end (nth 3 (car symbol-scope))))
+                     (setcar
+                      symbol-scope
+                      (list 'class class-name class-start class-end))
+                     (push
+                      (list 'namespace namespace-name namespace-start 
namespace-end)
+                      symbol-scope))
+                 (push
+                  (list 'class class-name class-start class-end)
+                  symbol-scope))
+               (setcar
+                (cdr symbol-list)
+                (reverse symbol-scope))))))))
+
+   `(
+     ast-type
+     class
+     modifiers
+     ,(nth 0 args)
+     ast-name
+     ,(nth 2 args)
+     extends-from
+     ,(nth 3 args)
+     implements-list
+     ,(nth 4 args)
+     ast-index
+     ,(car (cdr (nth 2 terminals)))
+     ast-start
+     ,(car (cdr (nth 6 terminals)))
+     ast-end
+     ,(car (cdr (nth 8 terminals)))
+     class-statement-list
+     ,(nth 7 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 185 ((class_declaration_statement) (T_CLASS T_STRING extends_from 
implements_list backup_doc_comment "{" class_statement_list "}"))
+(puthash
+ 185
+ (lambda(args terminals)
+   ;; Go through stacks and modify symbol name-spaces
+   ;; but only for non-super-global variables.
+   ;; 
+   ;; Should place class scope first in scope
+   ;; unless a namespace exists, in that case it should be placed second in 
scope
+   (let ((class-name (nth 1 args))
+         (class-start (car (cdr (nth 1 terminals))))
+         (class-end (cdr (cdr (nth 7 terminals)))))
+
+     ;; Add class scope to all functions in class
+     (when phps-mode-parser-sdt-symbol-imenu--stack
+       (let ((imenu-stack-count
+              (length phps-mode-parser-sdt-symbol-imenu--stack))
+             (imenu-stack-index 0))
+         (while (< imenu-stack-index imenu-stack-count)
+           (let* ((items (nth imenu-stack-index 
phps-mode-parser-sdt-symbol-imenu--stack))
+                  (item-count (length items))
+                  (item-index 0))
+             (while (< item-index item-count)
+               (let* ((item (nth item-index items))
+                      (item-start (nth 2 item))
+                      (item-end (nth 3 item)))
+                 (when (and
+                        (>= item-start class-start)
+                        (<= item-end class-end))
+                   (push
+                    (list 'class class-name class-start class-end)
+                    (nth imenu-stack-index 
phps-mode-parser-sdt-symbol-imenu--stack))
+                   (setq item-index item-count)))
+               (setq item-index (1+ item-index))))
+           (setq imenu-stack-index (1+ imenu-stack-index)))))
+
+     ;; Add class to imenu stack
+     (if phps-mode-parser-sdt-symbol-imenu--stack
+         (push
+          (list (list 'class class-name class-start class-end))
+          phps-mode-parser-sdt-symbol-imenu--stack)
+       (setq
+        phps-mode-parser-sdt-symbol-imenu--stack
+        (list (list (list 'class class-name class-start class-end)))))
+
+     (when phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack
+       (dolist (
+                symbol-list
+                phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack)
+         (let ((symbol-name (car symbol-list)))
+           (unless (gethash
+                    symbol-name
+                    phps-mode-parser-sdt--bookkeeping--superglobal-variable-p)
+             (let ((symbol-scope (reverse (car (cdr symbol-list)))))
+               (if (equal (car (car symbol-scope)) 'namespace)
+                   (let ((namespace-name (nth 1 (car symbol-scope)))
+                         (namespace-start (nth 2 (car symbol-scope)))
+                         (namespace-end (nth 3 (car symbol-scope))))
+                     (setcar
+                      symbol-scope
+                      (list 'class class-name class-start class-end))
+                     (push
+                      (list 'namespace namespace-name namespace-start 
namespace-end)
+                      symbol-scope))
+                 (push
+                  (list 'class class-name class-start class-end)
+                  symbol-scope))
+               (setcar
+                (cdr symbol-list)
+                (reverse symbol-scope)))))))
+
+     (when phps-mode-parser-sdt--bookkeeping-symbol-stack
+       (dolist (
+                symbol-list
+                phps-mode-parser-sdt--bookkeeping-symbol-stack)
+         (let ((symbol-name (car symbol-list)))
+           (unless (gethash
+                    symbol-name
+                    phps-mode-parser-sdt--bookkeeping--superglobal-variable-p)
+             (let ((symbol-scope (reverse (car (cdr symbol-list)))))
+               (if (equal (car (car symbol-scope)) 'namespace)
+                   (let ((namespace-name (nth 1 (car symbol-scope)))
+                         (namespace-start (nth 2 (car symbol-scope)))
+                         (namespace-end (nth 3 (car symbol-scope))))
+                     (setcar
+                      symbol-scope
+                      (list 'class class-name class-start class-end))
+                     (push
+                      (list 'namespace namespace-name namespace-start 
namespace-end)
+                      symbol-scope))
+                 (push
+                  (list 'class class-name class-start class-end)
+                  symbol-scope))
+               (setcar
+                (cdr symbol-list)
+                (reverse symbol-scope))))))))
+
+   `(
+     ast-type
+     class
+     ast-name
+     ,(nth 1 args)
+     extends-from
+     ,(nth 2 args)
+     implements-list
+     ,(nth 3 args)
+     ast-index
+     ,(car (cdr (nth 1 terminals)))
+     ast-start
+     ,(car (cdr (nth 5 terminals)))
+     ast-end
+     ,(car (cdr (nth 7 terminals)))
+     class-statement-list
+     ,(nth 6 args)))
+ phps-mode-parser--table-translations)
+
+;; 186 ((class_modifiers) (class_modifier))
+(puthash 186 (lambda(args _terminals) `(,args)) 
phps-mode-parser--table-translations)
+
+;; 187 ((class_modifiers) (class_modifiers class_modifier))
+(puthash 187 (lambda(args _terminals) `(append ,(nth 0 args) (,(nth 1 args)))) 
phps-mode-parser--table-translations)
+
+;; 188 ((class_modifier) (T_ABSTRACT))
+(puthash 188 (lambda(_args _terminals) 'T_ABSTRACT) 
phps-mode-parser--table-translations)
+
+;; 189 ((class_modifier) (T_FINAL))
+(puthash 189 (lambda(_args _terminals) 'T_FINAL) 
phps-mode-parser--table-translations)
+
+;; 190 ((trait_declaration_statement) (T_TRAIT T_STRING backup_doc_comment "{" 
class_statement_list "}"))
+(puthash
+ 190
+ (lambda(args terminals)
+   ;; Go through stacks and modify symbol name-spaces
+   ;; but only for non-super-global variables.
+   ;; 
+   ;; Should place class scope first in scope
+   ;; unless a namespace exists, in that case it should be placed second in 
scope
+   (let ((class-name (nth 1 args))
+         (class-start (car (cdr (nth 1 terminals))))
+         (class-end (cdr (cdr (nth 5 terminals)))))
+
+     ;; Add class scope to all functions in class
+     (when phps-mode-parser-sdt-symbol-imenu--stack
+       (let ((imenu-stack-count
+              (length phps-mode-parser-sdt-symbol-imenu--stack))
+             (imenu-stack-index 0))
+         (while (< imenu-stack-index imenu-stack-count)
+           (let* ((items (nth imenu-stack-index 
phps-mode-parser-sdt-symbol-imenu--stack))
+                  (item-count (length items))
+                  (item-index 0))
+             (while (< item-index item-count)
+               (let* ((item (nth item-index items))
+                      (item-start (nth 2 item))
+                      (item-end (nth 3 item)))
+                 (when (and
+                        (>= item-start class-start)
+                        (<= item-end class-end))
+                   (push
+                    (list 'trait class-name class-start class-end)
+                    (nth imenu-stack-index 
phps-mode-parser-sdt-symbol-imenu--stack))
+                   (setq item-index item-count)))
+               (setq item-index (1+ item-index))))
+           (setq imenu-stack-index (1+ imenu-stack-index)))))
+
+     ;; Add class to imenu stack
+     (if phps-mode-parser-sdt-symbol-imenu--stack
+         (push
+          (list (list 'trait class-name class-start class-end))
+          phps-mode-parser-sdt-symbol-imenu--stack)
+       (setq
+        phps-mode-parser-sdt-symbol-imenu--stack
+        (list (list (list 'trait class-name class-start class-end)))))
+
+     (when phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack
+       (dolist (
+                symbol-list
+                phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack)
+         (let ((symbol-name (car symbol-list)))
+           (unless (gethash
+                    symbol-name
+                    phps-mode-parser-sdt--bookkeeping--superglobal-variable-p)
+             (let ((symbol-scope (reverse (car (cdr symbol-list)))))
+               (if (equal (car (car symbol-scope)) 'namespace)
+                   (let ((namespace-name (nth 1 (car symbol-scope)))
+                         (namespace-start (nth 2 (car symbol-scope)))
+                         (namespace-end (nth 3 (car symbol-scope))))
+                     (setcar
+                      symbol-scope
+                      (list 'trait class-name class-start class-end))
+                     (push
+                      (list 'namespace namespace-name namespace-start 
namespace-end)
+                      symbol-scope))
+                 (push
+                  (list 'trait class-name class-start class-end)
+                  symbol-scope))
+               (setq symbol-scope (reverse symbol-scope))
+               (setcar
+                (cdr symbol-list)
+                symbol-scope))))))
+
+     (when phps-mode-parser-sdt--bookkeeping-symbol-stack
+       (dolist (
+                symbol-list
+                phps-mode-parser-sdt--bookkeeping-symbol-stack)
+         (let ((symbol-name (car symbol-list)))
+           (unless (gethash
+                    symbol-name
+                    phps-mode-parser-sdt--bookkeeping--superglobal-variable-p)
+             (let ((symbol-scope (reverse (car (cdr symbol-list)))))
+               (if (equal (car (car symbol-scope)) 'namespace)
+                   (let ((namespace-name (nth 1 (car symbol-scope)))
+                         (namespace-start (nth 2 (car symbol-scope)))
+                         (namespace-end (nth 3 (car symbol-scope))))
+                     (setcar
+                      symbol-scope
+                      (list 'trait class-name class-start class-end))
+                     (push
+                      (list 'namespace namespace-name namespace-start 
namespace-end)
+                      symbol-scope))
+                 (push
+                  (list 'trait class-name class-start class-end)
+                  symbol-scope))
+               (setq symbol-scope (reverse symbol-scope))
+               (setcar
+                (cdr symbol-list)
+                symbol-scope)))))))
+
+   `(
+     ast-type
+     trait-declaration-statement
+     ast-name
+     ,(nth 1 args)
+     backup-doc-comment
+     ,(nth 2 args)
+     class-statement-list
+     ,(nth 4 args)))
+ phps-mode-parser--table-translations)
+
+;; 191 ((interface_declaration_statement) (T_INTERFACE T_STRING 
interface_extends_list backup_doc_comment "{" class_statement_list "}"))
+(puthash
+ 191
+ (lambda(args terminals)
+   ;; Go through stacks and modify symbol name-spaces
+   ;; but only for non-super-global variables.
+   ;; 
+   ;; Should place class scope first in scope
+   ;; unless a namespace exists, in that case it should be placed second in 
scope
+   (let ((class-name (nth 1 args))
+         (class-start (car (cdr (nth 1 terminals))))
+         (class-end (cdr (cdr (nth 6 terminals)))))
+
+     ;; Add class scope to all functions in class
+     (when phps-mode-parser-sdt-symbol-imenu--stack
+       (let ((imenu-stack-count
+              (length phps-mode-parser-sdt-symbol-imenu--stack))
+             (imenu-stack-index 0))
+         (while (< imenu-stack-index imenu-stack-count)
+           (let* ((items (nth imenu-stack-index 
phps-mode-parser-sdt-symbol-imenu--stack))
+                  (item-count (length items))
+                  (item-index 0))
+             (while (< item-index item-count)
+               (let* ((item (nth item-index items))
+                      (item-start (nth 2 item)))
+                 (when (and
+                        (>= item-start class-start)
+                        (<= item-start class-end))
+                   (push
+                    (list 'interface class-name class-start class-end)
+                    (nth imenu-stack-index 
phps-mode-parser-sdt-symbol-imenu--stack))
+                   (setq item-index item-count)))
+               (setq item-index (1+ item-index))))
+           (setq imenu-stack-index (1+ imenu-stack-index)))))
+
+     ;; Add class to imenu stack
+     (if phps-mode-parser-sdt-symbol-imenu--stack
+         (push
+          (list (list 'interface class-name class-start class-end))
+          phps-mode-parser-sdt-symbol-imenu--stack)
+       (setq
+        phps-mode-parser-sdt-symbol-imenu--stack
+        (list (list (list 'interface class-name class-start class-end)))))
+
+     (when phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack
+       (dolist (
+                symbol-list
+                phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack)
+         (let ((symbol-name (car symbol-list)))
+           (unless (gethash
+                    symbol-name
+                    phps-mode-parser-sdt--bookkeeping--superglobal-variable-p)
+             (let ((symbol-scope (reverse (car (cdr symbol-list)))))
+               (if (equal (car (car symbol-scope)) 'namespace)
+                   (let ((namespace-name (nth 1 (car symbol-scope)))
+                         (namespace-start (nth 2 (car symbol-scope)))
+                         (namespace-end (nth 3 (car symbol-scope))))
+                     (setcar
+                      symbol-scope
+                      (list 'interface class-name class-start class-end))
+                     (push
+                      (list 'namespace namespace-name namespace-start 
namespace-end)
+                      symbol-scope))
+                 (push
+                  (list 'interface class-name class-start class-end)
+                  symbol-scope))
+               (setq symbol-scope (reverse symbol-scope))
+               (setcar
+                (cdr symbol-list)
+                symbol-scope))))))
+
+     (when phps-mode-parser-sdt--bookkeeping-symbol-stack
+       (dolist (
+                symbol-list
+                phps-mode-parser-sdt--bookkeeping-symbol-stack)
+         (let ((symbol-name (car symbol-list)))
+           (unless (gethash
+                    symbol-name
+                    phps-mode-parser-sdt--bookkeeping--superglobal-variable-p)
+             (let ((symbol-scope (reverse (car (cdr symbol-list)))))
+               (if (equal (car (car symbol-scope)) 'namespace)
+                   (let ((namespace-name (nth 1 (car symbol-scope)))
+                         (namespace-start (nth 2 (car symbol-scope)))
+                         (namespace-end (nth 3 (car symbol-scope))))
+                     (setcar
+                      symbol-scope
+                      (list 'interface class-name class-start class-end))
+                     (push
+                      (list 'namespace namespace-name namespace-start 
namespace-end)
+                      symbol-scope))
+                 (push
+                  (list 'interface class-name class-start class-end)
+                  symbol-scope))
+               (setq symbol-scope (reverse symbol-scope))
+               (setcar
+                (cdr symbol-list)
+                symbol-scope)))))))
+
+   `(
+     ast-type
+     interface-declaration-statement
+     ast-name
+     ,(nth 1 args)
+     interface-extends-list
+     ,(nth 2 args)
+     ast-index
+     ,(car (cdr (nth 1 terminals)))
+     ast-start
+     ,(car (cdr (nth 4 terminals)))
+     ast-end
+     ,(car (cdr (nth 6 terminals)))
+     class-statement-list
+     ,(nth 5 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 192 ((enum_declaration_statement) (T_ENUM T_STRING enum_backing_type 
implements_list backup_doc_comment "{" class_statement_list "}"))
+(puthash
+ 192
+ (lambda(args terminals)
+   `(
+     ast-type
+     enum-declaration-statement
+     ast-name
+     ,(nth 1 args)
+     enum-backing-type
+     ,(nth 2 args)
+     implements-list
+     ,(nth 3 args)
+     ast-index
+     ,(car (cdr (nth 1 terminals)))
+     ast-start
+     ,(car (cdr (nth 5 terminals)))
+     ast-end
+     ,(car (cdr (nth 7 terminals)))
+     class-statement-list
+     ,(nth 6 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 193 ((enum_backing_type) (%empty))
+(puthash 193 (lambda(_args _terminals) nil) 
phps-mode-parser--table-translations)
+
+;; 194 ((enum_backing_type) (":" type_expr))
+(puthash 194 (lambda(args _terminals) (nth 1 args)) 
phps-mode-parser--table-translations)
+
+;; 195 ((enum_case) (T_CASE backup_doc_comment identifier enum_case_expr ";"))
+(puthash
+ 195
+ (lambda(args _terminals)
+   `(
+     ast-type
+     enum-case
+     backup-doc-comment
+     ,(nth 1 args)
+     identifier
+     ,(nth 2 args)
+     enum-case-expr
+     ,(nth 3 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 196 ((enum_case_expr) (%empty))
+(puthash 196 (lambda(_args _terminals) nil) 
phps-mode-parser--table-translations)
+
+;; 197 ((enum_case_expr) ("=" expr))
+(puthash
+ 197
+ (lambda(args _terminals)
+   `(
+     ast-type
+     enum-case-expr
+     expr
+     ,(nth 1 args)
+     )
+   )
+ phps-mode-parser--table-translations)
+
+;; 198 ((extends_from) (%empty))
+(puthash 198 (lambda(_args _terminals) nil) 
phps-mode-parser--table-translations)
+
+;; 199 ((extends_from) (T_EXTENDS class_name))
+(puthash
+ 199
+ (lambda(args _terminals)
+   `(
+     ast-type
+     extends-from
+     class-name
+     ,(nth 1 args)
+     )
+   )
+ phps-mode-parser--table-translations)
+
+;; 200 ((interface_extends_list) (%empty))
+(puthash 200 (lambda(_args _terminals) nil) 
phps-mode-parser--table-translations)
+
+;; 201 ((interface_extends_list) (T_EXTENDS class_name_list))
+(puthash
+ 201
+ (lambda(args _terminals)
+   `(
+     ast-type
+     interface-extends-list
+     class-name-list
+     ,(nth 1 args)
+     )
+   )
+ phps-mode-parser--table-translations)
+
+;; 202 ((implements_list) (%empty))
+(puthash 202 (lambda(_args _terminals) nil) 
phps-mode-parser--table-translations)
+
+;; 203 ((implements_list) (T_IMPLEMENTS class_name_list))
+(puthash
+ 203
+ (lambda(args _terminals)
+   `(
+     ast-type
+     implements-list
+     class-name-list
+     ,(nth 1 args)
+     )
+   )
+ phps-mode-parser--table-translations)
+
+;; 204 ((foreach_variable) (variable))
+(puthash
+ 204
+ (lambda(args terminals)
+   ;; Save variable declaration in bookkeeping buffer
+   (let ((variable-type (plist-get args 'ast-type)))
+     (cond
+      ((equal variable-type 'variable-callable-variable)
+       (let* ((callable-variable (plist-get args 'callable-variable))
+              (callable-variable-type (plist-get callable-variable 'ast-type)))
+         (cond
+          ((equal callable-variable-type 'callable-variable-simple-variable)
+           (let ((callable-variable-simple-variable
+                  (plist-get callable-variable 'simple-variable)))
+             (let ((callable-variable-simple-variable-type
+                    (plist-get
+                     callable-variable-simple-variable
+                     'ast-type)))
+               (cond
+                ((equal
+                  callable-variable-simple-variable-type
+                  'simple-variable-variable)
+                 (let* ((variable-name
+                         (plist-get
+                          callable-variable-simple-variable
+                          'variable))
+                        (symbol-name
+                         variable-name)
+                        (symbol-start
+                         (car (cdr terminals)))
+                        (symbol-end
+                         (cdr (cdr terminals)))
+                        (symbol-scope
+                         phps-mode-parser-sdt--bookkeeping-namespace))
+                   ;; (message "declared foreach variable from terminals: %S" 
terminals)
+                   (push
+                    (list
+                     symbol-name
+                     symbol-scope
+                     symbol-start
+                     symbol-end)
+                    
phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack))))))))))))
+
+   `(
+     ast-type
+     foreach-variable
+     variable
+     ,args))
+ phps-mode-parser--table-translations)
+
+;; 205 ((foreach_variable) (ampersand variable))
+(puthash
+ 205
+ (lambda(args terminals)
+   ;; Save variable declaration in bookkeeping buffer
+   (let* ((variable (nth 1 args))
+          (variable-type (plist-get variable 'ast-type)))
+     (cond
+      ((equal variable-type 'variable-callable-variable)
+       (let* ((callable-variable (plist-get variable 'callable-variable))
+              (callable-variable-type (plist-get callable-variable 'ast-type)))
+         (cond
+          ((equal callable-variable-type 'callable-variable-simple-variable)
+           (let ((callable-variable-simple-variable
+                  (plist-get callable-variable 'simple-variable)))
+             (let ((callable-variable-simple-variable-type
+                    (plist-get
+                     callable-variable-simple-variable
+                     'ast-type)))
+               (cond
+                ((equal
+                  callable-variable-simple-variable-type
+                  'simple-variable-variable)
+                 (let* ((variable-name
+                         (plist-get
+                          callable-variable-simple-variable
+                          'variable))
+                        (symbol-name
+                         variable-name)
+                        (symbol-start
+                         (car (cdr (nth 1 terminals))))
+                        (symbol-end
+                         (cdr (cdr (nth 1 terminals))))
+                        (symbol-scope
+                         phps-mode-parser-sdt--bookkeeping-namespace))
+                   ;; (message "declared foreach variable from terminals: %S" 
(nth 1 terminals))
+                   (push
+                    (list
+                     symbol-name
+                     symbol-scope
+                     symbol-start
+                     symbol-end)
+                    
phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack))))))))))))
+
+   `(
+     ast-type
+     foreach-referenced-variable
+     variable
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 206 ((foreach_variable) (T_LIST "(" array_pair_list ")"))
+(puthash
+ 206
+ (lambda(args _terminals)
+   ;; TODO Declare variable here
+
+   `(
+     ast-type
+     foreach-list-variable
+     array-pair-list
+     ,(nth 2 args)))
+ phps-mode-parser--table-translations)
+
+;; 207 ((foreach_variable) ("[" array_pair_list "]"))
+(puthash
+ 207
+ (lambda(args _terminals)
+   ;; TODO Declare variable here
+
+   `(
+     ast-type
+     foreach-variable
+     array-pair-list
+     ,(nth 1 args)))
+ phps-mode-parser--table-translations)
+
+;; 208 ((for_statement) (statement))
+(puthash
+ 208
+ (lambda(args _terminals)
+   `(
+     ast-type
+     for-statement
+     statement
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 209 ((for_statement) (":" inner_statement_list T_ENDFOR ";"))
+(puthash
+ 209
+ (lambda(args _terminals)
+   `(
+     ast-type
+     for-statement
+     inner-statement-list
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 210 ((foreach_statement) (statement))
+(puthash
+ 210
+ (lambda(args _terminals)
+   `(
+     ast-type
+     foreach-statement
+     statement
+     ,args))
+ phps-mode-parser--table-translations)
+
+;; 211 ((foreach_statement) (":" inner_statement_list T_ENDFOREACH ";"))
+(puthash
+ 211
+ (lambda(args _terminals)
+   `(
+     ast-type
+     foreach-statement
+     inner-statement-list
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 212 ((declare_statement) (statement))
+(puthash
+ 212
+ (lambda(args _terminals)
+   `(
+     ast-type
+     declare-statement
+     statement
+     ,args
+     ))
+ phps-mode-parser--table-translations)
+
+;; 213 ((declare_statement) (":" inner_statement_list T_ENDDECLARE ";"))
+(puthash
+ 213
+ (lambda(args _terminals)
+   `(
+     ast-type
+     declare-statement
+     inner-statement-list
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 214 ((switch_case_list) ("{" case_list "}"))
+(puthash 214 (lambda(args _terminals) (nth 1 args)) 
phps-mode-parser--table-translations)
+
+;; 215 ((switch_case_list) ("{" ";" case_list "}"))
+(puthash 214 (lambda(args _terminals) (nth 2 args)) 
phps-mode-parser--table-translations)
+
+;; 216 ((switch_case_list) (":" case_list T_ENDSWITCH ";"))
+(puthash 214 (lambda(args _terminals) (nth 1 args)) 
phps-mode-parser--table-translations)
+
+;; 217 ((switch_case_list) (":" ";" case_list T_ENDSWITCH ";"))
+(puthash 217 (lambda(args _terminals) (nth 2 args)) 
phps-mode-parser--table-translations)
+
+;; 218 ((case_list) (%empty))
+(puthash 218 (lambda(_args _terminals) nil) 
phps-mode-parser--table-translations)
+
+;; 219 ((case_list) (case_list T_CASE expr case_separator 
inner_statement_list))
+(puthash
+ 219
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-case-list
+     expr
+     ,(nth 2 args)
+     inner-statement-list
+     ,(nth 4 args)))
+ phps-mode-parser--table-translations)
+
+;; 220 ((case_list) (case_list T_DEFAULT case_separator inner_statement_list))
+(puthash
+ 220
+ (lambda(args _terminals)
+   `(
+     ast-type
+     default-case-list
+     inner-statement-list
+     ,(nth 3 args)))
+ phps-mode-parser--table-translations)
+
+;; 221 ((case_separator) (":"))
+(puthash 221 (lambda(_args _terminals) nil) 
phps-mode-parser--table-translations)
+
+;; 222 ((case_separator) (":"))
+(puthash 222 (lambda(_args _terminals) nil) 
phps-mode-parser--table-translations)
+
+;; 223 ((match) (T_MATCH "(" expr ")" "{" match_arm_list "}"))
+(puthash
+ 223
+ (lambda(args _terminals)
+   `(
+     ast-type
+     match
+     expr
+     ,(nth 2 args)
+     match-arm-list
+     ,(nth 5 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 224 ((match_arm_list) (%empty))
+(puthash 224 (lambda(_args _terminals) nil) 
phps-mode-parser--table-translations)
+
+;; 225 ((match_arm_list) (non_empty_match_arm_list possible_comma))
+(puthash 225 (lambda(args _terminals) (nth 0 args)) 
phps-mode-parser--table-translations)
+
+;; 226 ((non_empty_match_arm_list) (match_arm))
+(puthash 226 (lambda(args _terminals) (list args)) 
phps-mode-parser--table-translations)
+
+;; 227 ((non_empty_match_arm_list) (non_empty_match_arm_list "," match_arm))
+(puthash
+ 227
+ (lambda(args _terminals)
+   (append (nth 0 args) (list (nth 2 args))))
+ phps-mode-parser--table-translations)
+
+;; 228 ((match_arm) (match_arm_cond_list possible_comma T_DOUBLE_ARROW expr))
+(puthash
+ 228
+ (lambda(args _terminals)
+   `(
+     ast-type
+     cond-match-arm
+     match-arm-cond-list
+     ,(nth 0 args)
+     expr
+     ,(nth 3 args)))
+ phps-mode-parser--table-translations)
+
+;; 229 ((match_arm) (T_DEFAULT possible_comma T_DOUBLE_ARROW expr))
+(puthash
+ 229
+ (lambda(args _terminals)
+   `(
+     ast-type
+     default-match-arm
+     expr
+     ,(nth 3 args)))
+ phps-mode-parser--table-translations)
+
+;; 230 ((match_arm_cond_list) (expr))
+(puthash 230 (lambda(args _terminals) (list args)) 
phps-mode-parser--table-translations)
+
+;; 231 ((match_arm_cond_list) (match_arm_cond_list "," expr))
+(puthash 231 (lambda(args _terminals) (append (nth 0 args) (list (nth 2 
args)))) phps-mode-parser--table-translations)
+
+;; 232 ((while_statement) (statement))
+(puthash 232 (lambda(args _terminals) (list args)) 
phps-mode-parser--table-translations)
+
+;; 233 ((while_statement) (":" inner_statement_list T_ENDWHILE ";"))
+(puthash 233 (lambda(args _terminals) (nth 1 args)) 
phps-mode-parser--table-translations)
+
+;; 234 ((if_stmt_without_else) (T_IF "(" expr ")" statement))
+(puthash
+ 234
+ (lambda(args _terminals)
+   `(
+     ast-type
+     if-stmt-without-else
+     if-condition
+     ,(nth 2 args)
+     statement
+     ,(nth 4 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 235 ((if_stmt_without_else) (if_stmt_without_else T_ELSEIF "(" expr ")" 
statement))
+(puthash
+ 235
+ (lambda(args _terminals)
+   `(
+     ast-type
+     if-elseif-stmt-without-else
+     if-stmt-without-else
+     ,(nth 0 args)
+     elseif-condition
+     ,(nth 3 args)
+     statement
+     ,(nth 5 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 236 ((if_stmt) (if_stmt_without_else))
+(puthash 236 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 237 ((if_stmt) (if_stmt_without_else T_ELSE statement))
+(puthash
+ 237
+ (lambda(args _terminals)
+   `(
+     ast-type
+     if-else-stmt
+     if-stmt-without-else
+     ,(nth 0 args)
+     else-statement
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 238 ((alt_if_stmt_without_else) (T_IF "(" expr ")" ":" 
inner_statement_list))
+(puthash
+ 238
+ (lambda(args _terminals)
+   `(
+     ast-type
+     alt-if-stmt-without-else
+     if-condition
+     ,(nth 2 args)
+     inner-statement-list
+     ,(nth 5 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 239 ((alt_if_stmt_without_else) (alt_if_stmt_without_else T_ELSEIF "(" expr 
")" ":" inner_statement_list))
+(puthash
+ 239
+ (lambda(args _terminals)
+   `(
+     ast-type
+     alt-if-stmt-without-else-elseif
+     alt-if-stmt-without-else
+     ,(nth 2 args)
+     elseif-condition
+     ,(nth 3 args)
+     inner-statement-list
+     ,(nth 6 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 240 ((alt_if_stmt) (alt_if_stmt_without_else T_ENDIF ";"))
+(puthash 240 (lambda(args _terminals) (nth 0 args)) 
phps-mode-parser--table-translations)
+
+;; 241 ((alt_if_stmt) (alt_if_stmt_without_else T_ELSE ":" 
inner_statement_list T_ENDIF ";"))
+(puthash
+ 241
+ (lambda(args _terminals)
+   `(
+     ast-type
+     alt-if-stmt-else
+     alt-if-stmt-without-else
+     ,(nth 0 args)
+     inner-statement-list
+     ,(nth 3 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 242 ((parameter_list) (non_empty_parameter_list possible_comma))
+(puthash 242 (lambda(args _terminals) (nth 0 args)) 
phps-mode-parser--table-translations)
+
+;; 243 ((parameter_list) (%empty))
+(puthash 243 (lambda(_args _terminals) nil) 
phps-mode-parser--table-translations)
+
+;; 244 ((non_empty_parameter_list) (attributed_parameter))
+(puthash 244 (lambda(args _terminals) (list args)) 
phps-mode-parser--table-translations)
+
+;; 245 ((non_empty_parameter_list) (non_empty_parameter_list "," 
attributed_parameter))
+(puthash 245 (lambda(args _terminals) (append (nth 0 args) (list (nth 2 
args)))) phps-mode-parser--table-translations)
+
+;; 246 ((attributed_parameter) (attributes parameter))
+(puthash
+ 246
+ (lambda(args _terminals)
+   `(
+     ast-type
+     attributed-parameter
+     attributes
+     ,(nth 0 args)
+     parameter
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 247 ((attributed_parameter) (parameter))
+(puthash
+ 247
+ (lambda(args _terminals)
+   `(
+     ast-type
+     attributed-parameter
+     parameter
+     ,args
+     ))
+ phps-mode-parser--table-translations)
+
+;; 248 ((optional_property_modifiers) (%empty))
+(puthash 248 (lambda(_args _terminals) nil) 
phps-mode-parser--table-translations)
+
+;; 249 ((optional_property_modifiers) (optional_property_modifiers 
property_modifier))
+(puthash 249 (lambda(args _terminals) (append (nth 0 args) (list (nth 1 
args)))) phps-mode-parser--table-translations)
+
+;; 250 ((property_modifier) (T_PUBLIC))
+(puthash 250 (lambda(_args _terminals) 'T_PUBLIC) 
phps-mode-parser--table-translations)
+
+;; 251 ((property_modifier) (T_PROTECTED))
+(puthash 251 (lambda(_args _terminals) 'T_PROTECTED) 
phps-mode-parser--table-translations)
+
+;; 252 ((property_modifier) (T_PROTECTED))
+(puthash 252 (lambda(_args _terminals) 'T_PRIVATE) 
phps-mode-parser--table-translations)
+
+;; 253 ((property_modifier) (T_PROTECTED))
+(puthash 253 (lambda(_args _terminals) 'T_PROTECTED) 
phps-mode-parser--table-translations)
+
+;; 254 ((parameter) (optional_property_modifiers optional_type_without_static 
is_reference is_variadic T_VARIABLE backup_doc_comment))
+(puthash
+ 254
+ (lambda(args terminals)
+   `(
+     ast-type
+     parameter
+     visibility
+     ,(nth 0 args)
+     type
+     ,(nth 1 args)
+     is-reference
+     ,(if (nth 2 args) t nil)
+     is-variadic
+     ,(if (nth 3 args) t nil)
+     ast-name
+     ,(nth 4 args)
+     ast-start
+     ,(car (cdr (nth 4 terminals)))
+     ast-end
+     ,(cdr (cdr (nth 4 terminals)))
+     ))
+ phps-mode-parser--table-translations)
+
+;; 255 ((parameter) (optional_property_modifiers optional_type_without_static 
is_reference is_variadic T_VARIABLE backup_doc_comment "=" expr))
+(puthash
+ 255
+ (lambda(args terminals)
+   `(
+     ast-type
+     parameter-with-default-value
+     visibility
+     ,(nth 0 args)
+     type
+     ,(nth 1 args)
+     is-reference
+     ,(if (nth 2 args) t nil)
+     is-variadic
+     ,(if (nth 3 args) t nil)
+     ast-name
+     ,(nth 4 args)
+     ast-start
+     ,(car (cdr (nth 4 terminals)))
+     ast-end
+     ,(cdr (cdr (nth 4 terminals)))
+     backup-doc-comment
+     ,(nth 5 args)
+     default-value
+     ,(nth 7 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 256 ((optional_type_without_static) (%empty))
+(puthash 256 (lambda(_args _terminals) nil) 
phps-mode-parser--table-translations)
+
+;; 257 ((optional_type_without_static) (type_expr_without_static))
+(puthash 257 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 258 ((type_expr) (type))
+(puthash
+ 258
+ (lambda(args _terminals)
+   `(
+     ast-type
+     plain-type
+     type
+     ,args
+     ))
+ phps-mode-parser--table-translations)
+
+;; 259 ((type_expr) ("?" type))
+(puthash
+ 259
+ (lambda(args _terminals)
+   `(
+     ast-type
+     nullable-type
+     type
+     ,args
+     ))
+ phps-mode-parser--table-translations)
+
+;; 260 ((type_expr) (union_type))
+(puthash
+ 260
+ (lambda(args _terminals)
+   `(
+     ast-type
+     union-type
+     type
+     ,args
+     ))
+ phps-mode-parser--table-translations)
+
+;; 261 ((type_expr) (intersection_type))
+(puthash
+ 261
+ (lambda(args _terminals)
+   `(
+     ast-type
+     intersection-type
+     type
+     ,args
+     ))
+ phps-mode-parser--table-translations)
+
+;; 262 ((type) (type_without_static))
+(puthash 262 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 263 ((type) (T_STATIC))
+(puthash 263 (lambda(_args _terminals) 'T_STATIC) 
phps-mode-parser--table-translations)
+
+;; 264 ((union_type) (type "|" type))
+(puthash 264 (lambda(args _terminals) (list (nth 0 args) (nth 2 args))) 
phps-mode-parser--table-translations)
+
+;; 265 ((union_type) (union_type "|" type))
+(puthash 265 (lambda(args _terminals) (append (nth 0 args) (list (nth 2 
args)))) phps-mode-parser--table-translations)
+
+;; 266 ((intersection_type) (type T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG 
type))
+(puthash 266 (lambda(args _terminals) (list (nth 0 args) (nth 2 args))) 
phps-mode-parser--table-translations)
+
+;; 267 ((intersection_type) (intersection_type 
T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type))
+(puthash 267 (lambda(args _terminals) (append (nth 0 args) (list (nth 1 
args)))) phps-mode-parser--table-translations)
+
+;; 268 ((type_expr_without_static) (type_without_static))
+(puthash 268 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 269 ((type_expr_without_static) ("?" type_without_static))
+(puthash 269 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 270 ((type_expr_without_static) (union_type_without_static))
+(puthash 270 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 271 ((type_expr_without_static) (intersection_type_without_static))
+(puthash 271 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 272 ((type_without_static) (T_ARRAY))
+(puthash 272 (lambda(_args _terminals) 'T_ARRAY) 
phps-mode-parser--table-translations)
+
+;; 273 ((type_without_static) (T_CALLABLE))
+(puthash 273 (lambda(_args _terminals) 'T_CALLABLE) 
phps-mode-parser--table-translations)
+
+;; 274 ((type_without_static) (name))
+(puthash 273 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 275 ((union_type_without_static) (type_without_static "|" 
type_without_static))
+(puthash 275 (lambda(args _terminals) (list (nth 0 args) (nth 2 args))) 
phps-mode-parser--table-translations)
+
+;; 276 ((union_type_without_static) (union_type_without_static "|" 
type_without_static))
+(puthash 276 (lambda(args _terminals) (append (nth 0 args) (list (nth 2 
args)))) phps-mode-parser--table-translations)
+
+;; 277 ((intersection_type_without_static) (type_without_static 
T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type_without_static))
+(puthash 277 (lambda(args _terminals) (list (nth 0 args) (nth 2 args))) 
phps-mode-parser--table-translations)
+
+;; 278 ((intersection_type_without_static) (intersection_type_without_static 
T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG type_without_static))
+(puthash 278 (lambda(args _terminals) (append (nth 0 args) (list (nth 2 
args)))) phps-mode-parser--table-translations)
+
+;; 279 ((return_type) (%empty))
+(puthash 279 (lambda(_args _terminals) nil) 
phps-mode-parser--table-translations)
+
+;; 280 ((return_type) (":" type_expr))
+(puthash 280 (lambda(args _terminals) (nth 1 args)) 
phps-mode-parser--table-translations)
+
+;; 281 ((argument_list) ("(" ")"))
+(puthash 281 (lambda(_args _terminals) nil) 
phps-mode-parser--table-translations)
+
+;; 282 ((argument_list) ("(" non_empty_argument_list possible_comma ")"))
+(puthash 282 (lambda(args _terminals) (nth 1 args)) 
phps-mode-parser--table-translations)
+
+;; 283 ((argument_list) ("(" T_ELLIPSIS ")"))
+(puthash 283 (lambda(_args _terminals) 'T_ELLIPSIS) 
phps-mode-parser--table-translations)
+
+;; 284 ((non_empty_argument_list) (argument))
+(puthash 284 (lambda(args _terminals) (list (nth 0 args))) 
phps-mode-parser--table-translations)
+
+;; 285 ((non_empty_argument_list) (non_empty_argument_list "," argument))
+(puthash 285 (lambda(args _terminals) (append (nth 0 args) (list (nth 2 
args)))) phps-mode-parser--table-translations)
+
+;; 286 ((argument) (expr))
+(puthash
+ 286
+ (lambda(args _terminals)
+   `(
+     ast-type
+     argument
+     type
+     nil
+     value
+     ,args
+     )
+   )
+ phps-mode-parser--table-translations)
+
+;; 287 ((argument) (identifier ":" expr))
+(puthash
+ 287
+ (lambda(args _terminals)
+   `(
+     ast-type
+     argument
+     type
+     ,(nth 0 args)
+     value
+     ,(nth 2 args)
+     )
+   )
+ phps-mode-parser--table-translations)
+
+;; 288 ((argument) (T_ELLIPSIS expr))
+(puthash
+ 288
+ (lambda(args _terminals)
+   `(
+     ast-type
+     ellipsis-argument
+     value
+     ,(nth 2 args)
+     )
+   )
+ phps-mode-parser--table-translations)
+
+;; 289 ((global_var_list) (global_var_list "," global_var))
+(puthash 289 (lambda(args _terminals) (append (nth 0 args) (list (nth 2 
args)))) phps-mode-parser--table-translations)
+
+;; 290 ((global_var_list) (global_var))
+(puthash 290 (lambda(args _terminals) (list args)) 
phps-mode-parser--table-translations)
+
+;; 291 ((global_var) (simple_variable))
+(puthash 291 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 292 ((static_var_list) (static_var_list "," static_var))
+(puthash 292 (lambda(args _terminals) (append (nth 0 args) (list (nth 2 
args)))) phps-mode-parser--table-translations)
+
+;; 293 ((static_var_list) (static_var))
+(puthash 293 (lambda(args _terminals) (list args)) 
phps-mode-parser--table-translations)
+
+;; 294 ((static_var) (T_VARIABLE))
+(puthash
+ 294
+ (lambda(args terminals)
+   `(
+     ast-type
+     variable
+     ast-name
+     ,args
+     ast-index
+     ,(car (cdr terminals))
+     ast-start
+     ,(car (cdr terminals))
+     ast-end
+     ,(cdr (cdr terminals))))
+ phps-mode-parser--table-translations)
+
+;; 295 ((static_var) (T_VARIABLE "=" expr))
+(puthash
+ 295
+ (lambda(args terminals)
+   ;; TODO Should bookkeep here
+   `(
+     ast-type
+     variable
+     ast-name
+     ,(nth 0 args)
+     expr
+     ,(nth 2 args)
+     ast-index
+     ,(car (cdr (nth 0 terminals)))
+     ast-start
+     ,(car (cdr (nth 0 terminals)))
+     ast-end
+     ,(cdr (cdr (nth 0 terminals)))))
+ phps-mode-parser--table-translations)
+
+;; 296 ((class_statement_list) (class_statement_list class_statement))
+(puthash
+ 296
+ (lambda(args _terminals)
+   (if (car args)
+       (append (car args) (cdr args))
+     (cdr args)))
+ phps-mode-parser--table-translations)
+
+;; 297 ((class_statement_list) (%empty))
+(puthash 297 (lambda(_args _terminals) nil) 
phps-mode-parser--table-translations)
+
+;; 298 ((attributed_class_statement) (variable_modifiers 
optional_type_without_static property_list ";"))
+(puthash
+ 298
+ (lambda(args terminals)
+   `(
+     ast-type
+     property
+     modifiers
+     ,(nth 0 args)
+     type
+     ,(nth 1 args)
+     subject
+     ,(nth 2 args)
+     ast-start
+     ,(car (cdr (car (nth 2 terminals))))
+     ast-end
+     ,(cdr (cdr (car (nth 2 terminals))))
+     ))
+ phps-mode-parser--table-translations)
+
+;; 299 ((attributed_class_statement) (method_modifiers T_CONST 
class_const_list ";"))
+(puthash
+ 299
+ (lambda(args terminals)
+   ;; TODO Bookkeep class constants here
+   `(
+     ast-type
+     constant
+     modifiers
+     ,(nth 0 args)
+     subject
+     ,(nth 2 args)
+     ast-start
+     ,(car (cdr (car (nth 2 terminals))))
+     ast-end
+     ,(cdr (cdr (car (nth 2 terminals))))))
+ phps-mode-parser--table-translations)
+
+;; 300 ((attributed_class_statement) (method_modifiers function returns_ref 
identifier backup_doc_comment "(" parameter_list ")" return_type 
backup_fn_flags method_body backup_fn_flags))
+(puthash
+ 300
+ (lambda(args terminals)
+   `(
+     ast-type
+     method
+     modifiers
+     ,(nth 0 args)
+     returns-reference-p
+     ,(not (equal (nth 2 args) nil))
+     ast-name
+     ,(nth 3 args)
+     parameter-list
+     ,(nth 6 args)
+     return-type
+     ,(nth 8 args)
+     method-body
+     ,(if (nth 10 args)
+          (nth 10 args)
+        nil)
+     ast-index
+     ,(car (cdr (nth 3 terminals)))
+     ast-start
+     ,(if (listp (car (nth 10 terminals)))
+          (car (cdr (car (nth 10 terminals))))
+        nil)
+     ast-end
+     ,(if (listp (car (nth 10 terminals)))
+          (cdr (cdr (car (cdr (cdr (nth 10 terminals))))))
+        nil)
+     nil))
+ phps-mode-parser--table-translations)
+
+;; 301 ((attributed_class_statement) (enum_case))
+(puthash
+ 301
+ (lambda(args _terminals)
+   `(
+     ast-type
+     class-enum
+     enum-case
+     ,args
+     )
+   )
+ phps-mode-parser--table-translations)
+
+;; 302 ((class_statement) (attributed_class_statement))
+(puthash
+ 302
+ (lambda(args _terminals)
+   (let* ((attributed-class-statement
+           args)
+          (attributed-class-statement-type
+           (plist-get attributed-class-statement 'ast-type)))
+     (cond
+
+      ;; Property
+      ((equal attributed-class-statement-type 'property)
+       (let ((property-list
+              (plist-get attributed-class-statement 'subject))
+             (is-static))
+         (when-let (property-modifiers
+                    (plist-get attributed-class-statement 'modifiers))
+           (dolist (modifier property-modifiers)
+             (when (equal modifier 'static)
+               (setq is-static t))))
+         (dolist (property property-list)
+           (let ((property-type
+                  (plist-get property 'ast-type)))
+             (cond
+              ((or
+                (equal property-type 'property-variable)
+                (equal property-type 'property-assigned-variable))
+               (let ((symbol-name
+                      (plist-get property 'variable))
+                     (symbol-start
+                      (plist-get property 'ast-start))
+                     (symbol-end
+                      (plist-get property 'ast-end))
+                     (symbol-scope
+                      phps-mode-parser-sdt--bookkeeping-namespace))
+                 (when is-static
+                   (push (list 'static) symbol-scope))
+                 (push
+                  (list
+                   symbol-name
+                   symbol-scope
+                   symbol-start
+                   symbol-end)
+                  phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack)
+                 (push
+                  (list
+                   symbol-name
+                   symbol-scope
+                   symbol-start
+                   symbol-end)
+                  phps-mode-parser-sdt--bookkeeping-symbol-stack))))))))
+
+      ;; Method Declaration
+      ((equal attributed-class-statement-type 'method)
+       ;; Go through stacks and modify symbol namespaces
+       ;; - add function scope but only for:
+       ;;     - non-super-global variables
+       ;;     - symbols defined inside function limits
+       (let* ((function-name
+              (plist-get
+               attributed-class-statement
+               'ast-name))
+              (function-name-downcased
+               (downcase function-name))
+             (function-start
+              (plist-get
+               attributed-class-statement
+               'ast-start))
+             (function-index
+              (plist-get
+               attributed-class-statement
+               'ast-index))
+             (function-end
+              (plist-get
+               attributed-class-statement
+               'ast-end))
+             (function-parameter-list
+              (plist-get
+               attributed-class-statement
+               'parameter-list))
+             (is-static-p)
+             (is-contructor-p
+              (string=
+               function-name-downcased
+               "__construct")))
+
+         ;; Is static method?
+         (when-let (method-modifiers
+                    (plist-get
+                     attributed-class-statement
+                     'modifiers))
+           (dolist (method-modifier method-modifiers)
+             (when (equal method-modifier 'static)
+               (setq is-static-p t))))
+
+         ;; Add function to imenu stack
+         (cond
+          ((and function-start function-end)
+           (if phps-mode-parser-sdt-symbol-imenu--stack
+               (push
+                (list (list 'function function-name function-start 
function-end))
+                phps-mode-parser-sdt-symbol-imenu--stack)
+             (setq
+              phps-mode-parser-sdt-symbol-imenu--stack
+              (list (list (list 'function function-name function-start 
function-end))))))
+          (function-index
+           (if phps-mode-parser-sdt-symbol-imenu--stack
+               (push
+                (list (list 'function function-name function-index))
+                phps-mode-parser-sdt-symbol-imenu--stack)
+             (setq
+              phps-mode-parser-sdt-symbol-imenu--stack
+              (list (list (list 'function function-name function-index)))))))
+
+         (when (and function-start function-end)
+
+           ;; Add $this symbol in scope unless method is static
+           (unless is-static-p
+             (push
+              (list
+               "$this"
+               phps-mode-parser-sdt--bookkeeping-namespace
+               (plist-get attributed-class-statement 'ast-start)
+               (plist-get attributed-class-statement 'ast-end))
+              phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack))
+
+           ;; Add function scope to symbol assignments
+           (when phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack
+             (dolist (
+                      symbol-list
+                      
phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack)
+               (let ((symbol-name (car symbol-list))
+                     (symbol-start (nth 2 symbol-list)))
+                 (unless (or
+                          (gethash
+                           symbol-name
+                           
phps-mode-parser-sdt--bookkeeping--superglobal-variable-p)
+                          (< symbol-start function-start)
+                          (> symbol-start function-end))
+                   (let ((symbol-scope (car (cdr symbol-list))))
+                     (push
+                      (list 'function function-name function-start 
function-end)
+                      symbol-scope)
+                     (setcar
+                      (cdr symbol-list)
+                      symbol-scope))))))
+
+           ;; Add function scope to symbol reads
+           (when phps-mode-parser-sdt--bookkeeping-symbol-stack
+             (dolist (
+                      symbol-list
+                      phps-mode-parser-sdt--bookkeeping-symbol-stack)
+               (let ((symbol-name (nth 0 symbol-list))
+                     (symbol-start (nth 2 symbol-list)))
+                 (unless (or
+                          (gethash
+                           symbol-name
+                           
phps-mode-parser-sdt--bookkeeping--superglobal-variable-p)
+                          (< symbol-start function-start)
+                          (> symbol-start function-end))
+                   (let ((symbol-scope (car (cdr symbol-list))))
+                     (push
+                      (list 'function function-name function-start 
function-end)
+                      symbol-scope)
+                     (setcar
+                      (cdr symbol-list)
+                      symbol-scope)))))))
+
+         ;; Create symbol assignments out of method parameters
+         (let ((symbol-scope
+                phps-mode-parser-sdt--bookkeeping-namespace))
+           (push
+            (list 'function function-name function-start function-end)
+            symbol-scope)
+           (dolist (parameter function-parameter-list)
+             (let ((parameter-ast-type
+                    (plist-get parameter 'ast-type)))
+               (cond
+                ((equal parameter-ast-type 'attributed-parameter)
+                 (let* ((attributed-parameter
+                         (plist-get
+                          parameter
+                          'parameter))
+                        (attributed-parameter-name
+                         (plist-get attributed-parameter 'ast-name))
+                        (attributed-parameter-visibility
+                         (plist-get attributed-parameter 'visibility))
+                        (symbol-name
+                         attributed-parameter-name)
+                        (symbol-start
+                         (plist-get attributed-parameter 'ast-start))
+                        (symbol-end
+                         (plist-get attributed-parameter 'ast-end)))
+
+                   (when (and
+                          is-contructor-p
+                          attributed-parameter-visibility)
+                     ;; Declare class properties here
+                     (push
+                      (list
+                       symbol-name
+                       phps-mode-parser-sdt--bookkeeping-namespace
+                       symbol-start
+                       symbol-end)
+                      
phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack))
+
+                   (push
+                    (list
+                     symbol-name
+                     symbol-scope
+                     symbol-start
+                     symbol-end)
+                    phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack)
+                   (push
+                    (list
+                     symbol-name
+                     symbol-scope
+                     symbol-start
+                     symbol-end)
+                    phps-mode-parser-sdt--bookkeeping-symbol-stack)))))))))))
+
+   `(
+     ast-type
+     class-statement
+     attributed-class-statement
+     ,args))
+ phps-mode-parser--table-translations)
+
+;; 303 ((class_statement) (attributes attributed_class_statement))
+(puthash
+ 303
+ (lambda(args _terminals)
+   (let* ((attributed-class-statement
+           (nth 1 args))
+          (attributed-class-statement-type
+           (plist-get attributed-class-statement 'ast-type)))
+     (cond
+      ((equal attributed-class-statement-type 'property)
+       (let ((property-list
+              (plist-get attributed-class-statement 'subject)))
+         (dolist (property property-list)
+           (let ((property-type
+                  (plist-get property 'ast-type)))
+             (cond
+              ((equal property-type 'property-variable)
+               (let ((symbol-name
+                      (plist-get property 'variable))
+                     (symbol-start
+                      (plist-get property 'ast-start))
+                     (symbol-end
+                      (plist-get property 'ast-end))
+                     (symbol-scope
+                      phps-mode-parser-sdt--bookkeeping-namespace))
+                 (push
+                  (list
+                   symbol-name
+                   symbol-scope
+                   symbol-start
+                   symbol-end)
+                  
phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack))))))))))
+
+   `(
+     ast-type
+     class-statement
+     attributes
+     ,(nth 0 args)
+     attributed-class-statement
+     ,(nth 1 args)))
+ phps-mode-parser--table-translations)
+
+;; 304 ((class_statement) (T_USE class_name_list trait_adaptations))
+(puthash
+ 304
+ (lambda(args _terminals)
+   `(
+     ast-type
+     use-class-statement
+     class-name-list
+     ,(nth 1 args)
+     trait-adaptations
+     ,(nth 2 args)))
+ phps-mode-parser--table-translations)
+
+;; 305 ((class_name_list) (class_name))
+(puthash 305 (lambda(args _terminals) (list args)) 
phps-mode-parser--table-translations)
+
+;; 306 ((class_name_list) (class_name_list "," class_name))
+(puthash 306 (lambda(args _terminals) (append (nth 0 args) (nth 2 args))) 
phps-mode-parser--table-translations)
+
+;; 307 ((trait_adaptations) (";"))
+(puthash 307 (lambda(_args _terminals) nil) 
phps-mode-parser--table-translations)
+
+;; 308 ("{" "}"))
+(puthash 308 (lambda(_args _terminals) nil) 
phps-mode-parser--table-translations)
+
+;; 309 ((trait_adaptations) ("{" trait_adaptation_list "}"))
+(puthash 309 (lambda(args _terminals) (nth 1 args)) 
phps-mode-parser--table-translations)
+
+;; 310 ((trait_adaptation_list) (trait_adaptation))
+(puthash 310 (lambda(args _terminals) (list args)) 
phps-mode-parser--table-translations)
+
+;; 311 ((trait_adaptation_list) (trait_adaptation_list trait_adaptation))
+(puthash 311 (lambda(args _terminals) (append (nth 0 args) (nth 1 args))) 
phps-mode-parser--table-translations)
+
+;; 312 ((trait_adaptation) (trait_precedence ";"))
+(puthash 312 (lambda(args _terminals) (nth 0 args)) 
phps-mode-parser--table-translations)
+
+;; 313 ((trait_adaptation) (trait_alias ";"))
+(puthash
+ 313
+ (lambda(args _terminals) (nth 0 args))
+ phps-mode-parser--table-translations)
+
+;; 314 ((trait_precedence) (absolute_trait_method_reference T_INSTEADOF 
class_name_list))
+(puthash
+ 314
+ (lambda(args _terminals)
+   `(
+     ast-type
+     trait-precendence
+     absolute-trait-method-reference
+     ,(nth 0 args)
+     instead-of
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 315 ((trait_alias) (trait_method_reference T_AS T_STRING))
+(puthash
+ 315
+ (lambda(args _terminals)
+   `(
+     ast-type
+     trait-alias
+     trait-method-reference
+     ,(nth 0 args)
+     as
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 316 ((trait_alias) (trait_method_reference T_AS reserved_non_modifiers))
+(puthash
+ 316
+ (lambda(args _terminals)
+   `(
+     ast-type
+     trait-non-modifier
+     trait-method-reference
+     ,(nth 0 args)
+     as
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 317 ((trait_alias) (trait_method_reference T_AS member_modifier identifier))
+(puthash
+ 317
+ (lambda(args _terminals)
+   `(
+     ast-type
+     trait-alias-modifier
+     trait-method-reference
+     ,(nth 0 args)
+     as
+     ,(nth 2 args)
+     identifier
+     ,(nth 3 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 318 ((trait_alias) (trait_method_reference T_AS member_modifier))
+(puthash
+ 318
+ (lambda(args _terminals)
+   `(
+     ast-type
+     trait-modifier
+     trait-method-reference
+     ,(nth 0 args)
+     as
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 319 ((trait_method_reference) (identifier))
+(puthash
+ 319
+ (lambda(args _terminals)
+   `(
+     ast-type
+     trait-method-reference-identifier
+     identifier
+     ,args))
+ phps-mode-parser--table-translations)
+
+;; 320 ((trait_method_reference) (absolute_trait_method_reference))
+(puthash
+ 320
+ (lambda(args _terminals)
+   `(
+     ast-type
+     trait-method-reference-absolute
+     absolute-trait-method-reference
+     ,args)
+   )
+ phps-mode-parser--table-translations)
+
+;; 321 ((absolute_trait_method_reference) (class_name T_PAAMAYIM_NEKUDOTAYIM 
identifier))
+(puthash
+ 321
+ (lambda(args _terminals)
+   `(
+     ast-type
+     absolute-trait-method-reference
+     class-name
+     ,(nth 0 args)
+     member
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 322 ((method_body) (";"))
+(puthash 322 (lambda(_args _terminals) nil) 
phps-mode-parser--table-translations)
+
+;; 323 ((method_body) ("{" inner_statement_list "}"))
+(puthash 323 (lambda(args _terminals) (nth 1 args)) 
phps-mode-parser--table-translations)
+
+;; 324 ((variable_modifiers) (non_empty_member_modifiers))
+(puthash 324 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 325 ((variable_modifiers) (T_VAR))
+(puthash 325 (lambda(_args _terminals) '(public)) 
phps-mode-parser--table-translations)
+
+;; 326 ((method_modifiers) (%empty))
+(puthash 326 (lambda(_args _terminals) nil) 
phps-mode-parser--table-translations)
+
+;; 327 ((method_modifiers) (non_empty_member_modifiers))
+(puthash 327 (lambda(args _terminals) args) 
phps-mode-parser--table-translations)
+
+;; 328 ((non_empty_member_modifiers) (member_modifier))
+(puthash 328 (lambda(args _terminals) (list args)) 
phps-mode-parser--table-translations)
+
+;; 329 ((non_empty_member_modifiers) (non_empty_member_modifiers 
member_modifier))
+(puthash 329 (lambda(args _terminals) (append (nth 0 args) (list (nth 1 
args)))) phps-mode-parser--table-translations)
+
+;; 330 ((member_modifier) (T_PUBLIC))
+(puthash 330 (lambda(_args _terminals) 'public) 
phps-mode-parser--table-translations)
+
+;; 331 ((member_modifier) (T_PROTECTED))
+(puthash 331 (lambda(_args _terminals) 'protected) 
phps-mode-parser--table-translations)
+
+;; 332 ((member_modifier) (T_PRIVATE))
+(puthash 332 (lambda(_args _terminals) 'private) 
phps-mode-parser--table-translations)
+
+;; 333 ((member_modifier) (T_STATIC))
+(puthash 333 (lambda(_args _terminals) 'static) 
phps-mode-parser--table-translations)
+
+;; 334 ((member_modifier) (T_ABSTRACT))
+(puthash 334 (lambda(_args _terminals) 'abstract) 
phps-mode-parser--table-translations)
+
+;; 335 ((member_modifier) (T_FINAL))
+(puthash 335 (lambda(_args _terminals) 'final) 
phps-mode-parser--table-translations)
+
+;; 336 ((member_modifier) (T_READONLY))
+(puthash 336 (lambda(_args _terminals) 'readonly) 
phps-mode-parser--table-translations)
+
+;; 337 ((property_list) (property_list "," property))
+(puthash 337 (lambda(args _terminals) (append (nth 0 args) (nth 2 args))) 
phps-mode-parser--table-translations)
+
+;; 338 ((property_list) (property))
+(puthash 338 (lambda(args _terminals) (list args)) 
phps-mode-parser--table-translations)
+
+;; 339 ((property) (T_VARIABLE backup_doc_comment))
+(puthash
+ 339
+ (lambda(args terminals)
+   `(
+     ast-type
+     property-variable
+     ast-start
+     ,(car (cdr (car terminals)))
+     ast-index
+     ,(car (cdr (car terminals)))
+     ast-end
+     ,(cdr (cdr (car terminals)))
+     variable
+     ,(nth 0 args)
+     backup-doc-comment
+     ,(nth 1 args)))
+ phps-mode-parser--table-translations)
+
+;; 340 ((property) (T_VARIABLE "=" expr backup_doc_comment))
+(puthash
+ 340
+ (lambda(args terminals)
+   `(
+     ast-type
+     property-assigned-variable
+     variable
+     ,(nth 0 args)
+     expr
+     ,(nth 2 args)
+     backup-doc-comment
+     ,(nth 3 args)
+     ast-index
+     ,(car (cdr (nth 0 terminals)))
+     ast-start
+     ,(car (cdr (nth 0 terminals)))
+     ast-end
+     ,(cdr (cdr (nth 0 terminals)))))
+ phps-mode-parser--table-translations)
+
+;; 341 ((class_const_list) (class_const_list "," class_const_decl))
+(puthash
+ 341
+ (lambda(args _terminals)
+   `(append ,(nth 1 args) ,(nth 3 args)))
+ phps-mode-parser--table-translations)
+
+;; 342 ((class_const_list) (class_const_decl))
+(puthash
+ 342
+ (lambda(args _terminals)
+   (list args))
+ phps-mode-parser--table-translations)
+
+;; 343 ((class_const_decl) (identifier "=" expr backup_doc_comment))
+(puthash
+ 343
+ (lambda(args _terminals)
+   `(
+     ast-type
+     constant-assignment
+     ast-identifier
+     ,(nth 0 args)
+     ast-expr
+     ,(nth 2 args)
+     ast-backup-expression
+     ,(nth 3 args)))
+ phps-mode-parser--table-translations)
+
+;; 344 ((const_decl) (T_STRING "=" expr backup_doc_comment))
+(puthash
+ 344
+ (lambda(args _terminals)
+   `(
+     ast-type
+     constant-string-assignment
+     ast-string
+     ,(nth 0 args)
+     ast-expr
+     ,(nth 2 args)
+     ast-backup-expression
+     ,(nth 3 args)))
+ phps-mode-parser--table-translations)
+
+;; 345 ((echo_expr_list) (echo_expr_list "," echo_expr))
+(puthash
+ 345
+ (lambda(args _terminals)
+   `(
+     ast-type
+     echo-expr-list
+     ast-echo-expr-list
+     ,(nth 0 args)
+     ast-echo-expr
+     ,(nth 2 args)))
+ phps-mode-parser--table-translations)
+
+;; 346 ((echo_expr_list) (echo_expr))
+(puthash
+ 346
+ (lambda(args _terminals)
+   `(
+     ast-type
+     echo-expr-list
+     ast-echo-expr
+     ,args))
+ phps-mode-parser--table-translations)
+
+;; 347 ((echo_expr) (expr))
+(puthash
+ 347
+ (lambda(args _terminals)
+   `(
+     ast-type
+     echo-expr
+     ast-expr
+     ,args))
+ phps-mode-parser--table-translations)
+
+;; 348 ((for_exprs) (%empty))
+(puthash
+ 348
+ (lambda(_args _terminals)
+   `(
+     ast-type
+     empty-for-exprs))
+ phps-mode-parser--table-translations)
+
+;; 349 ((for_exprs) (non_empty_for_exprs))
+(puthash
+ 349
+ (lambda(args _terminals)
+   `(
+     ast-type
+     non-empty-for-exprs
+     ast-for-expr
+     ,args
+     ))
+ phps-mode-parser--table-translations)
+
+;; 350 ((non_empty_for_exprs) (non_empty_for_exprs "," expr))
+(puthash
+ 350
+ (lambda(args _terminals)
+   `(
+     ast-type
+     non-empty-for-exprs
+     ast-for-expr
+     ,(nth 0 args)
+     ast-expr
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 351 ((non_empty_for_exprs) (expr))
+(puthash
+ 351
+ (lambda(args _terminals)
+   `(
+     ast-type
+     non-empty-for-exprs
+     ast-expr
+     ,args
+     ))
+ phps-mode-parser--table-translations)
+
+;; 352 ((anonymous_class) (T_CLASS ctor_arguments extends_from implements_list 
backup_doc_comment "{" class_statement_list "}"))
+(puthash
+ 352
+ (lambda(args _terminals)
+   `(
+     ast-type
+     anonymous-class
+     ctor-arguments
+     ,(nth 1 args)
+     extends-from
+     ,(nth 2 args)
+     implements-list
+     ,(nth 3 args)
+     backup-doc-comment
+     ,(nth 4 args)
+     class-statement-list
+     ,(nth 6 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 353 ((new_expr) (T_NEW class_name_reference ctor_arguments))
+(puthash
+ 353
+ (lambda(args _terminals)
+   `(
+     ast-type
+     new-expr-class
+     class-name
+     ,(nth 1 args)
+     ctor-arguments
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 354 ((new_expr) (T_NEW anonymous_class))
+(puthash
+ 354
+ (lambda(args _terminals)
+   `(
+     ast-type
+     new-expr-anonymous-class
+     anonymous-class
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 355 ((new_expr) (T_NEW attributes anonymous_class))
+(puthash
+ 355
+ (lambda(args _terminals)
+   `(
+     ast-type
+     new-expr-attributed-anonymous-class
+     attributes
+     ,(nth 1 args)
+     anonymous-class
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 356 ((expr) (variable))
+(puthash
+ 356
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-variable
+     variable
+     ,args))
+ phps-mode-parser--table-translations)
+
+;; 357 ((expr) (T_LIST "(" array_pair_list ")" "=" expr))
+(puthash
+ 357
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-list
+     ,(nth 2 args)
+     expr
+     ,(nth 4 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 358 ((expr) ("[" array_pair_list "]" "=" expr))
+(puthash
+ 358
+ (lambda(args _terminals)
+   (let ((array-pair-list (nth 1 args)))
+     (dolist (array-item array-pair-list)
+       (let ((array-item-type (plist-get array-item 'ast-type)))
+         (cond
+          ((equal array-item-type 'array-pair-expr)
+           (let* ((array-item-expr (plist-get array-item 'expr))
+                  (array-item-expr-type (plist-get array-item-expr 'ast-type)))
+             (cond
+              ((equal array-item-expr-type 'expr-variable)
+               (let* ((expr-variable (plist-get array-item-expr 'variable))
+                      (expr-variable-type (plist-get expr-variable 'ast-type)))
+                 (cond
+                  ((equal expr-variable-type 'variable-callable-variable)
+                   (let* ((callable-variable (plist-get expr-variable 
'callable-variable))
+                          (callable-variable-type (plist-get callable-variable 
'ast-type)))
+                     (cond
+                      ((equal callable-variable-type 
'callable-variable-simple-variable)
+                       (let* ((callable-simple-variable
+                               (plist-get callable-variable 'simple-variable))
+                              (variable-name
+                               (plist-get callable-simple-variable 'variable))
+                              (variable-start
+                               (plist-get callable-simple-variable 'ast-start))
+                              (variable-end
+                               (plist-get callable-simple-variable 'ast-end)))
+                         (push
+                          (list
+                           variable-name
+                           phps-mode-parser-sdt--bookkeeping-namespace
+                           variable-start
+                           variable-end)
+                          
phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack))))))))))))))))
+   `(
+     ast-type
+     expr-list
+     array-pair-list
+     ,(nth 1 args)
+     expr
+     ,(nth 4 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 359 ((expr) (variable "=" expr))
+(puthash
+ 359
+ (lambda(args terminals)
+   ;; Save variable declaration in bookkeeping buffer
+   (let ((variable-type (plist-get (nth 0 args) 'ast-type)))
+     (cond
+      ((equal variable-type 'variable-callable-variable)
+       (let* ((callable-variable (plist-get (nth 0 args) 'callable-variable))
+              (callable-variable-type (plist-get callable-variable 'ast-type)))
+         (cond
+          ((equal callable-variable-type 'callable-variable-simple-variable)
+           (let ((callable-variable-simple-variable (plist-get 
callable-variable 'simple-variable)))
+             (let ((callable-variable-simple-variable-type
+                    (plist-get
+                     callable-variable-simple-variable
+                     'ast-type)))
+               (cond
+                ((equal
+                  callable-variable-simple-variable-type
+                  'simple-variable-variable)
+                 (let* ((variable-name
+                         (plist-get
+                          callable-variable-simple-variable
+                          'variable))
+                        (symbol-name
+                          variable-name)
+                        (symbol-start
+                         (car (cdr (car terminals))))
+                        (symbol-end
+                         (cdr (cdr (car terminals))))
+                        (symbol-scope
+                         phps-mode-parser-sdt--bookkeeping-namespace))
+
+                   ;; (message "declared variable from terminals: %S" 
terminals)
+                   (push
+                    (list
+                     symbol-name
+                     symbol-scope
+                     symbol-start
+                     symbol-end)
+                    
phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack))))))))))))
+
+   `(
+     ast-type
+     expr-assign-variable-by-expr
+     variable
+     ,(nth 0 args)
+     expr
+     ,(nth 2 args)
+     ast-index
+     ,(car (cdr (nth 0 terminals)))
+     ast-start
+     ,(car (cdr (nth 0 terminals)))
+     ast-end
+     ,(cdr (cdr (nth 0 terminals)))))
+ phps-mode-parser--table-translations)
+
+;; 360 ((expr) (variable "=" ampersand variable))
+(puthash
+ 360
+ (lambda(args terminals)
+   `(
+     ast-type
+     expr-assign-variable-by-reference
+     variable
+     ,(nth 0 args)
+     reference
+     ,(nth 2 args)
+     ast-index
+     ,(car (cdr (nth 0 terminals)))
+     ast-start
+     ,(car (cdr (nth 0 terminals)))
+     ast-end
+     ,(cdr (cdr (nth 0 terminals)))
+     ))
+ phps-mode-parser--table-translations)
+
+;; 361 ((expr) (T_CLONE expr))
+(puthash
+ 361
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-clone
+     expr
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 362 ((expr) (variable T_PLUS_EQUAL expr))
+(puthash
+ 362
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-variable-plus-equal-expr
+     variable
+     ,(nth 0 args)
+     expr
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 363 ((expr) (variable T_MINUS_EQUAL expr))
+(puthash
+ 363
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-variable-minus-equal-expr
+     variable
+     ,(nth 0 args)
+     expr
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 364 ((expr) (variable T_MUL_EQUAL expr))
+(puthash
+ 364
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-variable-mul-equal-expr
+     variable
+     ,(nth 0 args)
+     expr
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 365 ((expr) (variable T_POW_EQUAL expr))
+(puthash
+ 365
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-variable-pow-equal-expr
+     variable
+     ,(nth 0 args)
+     expr
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 366 ((expr) (variable T_DIV_EQUAL expr))
+(puthash
+ 366
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-variable-div-equal-expr
+     variable
+     ,(nth 0 args)
+     expr
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 367 ((expr) (variable T_CONCAT_EQUAL expr))
+(puthash
+ 367
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-variable-concat-equal-expr
+     variable
+     ,(nth 0 args)
+     expr
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 368 ((expr) (variable T_MOD_EQUAL expr))
+(puthash
+ 368
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-variable-mod-equal-expr
+     variable
+     ,(nth 0 args)
+     expr
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 369 ((expr) (variable T_AND_EQUAL expr))
+(puthash
+ 369
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-variable-and-equal-expr
+     variable
+     ,(nth 0 args)
+     expr
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 370 ((expr) (variable T_OR_EQUAL expr))
+(puthash
+ 370
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-variable-or-equal-expr
+     variable
+     ,(nth 0 args)
+     expr
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 371 ((expr) (variable T_XOR_EQUAL expr))
+(puthash
+ 371
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-variable-xor-equal-expr
+     variable
+     ,(nth 0 args)
+     expr
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 372 ((expr) (variable T_SL_EQUAL expr))
+(puthash
+ 372
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-variable-sl-equal-expr
+     variable
+     ,(nth 0 args)
+     expr
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 373 ((expr) (variable T_SR_EQUAL expr))
+(puthash
+ 373
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-variable-sr-equal-expr
+     variable
+     ,(nth 0 args)
+     expr
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 374 ((expr) (variable T_COALESCE_EQUAL expr))
+(puthash
+ 374
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-variable-coalesce-equal-expr
+     variable
+     ,(nth 0 args)
+     expr
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 375 ((expr) (variable T_INC))
+(puthash
+ 375
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-variable-inc
+     variable
+     ,(nth 0 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 376 ((expr) (T_INC variable))
+(puthash
+ 376
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-inc-variable
+     variable
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 377 ((expr) (variable T_DEC))
+(puthash
+ 377
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-variable-dec
+     variable
+     ,(nth 0 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 378 ((expr) (T_DEC variable))
+(puthash
+ 378
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-dev-variable
+     variable
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 379 ((expr) (expr T_BOOLEAN_OR expr))
+(puthash
+ 379
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-boolean-or-expr
+     expr-1
+     ,(nth 0 args)
+     expr-2
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 380 ((expr) (expr T_BOOLEAN_AND expr))
+(puthash
+ 380
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-boolean-and-expr
+     expr-1
+     ,(nth 0 args)
+     expr-2
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 381 ((expr) (expr T_LOGICAL_OR expr))
+(puthash
+ 381
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-logical-or-expr
+     expr-1
+     ,(nth 0 args)
+     expr-2
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 382 ((expr) (expr T_LOGICAL_AND expr))
+(puthash
+ 382
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-logical-and-expr
+     expr-1
+     ,(nth 0 args)
+     expr-2
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 383 ((expr) (expr T_LOGICAL_XOR expr))
+(puthash
+ 383
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-logical-xor-expr
+     expr-1
+     ,(nth 0 args)
+     expr-2
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 384 ((expr) (expr "|" expr))
+(puthash
+ 384
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-bitwise-or-expr
+     expr-1
+     ,(nth 0 args)
+     expr-2
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 385 ((expr) (expr T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG expr))
+(puthash
+ 385
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-bitwise-and-expr
+     expr-1
+     ,(nth 0 args)
+     expr-2
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 386 ((expr) (expr T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG expr))
+(puthash
+ 386
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-bitwise-and-variable
+     expr-1
+     ,(nth 0 args)
+     expr-2
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 387 ((expr) (expr "^" expr))
+(puthash
+ 387
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-bitwise-xor-expr
+     expr-1
+     ,(nth 0 args)
+     expr-2
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 388 ((expr) (expr "." expr))
+(puthash
+ 388
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-string-concatenation-expr
+     expr-1
+     ,(nth 0 args)
+     expr-2
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 389 ((expr) (expr "+" expr))
+(puthash
+ 389
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-arithmetic-addition-expr
+     expr-1
+     ,(nth 0 args)
+     expr-2
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 390 ((expr) (expr "-" expr))
+(puthash
+ 390
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-arithmetic-substraction-expr
+     expr-1
+     ,(nth 0 args)
+     expr-2
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 391 ((expr) (expr "*" expr))
+(puthash
+ 391
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-arithmetic-multiplication-expr
+     expr-1
+     ,(nth 0 args)
+     expr-2
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 392 ((expr) (expr T_POW expr))
+(puthash
+ 392
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-arithmetic-exponentiation-expr
+     expr-1
+     ,(nth 0 args)
+     expr-2
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 393 ((expr) (expr "/" expr))
+(puthash
+ 393
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-arithmetic-division-expr
+     expr-1
+     ,(nth 0 args)
+     expr-2
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 394 ((expr) (expr "%" expr))
+(puthash
+ 394
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-arithmetic-modulo-expr
+     expr-1
+     ,(nth 0 args)
+     expr-2
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 395 ((expr) (expr T_SL expr))
+(puthash
+ 395
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-bitwise-shift-left-expr
+     expr-1
+     ,(nth 0 args)
+     expr-2
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 396 ((expr) (expr T_SR expr))
+(puthash
+ 396
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-bitwise-shift-right-expr
+     expr-1
+     ,(nth 0 args)
+     expr-2
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 397 ((expr) ("+" expr))
+(puthash
+ 397
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-arithmetic-addition
+     expr
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 398 ((expr) ("-" expr))
+(puthash
+ 398
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-arithmetic-subtraction
+     expr
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 399 ((expr) ("!" expr))
+(puthash
+ 399
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-logical-not
+     expr
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 400 ((expr) ("~" expr))
+(puthash
+ 400
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-bitwise-not
+     expr
+     ,(nth 1 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 401 ((expr) (expr T_IS_IDENTICAL expr))
+(puthash
+ 401
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-is-identical-expr
+     expr-1
+     ,(nth 0 args)
+     expr-2
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 402 ((expr) (expr T_IS_NOT_IDENTICAL expr))
+(puthash
+ 402
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-is-not-identical-expr
+     expr-1
+     ,(nth 0 args)
+     expr-2
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 403 ((expr) (expr T_IS_EQUAL expr))
+(puthash
+ 403
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-comparison-is-equal-expr
+     expr-1
+     ,(nth 0 args)
+     expr-2
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 404 ((expr) (expr T_IS_NOT_EQUAL expr))
+(puthash
+ 404
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-comparison-is-not-equal-expr
+     expr-1
+     ,(nth 0 args)
+     expr-2
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 405 ((expr) (expr "<" expr))
+(puthash
+ 405
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-comparison-is-less-than-expr
+     expr-1
+     ,(nth 0 args)
+     expr-2
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 406 ((expr) (expr T_IS_SMALLER_OR_EQUAL expr))
+(puthash
+ 406
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-comparison-is-less-or-equal-than-expr
+     expr-1
+     ,(nth 0 args)
+     expr-2
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 407 ((expr) (expr ">" expr))
+(puthash
+ 407
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-comparison-is-greater-than-expr
+     expr-1
+     ,(nth 0 args)
+     expr-2
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 408 ((expr) (expr T_IS_GREATER_OR_EQUAL expr))
+(puthash
+ 408
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-comparison-is-greater-or-equal-than-expr
+     expr-1
+     ,(nth 0 args)
+     expr-2
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 409 ((expr) (expr T_SPACESHIP expr))
+(puthash
+ 409
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-comparison-spaceship-expr
+     expr-1
+     ,(nth 0 args)
+     expr-2
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 410 ((expr) (expr T_INSTANCEOF class_name_reference))
+(puthash
+ 410
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-type-instance-of
+     expr-1
+     ,(nth 0 args)
+     class-name-reference
+     ,(nth 2 args)
+     ))
+ phps-mode-parser--table-translations)
+
+;; 411 ((expr) ("(" expr ")"))
+(puthash
+ 411
+ (lambda(args _terminals)
+   (nth 1 args))
+ phps-mode-parser--table-translations)
+
+;; 412 ((expr) (new_expr))
+(puthash
+ 412
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-new-expr
+     expr
+     ,args))
+ phps-mode-parser--table-translations)
+
+;; 413 ((expr) (expr "?" expr ":" expr))
+(puthash
+ 413
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-ternary-expr
+     expr-test
+     ,(nth 0 args)
+     expr-true
+     ,(nth 2 args)
+     expr-false
+     ,(nth 4 args)))
+ phps-mode-parser--table-translations)
+
+;; 414 ((expr) (expr "?" ":" expr))
+(puthash
+ 414
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-ternary-expr
+     expr-test
+     ,(nth 0 args)
+     expr-true
+     ,(nth 0 args)
+     expr-false
+     ,(nth 3 args)))
+ phps-mode-parser--table-translations)
+
+;; 415 ((expr) (expr T_COALESCE expr))
+(puthash
+ 415
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-coalesce-expr
+     expr-1
+     ,(nth 0 args)
+     expr-2
+     ,(nth 2 args)))
+ phps-mode-parser--table-translations)
+
+;; 416 ((expr) (internal_functions_in_yacc))
+(puthash
+ 416
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-internal-functions-in-yacc
+     expr-internal-functions-in-yacc
+     ,args))
+ phps-mode-parser--table-translations)
+
+;; 417 ((expr) (T_INT_CAST expr))
+(puthash
+ 417
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-cast-int
+     expr
+     ,(nth 1 args)))
+ phps-mode-parser--table-translations)
+
+;; 418 ((expr) (T_DOUBLE_CAST expr))
+(puthash
+ 418
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-cast-double
+     expr
+     ,(nth 1 args)))
+ phps-mode-parser--table-translations)
+
+;; 419 ((expr) (T_STRING_CAST expr))
+(puthash
+ 419
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-cast-string
+     expr
+     ,(nth 1 args)))
+ phps-mode-parser--table-translations)
+
+;; 420 ((expr) (T_ARRAY_CAST expr))
+(puthash
+ 420
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-cast-array
+     expr
+     ,(nth 1 args)))
+ phps-mode-parser--table-translations)
+
+;; 421 ((expr) (T_OBJECT_CAST expr))
+(puthash
+ 421
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-cast-object
+     expr
+     ,(nth 1 args)))
+ phps-mode-parser--table-translations)
+
+;; 422 ((expr) (T_BOOL_CAST expr))
+(puthash
+ 422
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-cast-bool
+     expr
+     ,(nth 1 args)))
+ phps-mode-parser--table-translations)
+
+;; 423 ((expr) (T_UNSET_CAST expr))
+(puthash
+ 423
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-cast-unset
+     expr
+     ,(nth 1 args)))
+ phps-mode-parser--table-translations)
+
+;; 424 ((expr) (T_EXIT exit_expr))
+(puthash
+ 424
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-exit
+     exit-expr
+     ,(nth 1 args)))
+ phps-mode-parser--table-translations)
+
+;; 425 ((expr) ("@" expr))
+(puthash
+ 425
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-error-suppress
+     expr
+     ,(nth 1 args)))
+ phps-mode-parser--table-translations)
+
+;; 426 ((expr) (scalar))
+(puthash
+ 426
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-scalar
+     scalar
+     ,args))
+ phps-mode-parser--table-translations)
+
+;; 427 ((expr) ("`" backticks_expr "`"))
+(puthash
+ 427
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-backticks-expr
+     backticks-expr
+     ,(nth 1 args)))
+ phps-mode-parser--table-translations)
+
+;; 428 ((expr) (T_PRINT expr))
+(puthash
+ 428
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-print-expr
+     expr
+     ,(nth 1 args)))
+ phps-mode-parser--table-translations)
+
+;; 429 ((expr) (T_YIELD))
+(puthash
+ 429
+ (lambda(_args _terminals)
+   `(
+     ast-type
+     expr-yield))
+ phps-mode-parser--table-translations)
+
+;; 430 ((expr) (T_YIELD expr))
+(puthash
+ 430
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-yield-expr
+     expr
+     ,args))
+ phps-mode-parser--table-translations)
+
+;; 431 ((expr) (T_YIELD expr T_DOUBLE_ARROW expr))
+(puthash
+ 431
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-yield-expr-key-value
+     expr-key
+     ,(nth 1 args)
+     expr-value
+     ,(nth 3 args)))
+ phps-mode-parser--table-translations)
+
+;; 432 ((expr) (T_YIELD_FROM expr))
+(puthash
+ 432
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-yield-from-expr
+     expr
+     ,(nth 1 args)))
+ phps-mode-parser--table-translations)
+
+;; 433 ((expr) (T_THROW expr))
+(puthash
+ 433
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-throw-expr
+     expr
+     ,(nth 1 args)))
+ phps-mode-parser--table-translations)
+
+;; 434 ((expr) (inline_function))
+(puthash
+ 434
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-inline-function
+     inline-function
+     ,args))
+ phps-mode-parser--table-translations)
+
+;; 435 ((expr) (attributes inline_function))
+(puthash
+ 435
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-attributed-inline-function
+     attributes
+     ,(nth 0 args)
+     inline-function
+     ,(nth 1 args)))
+ phps-mode-parser--table-translations)
+
+;; 436 ((expr) (T_STATIC inline_function))
+(puthash
+ 436
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-static-inline-function
+     inline-function
+     ,(nth 1 args)))
+ phps-mode-parser--table-translations)
+
+;; 437 ((expr) (attributes T_STATIC inline_function))
+(puthash
+ 437
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-attributed-static-inline-function
+     attributes
+     ,(nth 0 args)
+     inline-function
+     ,(nth 2 args)))
+ phps-mode-parser--table-translations)
+
+;; 438 ((expr) (match))
+(puthash
+ 438
+ (lambda(args _terminals)
+   `(
+     ast-type
+     expr-match
+     match
+     ,args))
+ phps-mode-parser--table-translations)
+
+;; 439 ((inline_function) (function returns_ref backup_doc_comment "(" 
parameter_list ")" lexical_vars return_type backup_fn_flags "{" 
inner_statement_list "}" backup_fn_flags))
+(puthash
+ 439
+ (lambda(args terminals)
+   (let ((function-start
+          (cdr (cdr (nth 9 terminals))))
+         (function-end
+          (car (cdr (nth 11 terminals))))
+         (namespace
+          phps-mode-parser-sdt--bookkeeping-namespace)
+         (parameter-list
+          (nth 4 args))
+         (lexical-vars
+          (nth 6 args)))
+     (setq
+      phps-mode-parser-sdt--bookkeeping-anonymous-function-count
+      (1+ phps-mode-parser-sdt--bookkeeping-anonymous-function-count))
+     (push
+      (list
+       'anonymous-function
+       phps-mode-parser-sdt--bookkeeping-anonymous-function-count)
+      namespace)
+
+     ;; Go through parameters and assign variables inside function
+     (when parameter-list
+       (dolist (parameter parameter-list)
+         (let ((parameter-type
+                (plist-get
+                 parameter
+                 'ast-type)))
+           (cond
+            ((equal parameter-type 'attributed-parameter)
+             (let* ((attributed-parameter
+                     (plist-get parameter 'parameter))
+                    (parameter-name
+                     (plist-get attributed-parameter 'ast-name))
+                    (parameter-start
+                     (plist-get attributed-parameter 'ast-start))
+                    (parameter-end
+                     (plist-get attributed-parameter 'ast-end)))
+               (push
+                (list
+                 parameter-name
+                 namespace
+                 parameter-start
+                 parameter-end)
+                phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack)
+               (push
+                (list
+                 parameter-name
+                 namespace
+                 parameter-start
+                 parameter-end)
+                phps-mode-parser-sdt--bookkeeping-symbol-stack)))))))
+
+     ;; Go through lexical_vars and assign inside function
+     (when lexical-vars
+       (let ((lexical-vars-type
+              (plist-get lexical-vars 'ast-type)))
+         (cond
+          ((equal lexical-vars-type 'lexical-vars)
+           (let ((lexical-var-list
+                  (plist-get lexical-vars 'lexical-var-list)))
+             (dolist (lexical-var lexical-var-list)
+               (let ((lexical-var-type
+                      (plist-get lexical-var 'ast-type)))
+                 (cond
+                  ((equal lexical-var-type 'lexical-var-variable)
+                   (let ((lexical-var-name
+                          (plist-get lexical-var 'ast-name))
+                         (lexical-var-start
+                          (plist-get lexical-var 'ast-start))
+                         (lexical-var-end
+                          (plist-get lexical-var 'ast-end)))
+                     (push
+                      (list
+                       lexical-var-name
+                       namespace
+                       lexical-var-start
+                       lexical-var-end)
+                      
phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack)
+                     (push
+                      (list
+                       lexical-var-name
+                       phps-mode-parser-sdt--bookkeeping-namespace
+                       lexical-var-start
+                       lexical-var-end)
+                      phps-mode-parser-sdt--bookkeeping-symbol-stack)))))))))))
+
+     ;; Go through phps-mode-parser-sdt--bookkeeping-symbol-stack in scope and 
add namespace
+     (when (and
+            phps-mode-parser-sdt--bookkeeping-symbol-stack
+            function-start
+            function-end)
+       (dolist (
+                symbol-list
+                phps-mode-parser-sdt--bookkeeping-symbol-stack)
+         (let ((symbol-name (nth 0 symbol-list))
+               (symbol-start (nth 2 symbol-list)))
+           (unless (or
+                    (gethash
+                     symbol-name
+                     phps-mode-parser-sdt--bookkeeping--superglobal-variable-p)
+                    (< symbol-start function-start)
+                    (> symbol-start function-end))
+             (let ((symbol-scope (car (cdr symbol-list))))
+               (push
+                (list
+                 'anonymous-function
+                 phps-mode-parser-sdt--bookkeeping-anonymous-function-count)
+                symbol-scope)
+               (setcar
+                (cdr symbol-list)
+                symbol-scope)))))))
+
+   `(
+     ast-type
+     inline-function
+     function
+     ,(nth 0 args)
+     returns-ref
+     ,(nth 1 args)
+     backup-doc-comment
+     ,(nth 2 args)
+     parameter-list
+     ,(nth 4 args)
+     lexical-vars
+     ,(nth 6 args)
+     return-type
+     ,(nth 7 args)
+     backup-fn-flags-pre
+     ,(nth 8 args)
+     inner-statement-list
+     ,(nth 10 args)
+     backup-fn-flags-post
+     ,(nth 12 args)))
+ phps-mode-parser--table-translations)
+
+;; 440 ((inline_function) (fn returns_ref backup_doc_comment "(" 
parameter_list ")" return_type T_DOUBLE_ARROW backup_fn_flags backup_lex_pos 
expr backup_fn_flags))
+(puthash
+ 440
+ (lambda(args _terminals)
+   (let ((namespace
+          phps-mode-parser-sdt--bookkeeping-namespace)
+         (parameter-list
+          (nth 4 args)))
+     (setq
+      phps-mode-parser-sdt--bookkeeping-arrow-function-count
+      (1+ phps-mode-parser-sdt--bookkeeping-arrow-function-count))
+     (push
+      (list
+       'arrow-function
+       phps-mode-parser-sdt--bookkeeping-arrow-function-count)
+      namespace)
+
+     ;; Go through symbol stack in scope and add namespace
+     (when phps-mode-parser-sdt--bookkeeping-symbol-stack
+       (dolist (
+                symbol-list
+                phps-mode-parser-sdt--bookkeeping-symbol-stack)
+         (let ((symbol-name (nth 0 symbol-list)))
+           (unless (gethash
+                    symbol-name
+                    phps-mode-parser-sdt--bookkeeping--superglobal-variable-p)
+             (let ((symbol-scope (car (cdr symbol-list))))
+               (push
+                (list
+                 'arrow-function
+                 phps-mode-parser-sdt--bookkeeping-arrow-function-count)
+                symbol-scope)
+               (setcar
+                (cdr symbol-list)
+                symbol-scope))))))
+
+     ;; Go through parameters and assign variables inside function
+     (when parameter-list
+       (dolist (parameter parameter-list)
+         (let ((parameter-type
+                (plist-get
+                 parameter
+                 'ast-type)))
+           (cond
+            ((equal parameter-type 'attributed-parameter)
+             (let* ((attributed-parameter
+                     (plist-get parameter 'parameter))
+                    (parameter-name
+                     (plist-get attributed-parameter 'ast-name))
+                    (parameter-start
+                     (plist-get attributed-parameter 'ast-start))
+                    (parameter-end
+                     (plist-get attributed-parameter 'ast-end)))
+               (push
+                (list
+                 parameter-name
+                 namespace
+                 parameter-start
+                 parameter-end)
+                phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack)
+               (push
+                (list
+                 parameter-name
+                 namespace
+                 parameter-start
+                 parameter-end)
+                phps-mode-parser-sdt--bookkeeping-symbol-stack))))))))
+   `(
+     ast-type
+     inline-fn
+     returns-ref
+     ,(nth 1 args)
+     backup-doc-comment
+     ,(nth 2 args)
+     parameter-list
+     ,(nth 4 args)
+     return-type
+     ,(nth 6 args)
+     backup-fn-flags-pre
+     ,(nth 8 args)
+     backup-lex-pos
+     ,(nth 9 args)
+     expr
+     ,(nth 10 args)
+     backup-fn-flags-post
+     ,(nth 11 args)))
+ phps-mode-parser--table-translations)
+
+;; 441 ((fn) (T_FN))
+(puthash
+ 441
+ (lambda(_args _terminals)
+   `(
+     ast-type
+     fn))
+ phps-mode-parser--table-translations)
+
+;; 442 ((function) (T_FUNCTION))
+(puthash
+ 442
+ (lambda(_args _terminals)
+   `(
+     ast-type
+     function))
+ phps-mode-parser--table-translations)
+
+;; 443 ((backup_doc_comment) (%empty))
+(puthash
+ 443
+ (lambda(_args _terminals) nil)
+ phps-mode-parser--table-translations)
+
+;; 444 ((backup_fn_flags) (%empty))
+(puthash
+ 444
+ (lambda(_args _terminals) nil)
+ phps-mode-parser--table-translations)
+
+;; 445 ((backup_lex_pos) (%empty))
+(puthash
+ 445
+ (lambda(_args _terminals) nil)
+ phps-mode-parser--table-translations)
+
+;; 446 ((returns_ref) (%empty))
+(puthash
+ 446
+ (lambda(_args _terminals) nil)
+ phps-mode-parser--table-translations)
+
+;; 447 ((returns_ref) (ampersand))
+(puthash
+ 447
+ (lambda(_args _terminals) t)
+ phps-mode-parser--table-translations)
+
+;; 448 ((lexical_vars) (%empty))
+(puthash
+ 448
+ (lambda(_args _terminals) nil)
+ phps-mode-parser--table-translations)
+
+;; 449 ((lexical_vars) (T_USE "(" lexical_var_list possible_comma ")"))
+(puthash
+ 449
+ (lambda(args _terminals)
+   `(
+     ast-type
+     lexical-vars
+     lexical-var-list
+     ,(nth 2 args)))
+ phps-mode-parser--table-translations)
+
+;; 450 ((lexical_var_list) (lexical_var_list "," lexical_var))
+(puthash
+ 450
+ (lambda(args _terminals)
+   (append (nth 0 args) (nth 2 args)))
+ phps-mode-parser--table-translations)
+
+;; 451 ((lexical_var_list) (lexical_var))
+(puthash
+ 451
+ (lambda(args _terminals)
+   (list args))
+ phps-mode-parser--table-translations)
+
+;; 452 ((lexical_var) (T_VARIABLE))
+(puthash
+ 452
+ (lambda(args terminals)
+   `(
+     ast-type
+     lexical-var-variable
+     ast-name
+     ,args
+     ast-start
+     ,(car (cdr terminals))
+     ast-end
+     ,(cdr (cdr terminals))))
+ phps-mode-parser--table-translations)
+
+;; 453 ((lexical_var) (ampersand T_VARIABLE))
+(puthash
+ 453
+ (lambda(args terminals)
+   `(
+     ast-type
+     lexical-var-reference
+     ast-name
+     ,(nth 1 args)
+     ast-start
+     ,(car (cdr (nth 1 terminals)))
+     ,(cdr (cdr (nth 1 terminals)))))
+ phps-mode-parser--table-translations)
+
+;; 454 ((function_call) (name argument_list))
+(puthash
+ 454
+ (lambda(args _terminals)
+   `(
+     ast-type
+     function-call
+     name
+     ,(nth 0 args)
+     argument-list
+     ,(nth 1 args)))
+ phps-mode-parser--table-translations)
+
+;; 455 ((function_call) (class_name T_PAAMAYIM_NEKUDOTAYIM member_name 
argument_list))
+(puthash
+ 455
+ (lambda(args _terminals)
+   `(
+     ast-type
+     function-call-class
+     class-name
+     ,(nth 0 args)
+     member-name
+     ,(nth 2 args)
+     argument-list
+     ,(nth 3 args)))
+ phps-mode-parser--table-translations)
 
-(require 'phps-mode-parser)
+;; 456 ((function_call) (variable_class_name T_PAAMAYIM_NEKUDOTAYIM 
member_name argument_list))
+(puthash
+ 456
+ (lambda(args _terminals)
+   `(
+     ast-type
+     function-call-variable-class
+     variable-class-name
+     ,(nth 0 args)
+     member-name
+     ,(nth 2 args)
+     argument-list
+     ,(nth 3 args)))
+ phps-mode-parser--table-translations)
 
-(defun phps-mode-parser-sdt--get-list-of-object (objects)
-  "Get list of OBJECTS."
-  (cond
+;; 457 ((function_call) (callable_expr argument_list))
+(puthash
+ 457
+ (lambda(args _terminals)
+   `(
+     ast-type
+     function-call-callable-expr
+     callable-expr
+     ,(nth 0 args)
+     argument-list
+     ,(nth 1 args)))
+ phps-mode-parser--table-translations)
 
-   ((and (listp objects)
-         (plist-get objects 'ast-type))
-    (list objects))
+;; 458 ((class_name) (T_STATIC))
+(puthash
+ 458
+ (lambda(_args _terminals)
+   `(
+     ast-type
+     class-name-static))
+ phps-mode-parser--table-translations)
 
-   ((listp objects)
-    objects)
+;; 459 ((class_name) (name))
+(puthash
+ 459
+ (lambda(args _terminals)
+   `(
+     ast-type
+     class-name-name
+     name
+     ,args))
+ phps-mode-parser--table-translations)
 
-   (t (list objects))))
+;; 460 ((class_name_reference) (class_name))
+(puthash
+ 460
+ (lambda(args _terminals)
+   `(
+     ast-type
+     class-name-reference-class-name
+     class-name
+     ,args))
+ phps-mode-parser--table-translations)
 
-;; top_statement_list -> (top_statement_list top_statement)
+;; 461 ((class_name_reference) (new_variable))
 (puthash
- 83
+ 461
  (lambda(args _terminals)
-   (if (car args)
-       (append (car args) (cdr args))
-     (cdr args)))
+   `(
+     ast-type
+     class-name-reference-new-variable
+     new-variable
+     ,args))
  phps-mode-parser--table-translations)
 
-;; top_statement -> (T_NAMESPACE namespace_declaration_name ";")
+;; 462 ((class_name_reference) ("(" expr ")"))
 (puthash
- 111
- (lambda(args terminals)
+ 462
+ (lambda(args _terminals)
    `(
      ast-type
-     namespace
-     name
-     ,(nth 1 args)
-     index
-     ,(car (cdr (nth 1 terminals)))
-     start
-     ,(car (cdr (nth 2 terminals)))
-     end
-     max
-     ))
+     class-name-reference-expr
+     expr
+     ,(nth 1 args)))
  phps-mode-parser--table-translations)
 
-;; top_statement -> (T_NAMESPACE namespace_declaration_name "{" 
top_statement_list "}")
+;; 463 ((exit_expr) (%empty))
 (puthash
- 112
- (lambda(args terminals)
+ 463
+ (lambda(_args _terminals)
    `(
      ast-type
-     namespace
-     name
-     ,(nth 1 args)
-     index
-     ,(car (cdr (nth 1 terminals)))
-     start
-     ,(car (cdr (nth 2 terminals)))
-     end
-     ,(car (cdr (nth 4 terminals)))
-     children
-     ,(nth 3 args)
-     ))
+     exit-expr))
  phps-mode-parser--table-translations)
 
-;; top_statement -> (T_NAMESPACE "{" top_statement_list "}")
+;; 464 ((exit_expr) ("(" optional_expr ")"))
 (puthash
- 113
+ 464
  (lambda(args _terminals)
-   (nth 2 args))
+   `(
+     ast-type
+     exit-expr-optional-expr
+     optional-expr
+     ,(nth 1 args)))
  phps-mode-parser--table-translations)
 
-;; inner_statement_list -> (inner_statement_list inner_statement)
+;; 465 ((backticks_expr) (%empty))
 (puthash
- 139
+ 465
+ (lambda(_args _terminals)
+   `(
+     ast-type
+     backticks-expr-empty))
+ phps-mode-parser--table-translations)
+
+;; 466 ((backticks_expr) (T_ENCAPSED_AND_WHITESPACE))
+(puthash
+ 466
  (lambda(args _terminals)
-   (if (car args)
-       (append (car args) (cdr args))
-     (cdr args)))
+   `(
+     ast-type
+     backticks-expr-encapsed-and-whitespace
+     encapsed-and-whitespace
+     ,args))
  phps-mode-parser--table-translations)
 
-;; statement -> ("{" inner_statement_list "}")
+;; 467 ((backticks_expr) (encaps_list))
 (puthash
- 145
+ 467
  (lambda(args _terminals)
-   (nth 1 args))
+   `(
+     ast-type
+     backticks-expr-encaps-list
+     encaps-list
+     ,args))
  phps-mode-parser--table-translations)
 
-;; statement -> (T_WHILE "(" expr ")" while_statement)
+;; 468 ((ctor_arguments) (%empty))
 (puthash
- 148
+ 468
+ (lambda(_args _terminals)
+   `(
+     ast-type
+     ctor-arguments-empty))
+ phps-mode-parser--table-translations)
+
+;; 469 ((ctor_arguments) (argument_list))
+(puthash
+ 469
  (lambda(args _terminals)
    `(
      ast-type
-     while
-     condition
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args))
-     children
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 4 args)))
-   )
+     ctor-arguments-argument-list
+     argument-list
+     ,args))
  phps-mode-parser--table-translations)
 
-;; statement -> (T_DO statement T_WHILE "(" expr ")" ";")
+;; 470 ((dereferenceable_scalar) (T_ARRAY "(" array_pair_list ")"))
 (puthash
- 149
+ 470
  (lambda(args _terminals)
    `(
      ast-type
-     do-while
-     children
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 1 args))
-     condition
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 4 args))
+     dereferencable-scalar-array-pair
+     array-pair-list
+     ,(nth 2 args)
      ))
  phps-mode-parser--table-translations)
 
-;; statement -> (T_FOR "(" for_exprs ";" for_exprs ";" for_exprs ")" 
for_statement)
+;; 471 ((dereferenceable_scalar) ("[" array_pair_list "]"))
 (puthash
- 150
+ 471
  (lambda(args _terminals)
    `(
      ast-type
-     for
-     initial
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args))
-     test
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 4 args))
-     incremental
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 6 args))
-     children
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 8 args))
+     dereferencable-scalar-array-pair
+     array-pair-list
+     ,(nth 1 args)
      ))
  phps-mode-parser--table-translations)
 
-;; statement -> (T_RETURN optional_expr ";")
+;; 472 ((dereferenceable_scalar) (T_CONSTANT_ENCAPSED_STRING))
 (puthash
- 154
+ 472
  (lambda(args _terminals)
    `(
      ast-type
-     return-statement
-     optional-expr
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 1 args))
+     dereferencable-scalar-constant-encapsed-string
+     constant-encapsed-string
+     ,args
      ))
  phps-mode-parser--table-translations)
 
-;; statement -> (T_GLOBAL global_var_list ";")
+;; 473 ((dereferenceable_scalar) ("\"" encaps_list "\""))
 (puthash
- 155
+ 473
  (lambda(args _terminals)
    `(
      ast-type
-     global-statement
-     global-var-list
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 1 args))
+     dereferencable-scalar-encaps-list
+     encaps-list
+     ,args
      ))
  phps-mode-parser--table-translations)
 
-;; statement -> (T_STATIC static_var_list ";")
+;; 474 ((scalar) (T_LNUMBER))
 (puthash
- 156
+ 474
  (lambda(args _terminals)
    `(
      ast-type
-     static-variables-statement
-     static-var-list
-     ,(nth 1 args)
+     dereferencable-scalar-scalar
+     scalar
+     ,args
      ))
  phps-mode-parser--table-translations)
 
-;; statement -> (T_ECHO echo_expr_list ";")
+;; 475 ((scalar) (T_DNUMBER))
 (puthash
- 157
+ 475
  (lambda(args _terminals)
    `(
      ast-type
-     echo-statement
-     children
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 1 args))
+     dereferencable-scalar-scalar
+     scalar
+     ,args
      ))
  phps-mode-parser--table-translations)
 
-;; statement -> (expr ";")
+;; 476 ((scalar) (T_START_HEREDOC T_ENCAPSED_AND_WHITESPACE T_END_HEREDOC))
 (puthash
- 159
+ 476
  (lambda(args _terminals)
-   (nth 0 args))
+   `(
+     ast-type
+     dereferencable-scalar-scalar
+     scalar
+     ,(nth 2 args)
+     ))
  phps-mode-parser--table-translations)
 
-;; statement -> (T_FOREACH "(" expr T_AS foreach_variable ")" 
foreach_statement)
+;; 477 ((scalar) (T_START_HEREDOC T_END_HEREDOC))
 (puthash
- 161
+ 477
+ (lambda(_args _terminals)
+   `(
+     ast-type
+     dereferencable-scalar-scalar
+     scalar
+     ""
+     ))
+ phps-mode-parser--table-translations)
+
+;; 478 ((scalar) (T_START_HEREDOC encaps_list T_END_HEREDOC))
+(puthash
+ 478
  (lambda(args _terminals)
    `(
      ast-type
-     foreach
-     expression
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args))
-     value
-     ,(nth 4 args)
-     children
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 6 args))
+     dereferencable-scalar-scalar
+     scalar
+     ,(nth 1 args)
      ))
  phps-mode-parser--table-translations)
 
-;; statement -> (T_FOREACH "(" expr T_AS foreach_variable T_DOUBLE_ARROW 
foreach_variable ")" foreach_statement)
+;; 479 ((scalar) (dereferenceable_scalar))
 (puthash
- 162
+ 479
  (lambda(args _terminals)
    `(
      ast-type
-     foreach
-     expression
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args))
-     key
-     ,(nth 4 args)
-     value
-     ,(nth 6 args)
-     children
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 8 args))
+     scalar-dereferencable-scalar
+     dereferenceable-scalar
+     ,args
      ))
  phps-mode-parser--table-translations)
 
-;; statement -> (T_TRY "{" inner_statement_list "}" catch_list 
finally_statement)
+;; 480 ((scalar) (constant))
 (puthash
- 165
+ 480
  (lambda(args _terminals)
    `(
      ast-type
-     try
-     inner-statement-list
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args))
-     catch-list
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 4 args))
-     finally-statement
-     ,(nth 5 args)
+     scalar-constant
+     constant
+     ,args
      ))
  phps-mode-parser--table-translations)
 
-;; catch_list -> (catch_list T_CATCH "(" catch_name_list optional_variable ")" 
"{" inner_statement_list "}")
+;; 481 ((scalar) (class_constant))
 (puthash
- 169
- (lambda(args terminals)
+ 481
+ (lambda(args _terminals)
    `(
      ast-type
-     catch
-     catch-name-list
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 3 args))
-     optional-variable
-     ,(nth 4 args)
-     optional-variable-start
-     ,(car (cdr (nth 4 terminals)))
-     optional-variable-end
-     ,(cdr (cdr (nth 4 terminals)))
-     children
-     ,(nth 7 args)
+     scalar-class-constant
+     class-constant
+     ,args
      ))
  phps-mode-parser--table-translations)
 
-;; function_declaration_statement -> (function returns_ref T_STRING 
backup_doc_comment "(" parameter_list ")" return_type backup_fn_flags "{" 
inner_statement_list "}" backup_fn_flags)
+;; 482 ((constant) (name))
 (puthash
- 179
- (lambda(args terminals)
+ 482
+ (lambda(args _terminals)
    `(
      ast-type
-     function
+     constant-name
      name
-     ,(nth 2 args)
-     index
-     ,(car (cdr (nth 2 terminals)))
-     start
-     ,(car (cdr (nth 9 terminals)))
-     end
-     ,(car (cdr (nth 11 terminals)))
-     returns-reference-p
-     ,(not (equal (nth 1 args) nil))
-     parameter-list
-     ,(nth 5 args)
-     return-type
-     ,(nth 7 args)
-     children
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 10 args))
+     ,args
      ))
  phps-mode-parser--table-translations)
 
-;; class_declaration_statement -> (class_modifiers T_CLASS T_STRING 
extends_from implements_list backup_doc_comment "{" class_statement_list "}")
+;; 483 ((constant) (T_LINE))
 (puthash
- 184
- (lambda(args terminals)
+ 483
+ (lambda(_args _terminals)
    `(
      ast-type
-     class
-     modifiers
-     ,(nth 0 args)
-     name
-     ,(nth 2 args)
-     extends
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 3 args))
-     implements
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 4 args))
-     index
-     ,(car (cdr (nth 2 terminals)))
-     start
-     ,(car (cdr (nth 6 terminals)))
-     end
-     ,(car (cdr (nth 8 terminals)))
-     children
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 7 args))
+     constant-line
      ))
  phps-mode-parser--table-translations)
 
-;; class_declaration_statement -> (T_CLASS T_STRING extends_from 
implements_list backup_doc_comment "{" class_statement_list "}")
+;; 484 ((constant) (T_FILE))
 (puthash
- 185
- (lambda(args terminals)
+ 484
+ (lambda(_args _terminals)
    `(
      ast-type
-     class
-     name
-     ,(nth 1 args)
-     extends
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args))
-     implements
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 3 args))
-     index
-     ,(car (cdr (nth 1 terminals)))
-     start
-     ,(car (cdr (nth 5 terminals)))
-     end
-     ,(car (cdr (nth 7 terminals)))
-     children
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 6 args))
+     constant-file
+     ))
+ phps-mode-parser--table-translations)
+
+;; 485 ((constant) (T_DIR))
+(puthash
+ 485
+ (lambda(_args _terminals)
+   `(
+     ast-type
+     constant-dir
+     ))
+ phps-mode-parser--table-translations)
+
+;; 486 ((constant) (T_TRAIT_C))
+(puthash
+ 486
+ (lambda(_args _terminals)
+   `(
+     ast-type
+     constant-trait
+     ))
+ phps-mode-parser--table-translations)
+
+;; 487 ((constant) (T_METHOD_C))
+(puthash
+ 487
+ (lambda(_args _terminals)
+   `(
+     ast-type
+     constant-method
+     ))
+ phps-mode-parser--table-translations)
+
+;; 488 ((constant) (T_FUNC_C))
+(puthash
+ 488
+ (lambda(_args _terminals)
+   `(
+     ast-type
+     constant-function
+     ))
+ phps-mode-parser--table-translations)
+
+;; 489 ((constant) (T_NS_C))
+(puthash
+ 489
+ (lambda(_args _terminals)
+   `(
+     ast-type
+     constant-namespace
+     ))
+ phps-mode-parser--table-translations)
+
+;; 490 ((constant) (T_CLASS_C))
+(puthash
+ 490
+ (lambda(_args _terminals)
+   `(
+     ast-type
+     constant-class
      ))
  phps-mode-parser--table-translations)
 
-;; interface_declaration_statement -> (T_INTERFACE T_STRING 
interface_extends_list backup_doc_comment "{" class_statement_list "}")
+;; 491 ((class_constant) (class_name T_PAAMAYIM_NEKUDOTAYIM identifier))
+(puthash
+ 491
+ (lambda(args _terminals)
+   `(
+     ast-type
+     class-constant-class-name
+     class-name
+     ,(nth 0 args)
+     identifier
+     ,(nth 2 args)))
+ phps-mode-parser--table-translations)
+
+;; 492 ((class_constant) (variable_class_name T_PAAMAYIM_NEKUDOTAYIM 
identifier))
+(puthash
+ 492
+ (lambda(args _terminals)
+   `(
+     ast-type
+     class-constant-variable-class-name
+     variable-class-name
+     ,(nth 0 args)
+     identifier
+     ,(nth 2 args)))
+ phps-mode-parser--table-translations)
+
+;; 493 ((optional_expr) (%empty))
 (puthash
- 191
- (lambda(args terminals)
+ 493
+ (lambda(_args _terminals)
    `(
      ast-type
-     interface
-     name
-     ,(nth 1 args)
-     extends
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args))
-     index
-     ,(car (cdr (nth 1 terminals)))
-     start
-     ,(car (cdr (nth 4 terminals)))
-     end
-     ,(car (cdr (nth 6 terminals)))
-     children
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 5 args))
-     ))
+     optional-expr-empty))
  phps-mode-parser--table-translations)
 
-;; extends_from -> (%empty)
+;; 494 ((optional_expr) (expr))
 (puthash
- 198
- (lambda(_args _terminals)
-   nil
-   )
+ 494
+ (lambda(args _terminals)
+   `(
+     ast-type
+     optional-expr-not-empty
+     expr
+     ,args))
  phps-mode-parser--table-translations)
 
-;; extends_from -> (T_EXTENDS class_name)
+;; 495 ((variable_class_name) (fully_dereferenceable))
 (puthash
- 199
+ 495
  (lambda(args _terminals)
-   (nth 1 args))
+   `(
+     ast-type
+     variable-class-name
+     fully-dereferenceable
+     ,args))
  phps-mode-parser--table-translations)
 
-;; foreach_variable -> (ampersand variable)
+;; 496 ((fully_dereferenceable) (variable))
 (puthash
- 205
+ 496
  (lambda(args _terminals)
    `(
      ast-type
-     foreach-referenced-variable
+     fully-dereferenceable-variable
      variable
-     ,(nth 1 args)
-     ))
+     ,args))
  phps-mode-parser--table-translations)
 
-;; if_stmt_without_else -> (T_IF "(" expr ")" statement)
+;; 497 ((fully_dereferenceable) ("(" expr ")"))
 (puthash
- 234
+ 497
  (lambda(args _terminals)
    `(
      ast-type
-     if
-     condition
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args))
-     children
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 4 args))
-     ))
+     fully-dereferenceable-expr
+     expr
+     ,(nth 1 args)))
  phps-mode-parser--table-translations)
 
-;; parameter_list -> (non_empty_parameter_list possible_comma)
+;; 498 ((fully_dereferenceable) (dereferenceable_scalar))
 (puthash
- 242
+ 498
  (lambda(args _terminals)
-   (nth 0 args))
+   `(
+     ast-type
+     fully-dereferenceable-scalar
+     dereferenceable-scalar
+     ,args))
  phps-mode-parser--table-translations)
 
-;; non_empty_parameter_list -> (attributed_parameter)
+;; 499 ((fully_dereferenceable) (class_constant))
 (puthash
- 244
+ 499
  (lambda(args _terminals)
-   (list args))
+   `(
+     ast-type
+     fully-dereferenceable-class-constant
+     class-constant
+     ,args))
  phps-mode-parser--table-translations)
 
-;; non_empty_parameter_list -> (non_empty_parameter_list "," 
attributed_parameter)
+;; 500 ((array_object_dereferenceable) (fully_dereferenceable))
 (puthash
- 245
+ 500
  (lambda(args _terminals)
-   (append (nth 0 args) (list (nth 2 args))))
+   `(
+     ast-type
+     array-object-dereferenceable-fully-dereferenceable
+     fully-dereferenceable
+     ,args))
  phps-mode-parser--table-translations)
 
-;; parameter -> (optional_property_modifiers optional_type_without_static 
is_reference is_variadic T_VARIABLE backup_doc_comment)
+;; 501 ((array_object_dereferenceable) (constant))
 (puthash
- 254
- (lambda(args terminals)
+ 501
+ (lambda(args _terminals)
    `(
      ast-type
-     parameter
-     visibility
-     ,(nth 0 args)
-     type
-     ,(nth 1 args)
-     is-reference
-     ,(nth 2 args)
-     is-variadic
-     ,(nth 3 args)
-     name
-     ,(nth 4 args)
-     start
-     ,(car (cdr (nth 4 terminals)))
-     end
-     ,(cdr (cdr (nth 4 terminals)))
-     ))
+     array-object-dereferenceable-constant
+     constant
+     ,args))
  phps-mode-parser--table-translations)
 
-;; parameter -> (optional_property_modifiers optional_type_without_static 
is_reference is_variadic T_VARIABLE backup_doc_comment "=" expr)
+;; 502 ((callable_expr) (callable_variable))
 (puthash
- 255
- (lambda(args terminals)
+ 502
+ (lambda(args _terminals)
    `(
      ast-type
-     parameter-with-default-value
-     visibility
-     ,(nth 0 args)
-     type
-     ,(nth 1 args)
-     is-reference
-     ,(nth 2 args)
-     is-variadic
-     ,(nth 3 args)
-     name
-     ,(nth 4 args)
-     start
-     ,(car (cdr (nth 4 terminals)))
-     end
-     ,(cdr (cdr (nth 4 terminals)))
-     backup-doc-comment
-     ,(nth 5 args)
-     default-value
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 7 args))
-     ))
+     callable-expr-callable-variable
+     callable-variable
+     ,args))
  phps-mode-parser--table-translations)
 
-;; argument_list -> ("(" ")")
+;; 503 ((callable_expr) ("(" expr ")"))
 (puthash
- 281
- (lambda(_args _terminals)
-   nil)
+ 503
+ (lambda(args _terminals)
+   `(
+     ast-type
+     callable-expr-expr
+     expr
+     ,(nth 1 args)))
  phps-mode-parser--table-translations)
 
-;; argument_list -> ("(" non_empty_argument_list possible_comma ")")
+;; 504 ((callable_expr) (dereferenceable_scalar))
 (puthash
- 282
+ 504
  (lambda(args _terminals)
-   (nth 1 args))
+   `(
+     ast-type
+     callable-expr-dereferenceable-scalar
+     ,args))
  phps-mode-parser--table-translations)
 
-;; static_var_list -> (static_var_list "," static_var)
+;; 505 ((callable_variable) (simple_variable))
 (puthash
- 292
+ 505
  (lambda(args _terminals)
-   (append (nth 0 args) (list (nth 2 args))))
+   `(
+     ast-type
+     callable-variable-simple-variable
+     simple-variable
+     ,args))
  phps-mode-parser--table-translations)
 
-;; static_var_list -> (static_var)
+;; 506 ((callable_variable) (array_object_dereferenceable "[" optional_expr 
"]"))
 (puthash
- 293
+ 506
  (lambda(args _terminals)
-   (list args))
+   `(
+     ast-type
+     callable-variable-array-object-dereferenceable-indexed-expr
+     array-object-dereferenceable
+     ,(nth 0 args)
+     optional-expr
+     ,(nth 2 args)))
  phps-mode-parser--table-translations)
 
-;; static_var -> (T_VARIABLE)
+;; 507 ((callable_variable) (array_object_dereferenceable "{" expr "}"))
 (puthash
- 294
- (lambda(args terminals)
+ 507
+ (lambda(args _terminals)
    `(
      ast-type
-     variable
-     name
-     ,args
-     index
-     ,(car (cdr terminals))
-     start
-     ,(car (cdr terminals))
-     end
-     ,(cdr (cdr terminals))
-     ))
+     callable-variable-array-object-dereferenceable-indexed-expr
+     array-object-dereferenceable
+     ,(nth 0 args)
+     optional-expr
+     ,(nth 2 args)))
  phps-mode-parser--table-translations)
 
-;; static_var -> (T_VARIABLE "=" expr)
+;; 508 ((callable_variable) (array_object_dereferenceable T_OBJECT_OPERATOR 
property_name argument_list))
 (puthash
- 295
- (lambda(args terminals)
+ 508
+ (lambda(args _terminals)
    `(
      ast-type
-     variable
-     name
+     callable-variable-array-object-dereferenceable-property-name
+     array-object-dereferenceable
      ,(nth 0 args)
-     expr
+     property-name
      ,(nth 2 args)
-     index
-     ,(car (cdr (nth 0 terminals)))
-     start
-     ,(car (cdr (nth 0 terminals)))
-     end
-     ,(cdr (cdr (nth 0 terminals)))
-     ))
+     argument-list
+     ,(nth 3 args)))
  phps-mode-parser--table-translations)
 
-;; class_statement_list -> (class_statement_list class_statement)
+;; 509 ((callable_variable) (array_object_dereferenceable 
T_NULLSAFE_OBJECT_OPERATOR property_name argument_list))
 (puthash
- 296
+ 509
  (lambda(args _terminals)
-   (if (car args)
-         (append (car args) (cdr args))
-       (cdr args)))
+   `(
+     ast-type
+     callable-variable-array-object-dereferenceable-nullsafe-property-name
+     array-object-dereferenceable
+     ,(nth 0 args)
+     property-name
+     ,(nth 2 args)
+     argument-list
+     ,(nth 3 args)))
  phps-mode-parser--table-translations)
 
-;; attributed_class_statement -> (variable_modifiers 
optional_type_without_static property_list ";")
+;; 510 ((callable_variable) (function_call))
 (puthash
- 298
- (lambda(args terminals)
+ 510
+ (lambda(args _terminals)
    `(
      ast-type
-     property
-     modifiers
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 0 args))
-     type
-     ,(nth 1 args)
-     subject
-     ,(nth 2 args)
-     start
-     ,(car (cdr (car (nth 2 terminals))))
-     end
-     ,(cdr (cdr (car (nth 2 terminals))))
-     ))
+     callable-variable-function-call
+     function-call
+     ,args))
  phps-mode-parser--table-translations)
 
-;; attributed_class_statement -> (method_modifiers function returns_ref 
identifier backup_doc_comment "(" parameter_list ")" return_type 
backup_fn_flags method_body backup_fn_flags)
+;; 511 ((variable) (callable_variable))
 (puthash
- 300
- (lambda(args terminals)
+ 511
+ (lambda(args _terminals)
    `(
      ast-type
-     method
-     modifiers
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 0 args))
-     returns-reference-p
-     ,(not (equal (nth 2 args) nil))
-     name
-     ,(nth 3 args)
-     parameter-list
-     ,(nth 6 args)
-     return-type
-     ,(nth 8 args)
-     children
-     ,(if (nth 10 args)
-          (phps-mode-parser-sdt--get-list-of-object (nth 10 args))
-        nil)
-     index
-     ,(car (cdr (nth 3 terminals)))
-     start
-     ,(if (nth 10 args)
-          (car (cdr (car (nth 10 terminals))))
-        nil)
-     end
-     ,(if (nth 10 args)
-          (cdr (cdr (car (cdr (cdr (nth 10 terminals))))))
-        nil)
-     ))
+     variable-callable-variable
+     callable-variable
+     ,args))
  phps-mode-parser--table-translations)
 
-;; method_body -> (";")
+;; 512 ((variable) (static_member))
 (puthash
- 322
- (lambda(_args _terminals)
-   nil)
+ 512
+ (lambda(args _terminals)
+   `(
+     ast-type
+     variable-static-member
+     static-member
+     ,args))
  phps-mode-parser--table-translations)
 
-;; method_body -> ("{" inner_statement_list "}")
+;; 513 ((variable) (array_object_dereferenceable T_OBJECT_OPERATOR 
property_name))
 (puthash
- 323
- (lambda(args _terminals)
-   (nth 1 args))
+ 513
+ (lambda(args terminals)
+   (let* ((array-object-dereferenceable (nth 0 args))
+          (array-object-dereferenceable-type
+           (plist-get
+            array-object-dereferenceable
+            'ast-type)))
+     (when (equal
+            array-object-dereferenceable-type
+            'array-object-dereferenceable-fully-dereferenceable)
+       (let* ((dereferenceable
+               (plist-get
+                array-object-dereferenceable
+                'fully-dereferenceable))
+              (dereferencable-type
+               (plist-get
+                dereferenceable
+                'ast-type)))
+         (when (equal
+                dereferencable-type
+                'fully-dereferenceable-variable)
+           (let* ((fully-dereferenceable-variable
+                   (plist-get
+                    dereferenceable
+                    'variable))
+                  (fully-dereferenceable-variable-type
+                   (plist-get
+                    fully-dereferenceable-variable
+                    'ast-type)))
+             (when (equal
+                    fully-dereferenceable-variable-type
+                    'variable-callable-variable)
+               (let* ((callable-variable
+                       (plist-get
+                        fully-dereferenceable-variable
+                        'callable-variable))
+                      (callable-variable-type
+                       (plist-get
+                        callable-variable
+                        'ast-type)))
+                 (when (equal
+                        callable-variable-type
+                        'callable-variable-simple-variable)
+                   (let* ((simple-variable
+                           (plist-get
+                            (plist-get
+                             callable-variable
+                             'simple-variable)
+                            'variable)))
+                     (push
+                      (list
+                       simple-variable
+                       phps-mode-parser-sdt--bookkeeping-namespace
+                       (car (cdr (nth 0 terminals)))
+                       (cdr (cdr (nth 0 terminals))))
+                      phps-mode-parser-sdt--bookkeeping-symbol-stack)
+                     (let* ((property (nth 2 args))
+                            (property-type (plist-get property 'ast-type)))
+                       (when (equal
+                              property-type
+                              'property-name-string)
+                         (let ((property-string
+                                (plist-get
+                                 property
+                                 'string)))
+                           (let ((namespace 
phps-mode-parser-sdt--bookkeeping-namespace))
+                             (push (list 'object-operator simple-variable) 
namespace)
+                             (push
+                              (list
+                               (format "$%s" property-string)
+                               namespace
+                               (car (cdr (nth 2 terminals)))
+                               (cdr (cdr (nth 2 terminals))))
+                              
phps-mode-parser-sdt--bookkeeping-symbol-stack))))))))))))))
+   `(
+     ast-type
+     variable-array-object-dereferenceable-property-name
+     array-object-dereferenceable
+     ,(nth 0 args)
+     property-name
+     ,(nth 2 args)))
  phps-mode-parser--table-translations)
 
-;; variable_modifiers -> (T_VAR)
+;; 514 ((variable) (array_object_dereferenceable T_NULLSAFE_OBJECT_OPERATOR 
property_name))
 (puthash
- 325
- (lambda(_args _terminals)
-   'public)
+ 514
+ (lambda(args _terminals)
+   `(
+     ast-type
+     variable-array-object-dereferenceable-nullsafe-property-name
+     array-object-dereferenceable
+     ,(nth 0 args)
+     property-name
+     ,(nth 2 args)))
  phps-mode-parser--table-translations)
 
-;; member_modifier -> (T_PUBLIC)
+;; 515 ((simple_variable) (T_VARIABLE))
 (puthash
- 330
- (lambda(_args _terminals)
-   'public)
+ 515
+ (lambda(args terminals)
+   (let ((symbol-name
+           args)
+         (symbol-start
+          (car (cdr terminals)))
+         (symbol-end
+          (cdr (cdr terminals)))
+         (namespace phps-mode-parser-sdt--bookkeeping-namespace))
+     (push
+      (list
+       symbol-name
+       namespace
+       symbol-start
+       symbol-end)
+      phps-mode-parser-sdt--bookkeeping-symbol-stack))
+
+   `(
+     ast-type
+     simple-variable-variable
+     ast-start
+     ,(car (cdr terminals))
+     ast-end
+     ,(cdr (cdr terminals))
+     variable
+     ,args))
  phps-mode-parser--table-translations)
 
-;; member_modifier -> (T_PROTECTED)
+;; 516 ((simple_variable) ("$" "{" expr "}"))
 (puthash
- 331
- (lambda(_args _terminals)
-   'protected)
+ 516
+ (lambda(args _terminals)
+   `(
+     ast-type
+     simple-variable-expr
+     ,(nth 2 args)))
  phps-mode-parser--table-translations)
 
-;; member_modifier -> (T_PRIVATE)
+;; 517 ((simple_variable) ("$" simple_variable))
 (puthash
- 332
- (lambda(_args _terminals)
-   'private)
+ 517
+ (lambda(args terminals)
+   `(
+     ast-type
+     simple-variable-variable
+     ,(nth 1 args)
+     ast-start
+     ,(car (cdr (nth 1 terminals)))
+     ast-end
+     ,(cdr (cdr (nth 1 terminals)))
+     ))
  phps-mode-parser--table-translations)
 
-;; member_modifier -> (T_STATIC)
+;; 518 ((static_member) (class_name T_PAAMAYIM_NEKUDOTAYIM simple_variable))
 (puthash
- 333
- (lambda(_args _terminals)
-   'static)
+ 518
+ (lambda(args _terminals)
+   (let* ((class-name (nth 0 args))
+          (class-name-type (plist-get class-name 'ast-type)))
+     (cond
+      ((equal class-name-type 'class-name-name)
+       (let ((class-name-string (plist-get class-name 'name))
+             (namespace phps-mode-parser-sdt--bookkeeping-namespace))
+         (push (list 'static-member class-name-string) namespace)
+         (setf
+          (nth 1 (car phps-mode-parser-sdt--bookkeeping-symbol-stack))
+          namespace)))
+      ((equal class-name-type 'class-name-static)
+       (let ((namespace phps-mode-parser-sdt--bookkeeping-namespace))
+         (push (list 'static-member "static") namespace)
+         (setf
+          (nth 1 (car phps-mode-parser-sdt--bookkeeping-symbol-stack))
+          namespace)))))
+   `(
+     ast-type
+     static-member-class-name
+     class-name
+     ,(nth 0 args)
+     simple-variable
+     ,(nth 2 args)))
  phps-mode-parser--table-translations)
 
-;; member_modifier -> (T_ABSTRACT)
+;; 519 ((static_member) (variable_class_name T_PAAMAYIM_NEKUDOTAYIM 
simple_variable))
 (puthash
- 334
- (lambda(_args _terminals)
-   'abstract)
+ 519
+ (lambda(args _terminals)
+   ;; TODO Add bookkeeping here
+   `(
+     ast-type
+     static-member-variable-class-name
+     variable-class-name
+     ,(nth 0 args)
+     simple-variable
+     ,(nth 2 args)))
  phps-mode-parser--table-translations)
 
-;; member_modifier -> (T_FINAL)
+;; 520 ((new_variable) (simple_variable))
 (puthash
- 335
- (lambda(_args _terminals)
-   'final)
+ 520
+ (lambda(args _terminals)
+   `(
+     ast-type
+     new-variable-simple-variable
+     simple-variable
+     ,args))
  phps-mode-parser--table-translations)
 
-;; property -> (T_VARIABLE backup_doc_comment)
+;; 521 ((new_variable) (new_variable "[" optional_expr "]"))
 (puthash
- 339
+ 521
  (lambda(args _terminals)
-   (nth 0 args))
+   `(
+     ast-type
+     new-variable-optional-expr
+     new-variable
+     ,(nth 0 args)
+     optional-expr
+     ,(nth 2 args)))
  phps-mode-parser--table-translations)
 
-;; property -> (T_VARIABLE "=" expr backup_doc_comment)
+;; 522 ((new_variable) (new_variable "{" expr "}"))
 (puthash
- 340
- (lambda(args terminals)
+ 522
+ (lambda(args _terminals)
    `(
      ast-type
-     assign-property-variable
-     key
+     new-variable-expr
+     new-variable
      ,(nth 0 args)
-     value
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args))
-     index
-     ,(car (cdr (nth 0 terminals)))
-     start
-     ,(car (cdr (nth 0 terminals)))
-     end
-     ,(cdr (cdr (nth 0 terminals)))
-     ))
+     optional-expr
+     ,(nth 2 args)))
  phps-mode-parser--table-translations)
 
-;; expr -> ("[" array_pair_list "]" "=" expr)
+;; 523 ((new_variable) (new_variable T_OBJECT_OPERATOR property_name))
 (puthash
- 358
+ 523
  (lambda(args _terminals)
    `(
      ast-type
-     assign-variables-from-array
-     keys
-     ,(nth 1 args)
-     values
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 4 args))
-     ))
+     new-variable-property-name
+     new-variable
+     ,(nth 0 args)
+     property-name
+     ,(nth 2 args)))
  phps-mode-parser--table-translations)
 
-;; expr -> (variable "=" expr)
+;; 524 ((new_variable) (new_variable T_NULLSAFE_OBJECT_OPERATOR property_name))
 (puthash
- 359
- (lambda(args terminals)
+ 524
+ (lambda(args _terminals)
    `(
      ast-type
-     assign-variable
-     key
+     new-variable-nullsafe-property-name
+     new-variable
      ,(nth 0 args)
-     value
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args))
-     index
-     ,(car (cdr (nth 0 terminals)))
-     start
-     ,(car (cdr (nth 0 terminals)))
-     end
-     ,(cdr (cdr (nth 0 terminals)))
-     ))
+     property-name
+     ,(nth 2 args)))
  phps-mode-parser--table-translations)
 
-;; expr -> (variable T_INC)
+;; 525 ((new_variable) (class_name T_PAAMAYIM_NEKUDOTAYIM simple_variable))
 (puthash
- 375
+ 525
  (lambda(args _terminals)
    `(
      ast-type
-     increment-variable
-     variable
+     new-variable-class-name
+     class-name
      ,(nth 0 args)
-     ))
+     simple-variable
+     ,(nth 2 args)))
  phps-mode-parser--table-translations)
 
-;; expr -> (expr T_BOOLEAN_OR expr)
+;; 526 ((new_variable) (new_variable T_PAAMAYIM_NEKUDOTAYIM simple_variable))
 (puthash
- 379
+ 526
  (lambda(args _terminals)
    `(
      ast-type
-     boolean-or-expression
-     a
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 0 args))
-     b
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args))
-     ))
+     new-variable-simple-variable
+     new-variable
+     ,(nth 0 args)
+     simple-variable
+     ,(nth 2 args)))
  phps-mode-parser--table-translations)
 
-;; expr -> (expr T_BOOLEAN_AND expr)
+;; 527 ((member_name) (identifier))
 (puthash
- 380
+ 527
  (lambda(args _terminals)
    `(
      ast-type
-     boolean-and-expression
-     a
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 0 args))
-     b
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args))
-     ))
+     member-name-identifier
+     identifier
+     ,args))
  phps-mode-parser--table-translations)
 
-;; expr -> (expr T_LOGICAL_OR expr)
+;; 528 ((member_name) ("{" expr "}"))
 (puthash
- 381
+ 528
  (lambda(args _terminals)
    `(
      ast-type
-     logical-or-expression
-     a
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 0 args))
-     b
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args))
-     ))
+     member-name-expr
+     expr
+     ,(nth 1 args)))
  phps-mode-parser--table-translations)
 
-;; expr -> (expr T_LOGICAL_AND expr)
+;; 529 ((member_name) (simple_variable))
 (puthash
- 382
+ 529
  (lambda(args _terminals)
    `(
      ast-type
-     logical-and-expression
-     a
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 0 args))
-     b
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args))
-     ))
+     member-name-simple-variable
+     simple-variable
+     ,args))
  phps-mode-parser--table-translations)
 
-;; expr -> (expr T_LOGICAL_XOR expr)
+;; 530 ((property_name) (T_STRING))
 (puthash
- 383
+ 530
  (lambda(args _terminals)
    `(
      ast-type
-     logical-xor-expression
-     a
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 0 args))
-     b
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args))
-     ))
+     property-name-string
+     string
+     ,args))
  phps-mode-parser--table-translations)
 
-;; expr -> (expr "|" expr)
+;; 531 ((property_name) ("{" expr "}"))
 (puthash
- 384
+ 531
  (lambda(args _terminals)
    `(
      ast-type
-     bitwise-or-expression
-     a
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 0 args))
-     b
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args))
-     ))
+     properyt-name-expr
+     expr
+     ,args))
  phps-mode-parser--table-translations)
 
-;; expr -> (expr T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG expr)
+;; 532 ((property_name) (simple_variable))
 (puthash
- 385
+ 532
  (lambda(args _terminals)
    `(
      ast-type
-     bitwise-and-expression
-     a
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 0 args))
-     b
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args))
-     ))
+     property-name-simple-variable
+     simple-variable
+     ,args))
  phps-mode-parser--table-translations)
 
-;; expr -> (expr T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG expr)
+;; 533 ((array_pair_list) (non_empty_array_pair_list))
 (puthash
- 386
+ 533
  (lambda(args _terminals)
-   `(
-     ast-type
-     bitwise-and-expression
-     a
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 0 args))
-     b
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args))
-     ))
+   args)
  phps-mode-parser--table-translations)
 
-;; expr -> (expr "^" expr)
+;; 534 ((possible_array_pair) (%empty))
 (puthash
- 387
- (lambda(args _terminals)
-   `(
-     ast-type
-     bitwise-xor-expression
-     a
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 0 args))
-     b
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args))
-     ))
+ 534
+ (lambda(_args _terminals)
+   nil)
  phps-mode-parser--table-translations)
 
-;; expr -> (expr "." expr)
+;; 535 ((possible_array_pair) (array_pair))
 (puthash
- 388
+ 535
  (lambda(args _terminals)
-   `(
-     ast-type
-     concat-expression
-     a
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 0 args))
-     b
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args))
-     ))
+   args)
  phps-mode-parser--table-translations)
 
-;; expr -> (expr "+" expr)
+;; 536 ((non_empty_array_pair_list) (non_empty_array_pair_list "," 
possible_array_pair))
 (puthash
- 389
+ 536
  (lambda(args _terminals)
-   `(
-     ast-type
-     addition-expression
-     a
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 0 args))
-     b
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args))
-     ))
+   (if (nth 2 args)
+       (append (nth 0 args) (list (nth 2 args)))
+     (nth 0 args)))
  phps-mode-parser--table-translations)
 
-;; expr -> (expr "-" expr)
+;; 537 ((non_empty_array_pair_list) (possible_array_pair))
 (puthash
- 390
+ 537
  (lambda(args _terminals)
-   `(
-     ast-type
-     subtraction-expression
-     a
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 0 args))
-     b
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args))
-     ))
+   (list args))
  phps-mode-parser--table-translations)
 
-;; expr -> (expr "*" expr)
+;; 538 ((array_pair) (expr T_DOUBLE_ARROW expr))
 (puthash
- 391
+ 538
  (lambda(args _terminals)
    `(
      ast-type
-     multiplication-expression
-     a
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 0 args))
-     b
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args))
-     ))
+     array-pair-expr1-double-arrow-expr2
+     expr1
+     ,(nth 0 args)
+     expr2
+     ,(nth 2 args)))
  phps-mode-parser--table-translations)
 
-;; expr -> (expr T_POW expr)
+;; 539 ((array_pair) (expr))
 (puthash
- 392
+ 539
  (lambda(args _terminals)
    `(
      ast-type
-     exponentiation-expression
-     a
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 0 args))
-     b
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args))
-     ))
+     array-pair-expr
+     expr
+     ,args))
  phps-mode-parser--table-translations)
 
-;; expr -> (expr "/" expr)
+;; 540 ((array_pair) (expr T_DOUBLE_ARROW ampersand variable))
 (puthash
- 393
+ 540
  (lambda(args _terminals)
    `(
      ast-type
-     division-expression
-     a
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 0 args))
-     b
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args))
-     ))
+     array-pair-expr-double-arrow-referenced-variable
+     expr
+     ,(nth 0 args)
+     referenced-variable
+     ,(nth 3 args)))
  phps-mode-parser--table-translations)
 
-;; expr -> (expr "%" expr)
+;; 541 ((array_pair) (ampersand variable))
 (puthash
- 394
+ 541
  (lambda(args _terminals)
    `(
      ast-type
-     modulo-expression
-     a
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 0 args))
-     b
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args))
-     ))
+     array-pair-referenced-variable
+     referenced-variable
+     ,args))
  phps-mode-parser--table-translations)
 
-;; expr -> (expr T_SL expr)
+;; 542 ((array_pair) (T_ELLIPSIS expr))
 (puthash
- 395
+ 542
  (lambda(args _terminals)
    `(
      ast-type
-     bitwise-shift-left-expression
-     a
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 0 args))
-     b
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args))
-     ))
+     array-pair-ellipsis-expr
+     expr
+     ,(nth 1 args)))
  phps-mode-parser--table-translations)
 
-;; expr -> (expr T_SR expr)
+;; 543 ((array_pair) (expr T_DOUBLE_ARROW T_LIST "(" array_pair_list ")"))
 (puthash
- 396
+ 543
  (lambda(args _terminals)
    `(
      ast-type
-     bitwise-shift-right-expression
-     a
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 0 args))
-     b
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args))
-     ))
+     array-pair-double-arrow-list
+     expr
+     ,(nth 0 args)
+     array-pair-list
+     ,(nth 4 args)))
  phps-mode-parser--table-translations)
 
-;; expr -> ("!" expr)
+;; 544 ((array_pair) (T_LIST "(" array_pair_list ")"))
 (puthash
- 399
+ 544
  (lambda(args _terminals)
    `(
      ast-type
-     negated-expression
-     expression
-     ,(nth 1 args)
-     ))
+     array-pair-list
+     array-pair-list
+     ,(nth 2 args)))
  phps-mode-parser--table-translations)
 
-;; expr -> (T_STATIC inline_function)
+;; 545 ((encaps_list) (encaps_list encaps_var))
 (puthash
- 436
+ 545
  (lambda(args _terminals)
    `(
-     'ast-type
-     'static-inline-function
-     'inline-function
-     ,(nth 1 args)
-     ))
+     ast-type
+     escaps-list-encaps-list
+     ,(append (nth 0 args) (list (nth 1 args)))))
  phps-mode-parser--table-translations)
 
-;; inline_function -> (function returns_ref backup_doc_comment "(" 
parameter_list ")" lexical_vars return_type backup_fn_flags "{" 
inner_statement_list "}" backup_fn_flags)
+;; 546 ((encaps_list) (encaps_list T_ENCAPSED_AND_WHITESPACE))
 (puthash
- 439
- (lambda(args terminals)
+ 546
+ (lambda(args _terminals)
    `(
      ast-type
-     inline-function
-     start
-     ,(car (cdr (nth 9 terminals)))
-     end
-     ,(cdr (cdr (nth 11 terminals)))
-     returns-ref
-     ,(nth 1 args)
-     backup-doc-comment
-     ,(nth 2 args)
-     parameter-list
-     ,(nth 4 args)
-     lexical-vars
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 6 args))
-     return-type
-     ,(nth 7 args)
-     backup-fn-flags-1
-     ,(nth 8 args)
-     inner-statement-list
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 10 args))
-     backup-fn-flags-2
-     ,(nth 12 args)
-     ))
+     escaps-list-encapsed-and-whitespace
+     encaps-list
+     ,(nth 0 args)
+     encapsed-and-whitespace
+     ,(nth 1 args)))
  phps-mode-parser--table-translations)
 
-;; inline_function -> (fn returns_ref backup_doc_comment "(" parameter_list 
")" return_type T_DOUBLE_ARROW backup_fn_flags backup_lex_pos expr 
backup_fn_flags)
+;; 547 ((encaps_list) (encaps_var))
 (puthash
- 440
- (lambda(args terminals)
+ 547
+ (lambda(args _terminals)
    `(
      ast-type
-     arrow-function
-     start
-     ,(car (cdr (nth 9 terminals)))
-     end
-     ,(cdr (cdr (nth 11 terminals)))
-     returns-ref
-     ,(nth 1 args)
-     backup-doc-comment
-     ,(nth 2 args)
-     parameter-list
-     ,(nth 4 args)
-     return-type
-     ,(nth 6 args)
-     backup-fn-flags-1
-     ,(nth 8 args)
-     backup-lex-pos
-     ,(nth 9 args)
-     expr
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 10 args))
-     backup-fn-flags-2
-     ,(nth 11 args)
-     ))
+     escaps-list-encaps-var
+     encaps-var
+     ,args))
  phps-mode-parser--table-translations)
 
-;; lexical_vars -> (T_USE "(" lexical_var_list possible_comma ")")
+;; 548 ((encaps_list) (T_ENCAPSED_AND_WHITESPACE encaps_var))
 (puthash
- 449
+ 548
  (lambda(args _terminals)
-   (nth 2 args))
+   `(
+     ast-type
+     escaps-list-enscapsed-and-whitespace-encaps-var
+     encapsed-and-whitespace
+     ,(nth 0 args)
+     encaps-var
+     ,(nth 1 args)))
  phps-mode-parser--table-translations)
 
-;; lexical_var -> (T_VARIABLE)
+;; 549 ((encaps_var) (T_VARIABLE))
 (puthash
- 452
- (lambda(args terminals)
+ 549
+ (lambda(args _terminals)
    `(
      ast-type
-     lexical-var
-     name
-     ,args
-     start
-     ,(car (cdr terminals))
-     end
-     ,(cdr (cdr terminals))
-     ))
+     encaps-var-variable
+     variable
+     ,args))
  phps-mode-parser--table-translations)
 
-;; function_call -> (name argument_list)
+;; 550 ((encaps_var) (T_VARIABLE "[" encaps_var_offset "]"))
 (puthash
- 454
+ 550
  (lambda(args _terminals)
    `(
      ast-type
-     function-call
-     name
+     encaps-var-variable-with-offset
+     variable
      ,(nth 0 args)
-     argument-list
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 1 args))
-     ))
+     encaps-var-offset
+     ,(nth 2 args)))
  phps-mode-parser--table-translations)
 
-;; dereferencable_scalar -> (T_ARRAY "(" array_pair_list ")")
+;; 551 ((encaps_var) (T_VARIABLE T_OBJECT_OPERATOR T_STRING))
 (puthash
- 470
+ 551
  (lambda(args _terminals)
    `(
      ast-type
-     dereferencable-scalar
-     array-pair-list
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args))
-     ))
+     encaps-var-variable-property
+     variable
+     ,(nth 0 args)
+     property
+     ,(nth 2 args)))
  phps-mode-parser--table-translations)
 
-;; dereferencable_scalar -> (T_CONSTANT_ENCAPSED_STRING)
+;; 552 ((encaps_var) (T_VARIABLE T_NULLSAFE_OBJECT_OPERATOR T_STRING))
 (puthash
- 472
+ 552
  (lambda(args _terminals)
-   (substring args 1 -1))
+   `(
+     ast-type
+     encaps-var-variable-nullsafe-property
+     variable
+     ,(nth 0 args)
+     property
+     ,(nth 2 args)))
  phps-mode-parser--table-translations)
 
-;; scalar -> (T_LNUMBER)
+;; 553 ((encaps_var) (T_DOLLAR_OPEN_CURLY_BRACES expr "}"))
 (puthash
- 474
+ 553
  (lambda(args _terminals)
-   (string-to-number args))
+   `(
+     ast-type
+     encaps-var-braces-expr
+     expr
+     ,(nth 1 args)))
  phps-mode-parser--table-translations)
 
-;; scalar -> (T_DNUMBER)
+;; 554 ((encaps_var) (T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME "}"))
 (puthash
- 475
+ 554
  (lambda(args _terminals)
-   (string-to-number args))
+   `(
+     ast-type
+     encaps-var-braces-string-varname
+     string-varname
+     ,(nth 1 args)))
  phps-mode-parser--table-translations)
 
-;; callable_variable -> (array_object_dereferenceable "[" optional_expr "]")
+;; 555 ((encaps_var) (T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME "[" expr "]" 
"}"))
 (puthash
- 506
+ 555
  (lambda(args _terminals)
    `(
      ast-type
-     callable-variable
-     array-object-dereferencable
-     array-index
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args))
-     ))
+     encaps-var-braces-string-varname-indexed-expr
+     string-varname
+     ,(nth 1 args)
+     indexed-expr
+     ,(nth 3 args)))
  phps-mode-parser--table-translations)
 
-;; callable_variable -> (array_object_dereferenceable "{" expr "}")
+;; 556 ((encaps_var) (T_CURLY_OPEN variable "}"))
 (puthash
- 507
+ 556
  (lambda(args _terminals)
    `(
      ast-type
-     callable-variable
-     array-object-dereferencable
-     expr
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args))
-     ))
+     encaps-var-curly-open-variable
+     variable
+     ,(nth 1 args)))
  phps-mode-parser--table-translations)
 
-;; callable_variable -> (array_object_dereferencable T_OBJECT_OPERATOR 
property_name argument_list)
+;; 557 ((encaps_var_offset) (T_STRING))
 (puthash
- 508
+ 557
  (lambda(args _terminals)
    `(
      ast-type
-     callable-variable
-     array-object-dereferencable
-     ,(nth 0 args)
-     operator
-     object-operator
-     property-name
-     ,(nth 2 args)
-     argument-list
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 3 args))
-     ))
+     encaps-var-offset-string
+     string
+     ,args))
  phps-mode-parser--table-translations)
 
-;; callable_variable -> (array_object_dereferenceable 
T_NULLSAFE_OBJECT_OPERATOR property_name argument_list)
+;; 558 ((encaps_var_offset) (T_NUM_STRING))
 (puthash
- 509
+ 558
  (lambda(args _terminals)
    `(
      ast-type
-     callable-variable
-     array-object-dereferencable
-     ,(nth 0 args)
-     operator
-     nullsafe-object-operator
-     property-name
-     ,(nth 2 args)
-     argument-list
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 3 args))
-     ))
+     encaps-var-offset-num-string
+     num-string
+     ,args))
  phps-mode-parser--table-translations)
 
-;; variable -> (array_object_dereferencable T_OBJECT_OPERATOR property_name)
+;; 559 ((encaps_var_offset) ("-" T_NUM_STRING))
 (puthash
- 513
- (lambda(args terminals)
+ 559
+ (lambda(args _terminals)
    `(
      ast-type
-     variable
-     array-object-dereferencable
-     ,(nth 0 args)
-     operator
-     object-operator
-     property-name
-     ,(nth 2 args)
-     property-start
-     ,(car (cdr (nth 2 terminals)))
-     property-end
-     ,(cdr (cdr (nth 2 terminals)))
-     ))
+     encaps-var-offset-negative-num-string
+     num-string
+     ,(nth 1 args)))
  phps-mode-parser--table-translations)
 
-;; variable -> (array_object_dereferenceable T_NULLSAFE_OBJECT_OPERATOR 
property_name)
+;; 560 ((encaps_var_offset) (T_VARIABLE))
 (puthash
- 514
- (lambda(args terminals)
+ 560
+ (lambda(args _terminals)
    `(
      ast-type
+     encaps-var-offset-variable
      variable
-     array-object-dereferencable
-     ,(nth 0 args)
-     operator
-     nullsafe-object-operator
-     property-name
-     ,(nth 2 args)
-     property-start
-     ,(car (cdr (nth 2 terminals)))
-     property-end
-     ,(cdr (cdr (nth 2 terminals)))
-     ))
+     ,args))
  phps-mode-parser--table-translations)
 
-;; simple_variable -> (T_VARIABLE)
+;; 561 ((internal_functions_in_yacc) (T_ISSET "(" isset_variables 
possible_comma ")"))
 (puthash
- 515
+ 561
  (lambda(args terminals)
+   (when phps-mode-parser-sdt--bookkeeping-symbol-stack
+     (let ((isset-start (car (cdr (nth 1 terminals))))
+           (isset-end (cdr (cdr (nth 4 terminals)))))
+       (dolist (item phps-mode-parser-sdt--bookkeeping-symbol-stack)
+         (let ((item-start (nth 2 item))
+               (item-end (nth 3 item)))
+           (when (and
+                  (> item-start isset-start)
+                  (< item-end isset-end))
+             (push
+              (list
+               (nth 0 item)
+               phps-mode-parser-sdt--bookkeeping-namespace
+               item-start
+               item-end)
+             phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack))))))
    `(
      ast-type
-     simple-variable
-     name
-     ,args
-     start
-     ,(car (cdr terminals))
-     end
-     ,(cdr (cdr terminals))
-     ))
+     internal-isset
+     isset-variables
+     ,(nth 2 args)))
  phps-mode-parser--table-translations)
 
-;; static_member -> (class_name T_PAAMAYIM_NEKUDOTAYIM simple_variable)
+;; 562 ((internal_functions_in_yacc) (T_EMPTY "(" expr ")"))
 (puthash
- 518
+ 562
  (lambda(args terminals)
+   (when phps-mode-parser-sdt--bookkeeping-symbol-stack
+     (let ((empty-start (car (cdr (nth 1 terminals))))
+           (empty-end (cdr (cdr (nth 3 terminals)))))
+       (dolist (item phps-mode-parser-sdt--bookkeeping-symbol-stack)
+         (let ((item-start (nth 2 item))
+               (item-end (nth 3 item)))
+           (when (and
+                  (> item-start empty-start)
+                  (< item-end empty-end))
+             (push
+              (list
+               (nth 0 item)
+               phps-mode-parser-sdt--bookkeeping-namespace
+               item-start
+               item-end)
+              phps-mode-parser-sdt--bookkeeping-symbol-assignment-stack))))))
    `(
      ast-type
-     static-member
-     class
-     ,(nth 0 args)
-     member
-     ,(nth 2 args)
-     start
-     ,(car (cdr (nth 0 terminals)))
-     end
-     ,(cdr (cdr (nth 0 terminals)))
-     ))
+     internal-empty-expr
+     expr
+     ,(nth 2 args)))
  phps-mode-parser--table-translations)
 
-;; static_member -> (variable_class_name T_PAAMAYIM_NEKUDOTAYIM 
simple_variable)
+;; 563 ((internal_functions_in_yacc) (T_INCLUDE expr))
 (puthash
- 519
- (lambda(args terminals)
+ 563
+ (lambda(args _terminals)
    `(
      ast-type
-     static-member
-     variable-class-name
-     ,(nth 0 args)
-     member
-     ,(nth 2 args)
-     start
-     ,(car (cdr (nth 0 terminals)))
-     end
-     ,(cdr (cdr (nth 0 terminals)))
-     ))
+     internal-include-expr
+     expr
+     ,(nth 1 args)))
  phps-mode-parser--table-translations)
 
-;; non_empty_array_pair_list -> (non_empty_array_pair_list "," 
possible_array_pair)
+;; 564 ((internal_functions_in_yacc) (T_INCLUDE_ONCE expr))
 (puthash
- 536
+ 564
  (lambda(args _terminals)
-   (if (nth 2 args)
-       (append (nth 0 args) (list (nth 2 args)))
-     (nth 0 args)))
+   `(
+     ast-type
+     internal-include-once
+     expr
+     ,(nth 1 args)))
  phps-mode-parser--table-translations)
 
-;; non_empty_array_pair_list -> (possible_array_pair)
+;; 565 ((internal_functions_in_yacc) (T_EVAL "(" expr ")"))
 (puthash
- 537
+ 565
  (lambda(args _terminals)
-   (list args))
+   `(
+     ast-type
+     internal-eval
+     expr
+     ,(nth 2 args)))
  phps-mode-parser--table-translations)
 
-;; internal_functions_in_yacc -> (T_ISSET "(" isset_variables possible_comma 
")")
+;; 566 ((internal_functions_in_yacc) (T_REQUIRE expr))
 (puthash
- 561
+ 566
  (lambda(args _terminals)
    `(
      ast-type
-     isset-variables
-     variables
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args))
-     ))
+     internal-require
+     expr
+     ,(nth 1 args)))
  phps-mode-parser--table-translations)
 
-;; internal_functions_in_yacc -> (T_EMPTY "(" expr ")")
+;; 567 ((internal_functions_in_yacc) (T_REQUIRE_ONCE expr))
 (puthash
- 562
+ 567
  (lambda(args _terminals)
    `(
      ast-type
-     empty-expression
-     variables
-     ,(phps-mode-parser-sdt--get-list-of-object (nth 2 args))
-     ))
+     internal-require-once
+     expr
+     ,(nth 1 args)))
  phps-mode-parser--table-translations)
 
-;; isset_variables -> (isset_variable)
+;; 568 ((isset_variables) (isset_variable))
 (puthash
  568
  (lambda(args _terminals)
-   args)
+   (list args))
  phps-mode-parser--table-translations)
 
-;; isset_variables -> (isset_variables "," isset_variable)
+;; 569 ((isset_variables) (isset_variables "," isset_variable))
 (puthash
  569
  (lambda(args _terminals)
    (append (nth 0 args) (nth 2 args)))
  phps-mode-parser--table-translations)
 
-;; isset_variable -> (expr)
+;; 570 ((isset_variable) (expr))
 (puthash
  570
  (lambda(args _terminals)
-   (list args))
+   args)
  phps-mode-parser--table-translations)
 
 (provide 'phps-mode-parser-sdt)
diff --git a/phps-mode-test.el b/phps-mode-test.el
index 075eb25086..7ce2034e6d 100644
--- a/phps-mode-test.el
+++ b/phps-mode-test.el
@@ -180,7 +180,12 @@ Each element is a list: (list key value), optionally 
UN-SORTED."
            hash-table)
           (if un-sorted
               (nreverse result)
-            (sort (nreverse result) (lambda (a b) (< (car a) (car b))))))
+            (sort
+             (nreverse result)
+             (lambda (a b)
+               (if (listp (car a))
+                   (< (car (car a)) (car (car b)))
+                 (< (car a) (car b)))))))
       nil)))
 
 (transient-mark-mode t)
diff --git a/test/phps-mode-test-ast.el b/test/phps-mode-test-ast.el
index e03ddf8703..48d1cbdc69 100644
--- a/test/phps-mode-test-ast.el
+++ b/test/phps-mode-test-ast.el
@@ -14,69 +14,69 @@
 (require 'ert)
 (require 'phps-mode)
 (require 'phps-mode-ast)
-(require 'phps-mode-ast-bookkeeping)
-(require 'phps-mode-ast-imenu)
 (require 'phps-mode-lex-analyzer)
 (require 'phps-mode-test)
 
-(defun phps-mode-test-ast--should-bookkeep (buffer-contents name bookkeeping)
+(defun phps-mode-test-ast--should-bookkeep
+    (buffer-contents name expected-bookkeeping &optional expected-imenu)
   (phps-mode-test-ast--buffer-contents
    buffer-contents
    name
    (lambda()
-      (let ((parse (phps-mode-parser-parse)))
-        (message "Left-to-right with right-most derivation:\n%S\n" parse)
-        (dolist (production-number (reverse parse))
-          (let ((production
-                 (phps-mode-parser--get-grammar-production-by-number
-                  production-number)))
-            (message
-             "%d: %S -> %S"
-             production-number
-             (car (car production))
-             (car (cdr production))))))
-      (message "\n")
-      (phps-mode-ast--generate)
-      (phps-mode-ast-bookkeeping--generate)
-      ;; (message
-      ;;  "expected-bookkeeping:\n%S\n"
-      ;;  bookkeeping)
-      ;; (message
-      ;;  "actual-bookkeeping:\n%S\n"
-      ;;  (phps-mode-test--hash-to-list
-      ;;   phps-mode-ast-bookkeeping--index
-      ;;   t))
-      (should
-       (equal
+     (let ((parse (phps-mode-parser-parse)))
+       (message "Left-to-right with right-most derivation:\n%S\n" parse)
+       (dolist (production-number parse)
+         (let ((production
+                (phps-mode-parser--get-grammar-production-by-number
+                 production-number)))
+           (message
+            "%d: %S -> %S"
+            production-number
+            (car (car production))
+            (car (cdr production))))))
+     (message "\n")
+     (phps-mode-ast--generate)
+
+     ;; (message "symbol-table: \n%S\n"
+     ;;          (phps-mode-test--hash-to-list
+     ;;           phps-mode-parser-sdt-symbol-table))
+     ;; (message "phps-mode-parser-sdt-symbol-table-by-uri: \n%S\n" 
phps-mode-parser-sdt-symbol-table-by-uri)
+
+     (unless (equal
+              (phps-mode-test--hash-to-list
+               phps-mode-parser-sdt-bookkeeping)
+              expected-bookkeeping)
+       (message
+        "expected-bookkeeping:\n%S\n"
+        expected-bookkeeping)
+       (message
+        "actual-bookkeeping:\n%S\n"
         (phps-mode-test--hash-to-list
-         phps-mode-ast-bookkeeping--index
-         t)
-        bookkeeping)))))
-
-(defun phps-mode-test-ast--should-imenu (buffer-contents name imenu)
-  (phps-mode-test-ast--buffer-contents
-   buffer-contents
-   name
-   (lambda()
-      (let ((parse (phps-mode-parser-parse)))
-        (message "Left-to-right with right-most derivation:\n%S\n" parse)
-        (dolist (production-number (reverse parse))
-          (let ((production
-                 (phps-mode-parser--get-grammar-production-by-number
-                  production-number)))
-            (message
-             "%d: %S -> %S"
-             production-number
-             (car (car production))
-             (car (cdr production))))))
-      (message "\n")
-      (phps-mode-ast--generate)
-      (phps-mode-ast-imenu--generate)
-      (message "imenu: %S" phps-mode-ast-imenu--index)
-      (should
-       (equal
-        phps-mode-ast-imenu--index
-        imenu)))))
+         phps-mode-parser-sdt-bookkeeping)))
+
+     (should
+      (equal
+       (phps-mode-test--hash-to-list
+        phps-mode-parser-sdt-bookkeeping)
+       expected-bookkeeping))
+
+     (when expected-imenu
+       (unless
+           (equal
+            phps-mode-parser-sdt-symbol-imenu
+            expected-imenu)
+         (message "phps-mode-parser-sdt-symbol-imenu--table: %S" 
phps-mode-parser-sdt-symbol-imenu--table)
+         (message
+          "expected-imenu:\n%S\n"
+          expected-imenu)
+         (message
+          "actual-imenu:\n%S\n"
+          phps-mode-parser-sdt-symbol-imenu))
+
+       (should
+        (equal
+         phps-mode-parser-sdt-symbol-imenu
+         expected-imenu))))))
 
 (defun phps-mode-test-ast--buffer-contents (buffer-contents name logic)
   (with-temp-buffer
@@ -127,259 +127,234 @@
     (funcall logic)
     (message "Passed test for %S\n" name)))
 
-(defun phps-mode-test-ast-imenu ()
-  "Run test for imenu generation."
-  (message "-- Running tests for imenu generation... --\n")
-
-  (phps-mode-test-ast--should-imenu
-   "<?php\nclass myClass\n{\n\n    public function myFunction1()\n    {\n      
  echo \"my string with variable {$variable} inside it\";\n    }\n\n    public 
function myFunction2()\n    {\n    }\n\n}"
-   "Imenu generated via parser SDT for simple class"
-   '(("myClass" ("myFunction1" . 44) ("myFunction2" . 153))))
-
-  (phps-mode-test-ast--should-imenu
-   "<?php\ninterface myInterface {\n    public function myFunctionA() {}\n    
protected function myFunctionB() {}\n}\n"
-   "Imenu generated via parser SDT for interface"
-   '(("myInterface" . (("myFunctionA" . 51) ("myFunctionB" . 91)))))
-
-  (phps-mode-test-ast--should-imenu
-   "<?php\nfunction myFunctionA() {}\nfunction myFunctionB() {}\n$var = 
function () {\n    echo 'here';\n};"
-   "Imenu generated via parser SDT for function-oriented file without 
namespace"
-   '(("myFunctionA" . 16) ("myFunctionB" . 42)))
-
-  (phps-mode-test-ast--should-imenu
-   "<?php\n\nnamespace MyNamespace;\n\nfunction aFunction() {\n    /**\n     * 
With some contents\n     */\n}\n\nclass MyClass\n{\n\n    /**\n     *\n     
*/\n    public function __construct()\n    {\n        if ($test) {\n        }\n 
   }\n\n    /**\n     *\n     */\n    public function myFunction1()\n    {\n    
    $this->addMessage(\"My random {$message} here\" . ($random > 1 ? \"A\" : 
\"\") . \" was here.\");\n    }\n    \n    /**\n     *\n     */\n    public 
function myFunction2()\n [...]
-   "Passed imenu-generation via parser AST for basic object oriented file"
-   '(("MyNamespace" ("aFunction" . 41) ("MyClass" ("__construct" . 160) 
("myFunction1" . 261) ("myFunction2" . 433) ("myFunction3" . 513) 
("myFunction4" . 583)))))
-
-  (phps-mode-test-ast--should-imenu
-   "<?php\n\nnamespace MyNamespaceA\n{\n    function aFunctionA() {\n        
/**\n         * With some contents\n         */\n    }\n    class MyClass\n    
{\n\n        /**\n         *\n         */\n        public function 
__construct()\n        {\n            if ($test) {\n            }\n        
}\n\n        /**\n         *\n         */\n        public function 
myFunction1()\n        {\n            $this->addMessage(\"My random {$message} 
here\" . ($random > 1 ? \"A\" : \"\") . \" was h [...]
-   "Passed imenu-generation via parser AST for advanced object oriented file"
-   '(("MyNamespaceA" ("aFunctionA" . 46) ("MyClass" ("__construct" . 205) 
("myFunction1" . 338) ("myFunction2" . 542) ("myFunction3" . 646) 
("myFunction4" . 740))) ("aFunctionB" . 807) ("MyClass" ("__construct" . 925) 
("myFunction1" . 1058) ("myFunction2" . 1262) ("myFunction3" . 1366) 
("myFunction4" . 1460))))
-
-  (phps-mode-test-ast--should-imenu
-   "<?php\nnamespace myNamespace {\n    class myClass extends myAbstract {\n   
     public function myFunctionA() {}\n        protected function myFunctionB() 
{}\n    }\n}\n"
-   "Imenu object-oriented file with namespace, class that extends and 
functions"
-   '(("myNamespace" ("myClass" ("myFunctionA" . 94) ("myFunctionB" . 138)))))
-
-  (phps-mode-test-ast--should-imenu
-   "<?php\nnamespace myNamespace;\nclass myClass extends myAbstract implements 
myInterface {\n    public function myFunctionA() {}\n    protected function 
myFunctionB() {}\n}\n"
-   "Imenu object-oriented file with bracket-less namespace, class that extends 
and implements and functions"
-   '(("myNamespace" ("myClass" ("myFunctionA" . 108) ("myFunctionB" . 148)))))
-
-  (phps-mode-test-ast--should-imenu
-   "<?php\nclass myClass {}"
-   "Imenu empty class"
-   '(("myClass" . 13)))
-
-  (phps-mode-test-ast--should-imenu
-   "<?php\nnamespace myNamespace {}"
-   "Imenu empty bracketed namespace"
-   '(("myNamespace" . 17)))
-
-  (phps-mode-test-ast--should-imenu
-   "<?php\nnamespace myNamespace;"
-   "Imenu empty namespace without brackets"
-   '(("myNamespace" . 17)))
-
-  (phps-mode-test-ast--should-imenu
-   "<?php\nnamespace myNamespace;\nclass myClass extends myAbstract implements 
myInterface {\n    public function myFunctionA($myArg = null) {}\n    protected 
function myFunctionB($myArg = 'abc') {}\n}\n"
-   "Imenu object-oriented file with bracket-less namespace, class that extends 
and implements and functions with optional arguments"
-   '(("myNamespace" ("myClass" ("myFunctionA" . 108) ("myFunctionB" . 161)))))
-
-  (phps-mode-test-ast--should-imenu
-   "<?php\nnamespace myNamespace\\myNamespace2;\nclass myClass extends 
myAbstract implements myInterface {\n    public function myFunctionA($myArg = 
null) {}\n    protected function myFunctionB($myArg = 'abc') {}\n}\n"
-   "Imenu object-oriented file with bracket-less namespace with multiple 
levels, class that extends and implements and functions with optional arguments"
-   '(("myNamespace\\myNamespace2" ("myClass" ("myFunctionA" . 121) 
("myFunctionB" . 174)))))
-
-  (phps-mode-test-ast--should-imenu
-   "<?php\nnamespace {}"
-   "Imenu empty unnamed bracketed namespace"
-   nil)
-
-  ;; TODO Make this test pass
-  ;; (phps-mode-test-ast--should-imenu
-  ;;  "<?php\n\nnamespace myNamespace;\n\nif (!function_exists('myFunction')) 
{\n    function myFunction() {\n        if (!class_exists('myClassA')) {\n      
      class myClassA {\n                public function myMethodA()\n           
     {\n                    \n                }\n            }\n        }\n    
}\n}\n\nif (!class_exists('myClassB')) {\n    class myClassB\n    {\n        
function myMethodB()\n        {\n        }\n    }\n}"
-  ;;  "Imenu for conditionally declared function and class"
-  ;;  '(("myNamespace" ("myFunction" . 183) ("myClassA" ("myMethodA" . 200)) 
("myClassB" . ("myMethodB" . 377)))))
-
-  (message "\n-- Ran tests for imenu generation. --"))
-
 (defun phps-mode-test-ast-bookkeeping ()
   "Run test for bookkeeping generation."
   (message "-- Running tests for bookkeeping generation... --\n")
 
+  ;; TODO v2 Should have more delicate handling of isset, !empty condition 
blocks
+  ;; TODO v2 bookkeep and include constants in imenu
+  ;; TODO v2 imenu should contain redeclaration of variables
+
   (phps-mode-test-ast--should-bookkeep
    "<?php\n\n$var = 'abc';\n\nif ($var2) {\n    echo 'This never 
happens';\n}\nif ($var) {\n    echo 'This happens';\n}"
    "Bookkeeping in root level variable assignments #1"
-   '((" id $var" 1) ((8 12) 1) ((27 32) 0) ((73 77) 1)))
+   '(((8 12) 1) ((27 32) 0) ((73 77) 1))
+   '(("$var" . 8)))
 
   (phps-mode-test-ast--should-bookkeep
    "<?php\n\n$var = 'abc';\n\nif ($var) {\n    echo 'This never 
happens';\n}\nif ($var2) {\n    echo 'This happens';\n}"
    "Bookkeeping in root level variable assignments #2"
-   '((" id $var" 1) ((8 12) 1) ((27 31) 1) ((72 77) 0)))
+   '(((8 12) 1) ((27 31) 1) ((72 77) 0))
+   '(("$var" . 8)))
 
   (phps-mode-test-ast--should-bookkeep
    "<?php\n\n$var2 = 4;\n\nfunction myFunction($var)\n{\n    $var3 = 3;\n    
if ($var) {\n        echo 'Hit';\n    }\n    if ($var2) {\n        echo 
'Miss';\n    }\n    if ($var3) {\n        echo 'Hit';\n    }\n}\n\nfunction 
myFunction2($abc)\n{\n    if ($var) {\n        echo 'Miss';\n    }\n    if 
($abc) {\n        echo 'Hit';\n    }\n}\n\nif ($var) {\n    echo 'Miss';\n}\nif 
($var2) {\n    echo 'Hit';\n}"
    "Bookkeeping in function level with variable assignments"
-   '((" id $var2" 1) ((8 13) 1) (" function myFunction id $var" 1) ((40 44) 1) 
(" function myFunction id $var3" 1) ((52 57) 1) ((71 75) 1) ((113 118) 0) ((157 
162) 1) (" function myFunction2 id $abc" 1) ((216 220) 1) ((232 236) 0) ((275 
279) 1) ((316 320) 0) ((347 352) 1)))
+   '(((8 13) 1) ((40 44) 3) ((52 57) 2) ((71 75) 3) ((113 118) 0) ((157 162) 
2) ((216 220) 4) ((232 236) 0) ((275 279) 4) ((316 320) 0) ((347 352) 1))
+   '(("$var2" . 8) ("function myFunction" ("declaration" . 29) ("$var" . 40) 
("$var3" . 52)) ("function myFunction2" ("declaration" . 204) ("$abc" . 216))))
 
   (phps-mode-test-ast--should-bookkeep
    "<?php\n\n// Super-globals\n\nif ($_GET) {\n    echo 'Hit';\n}\nif ($_POST) 
{\n    echo 'Hit';\n}\nif ($_COOKIE) {\n    echo 'Hit';\n}\nif ($_SESSION) {\n  
  echo 'Hit';\n}\nif ($_REQUEST) {\n    echo 'Hit';\n}\nif ($GLOBALS) {\n    
echo 'Hit';\n}\nif ($_SERVER) {\n    echo 'Hit';\n}\nif ($_FILES) {\n    echo 
'Hit';\n}\nif ($_ENV) {\n    echo 'Hit';\n}\nif ($argc) {\n    echo 
'Hit';\n}\nif ($argv) {\n    echo 'Hit';\n}\nif ($http_​response_​header) {\n   
 echo 'Hit';\n}"
    "Bookkeeping of super-globals"
-   '(((30 35) 1) ((61 67) 1) ((93 101) 1) ((127 136) 1) ((162 171) 1) ((197 
205) 1) ((231 239) 1) ((265 272) 1) ((298 303) 1) ((329 334) 1) ((360 365) 1) 
((391 414) 1)))
+   '(((30 35) -1) ((61 67) -1) ((93 101) -1) ((127 136) -1) ((162 171) -1) 
((197 205) -1) ((231 239) -1) ((265 272) -1) ((298 303) -1) ((329 334) -1) 
((360 365) -1) ((391 414) -1)))
 
   (phps-mode-test-ast--should-bookkeep
-   "<?php\n\nnamespace myNamespaceA {\n    $var = 123;\n    class myClassA {\n 
       private $var2 = 123;\n        function myFunctionA($var3) {\n            
$var4 = 123;\n            if ($var) {\n                echo 'Miss';\n           
 }\n            if ($var2) {\n                echo 'Miss';\n            }\n     
       if ($var3) {\n                echo 'Hit';\n            }\n            if 
($var4) {\n                echo 'Hit';\n            }\n        }\n\n        
function myFuncti [...]
+   "<?php\n\nnamespace myNamespaceA {\n    $var = 123;\n    class myClassA {\n 
       private $var2 = 123;\n        public static function myFunctionA($var3) 
{\n            $var4 = 123;\n            if ($var) {\n                echo 
'Miss';\n            }\n            if ($var2) {\n                echo 
'Miss';\n            }\n            if ($var3) {\n                echo 'Hit';\n 
           }\n            if ($var4) {\n                echo 'Hit';\n           
 }\n        }\n\n        fun [...]
    "Bookkeeping in maximum level with namespaces, classes and functions."
-   '((" id $var" 1) ((37 41) 1) (" namespace myNamespaceA class myClassA id 
$var2" 1) ((86 91) 1) (" namespace myNamespaceA class myClassA function 
myFunctionA id $this" 1) (" namespace myNamespaceA class myClassA function 
myFunctionA id $var3" 1) ((128 133) 1) (" namespace myNamespaceA class myClassA 
function myFunctionA id $var4" 1) ((149 154) 1) ((178 182) 0) ((245 250) 0) 
((313 318) 1) ((380 385) 1) (" namespace myNamespaceA class myClassA function 
myFunctionB id $this" 1) (" namespa [...]
+   '(((37 41) 1) ((86 91) 2) ((142 147) 4) ((163 168) 3) ((192 196) 0) ((259 
264) 0) ((327 332) 4) ((394 399) 3) ((485 490) 7) ((514 519) 5) ((543 547) 0) 
((610 615) 0) ((678 683) 0) ((746 751) 0) ((814 819) 7) ((881 886) 5) ((957 
961) 1) ((999 1004) 0) ((1043 1048) 0) ((1087 1092) 0) ((1131 1136) 0) ((1175 
1180) 0) ((1243 1248) 8) ((1293 1298) 9) ((1335 1341) 12) ((1357 1362) 10) 
((1386 1390) 0) ((1453 1458) 0) ((1521 1526) 0) ((1589 1594) 0) ((1657 1662) 0) 
((1725 1730) 0) ((1793 1798) [...]
+   '(("namespace myNamespaceA" ("declaration" . 18) ("$var" . 37) ("class 
myClassA" ("declaration" . 59) ("$var2" . 86) ("function myFunctionA" 
("declaration" . 149) ("$var3" . 142) ("$var4" . 163)) ("function myFunctionB" 
("declaration" . 500) ("$var5" . 485) ("$var6" . 514)))) ("namespace 
myNamespaceB" ("declaration" . 1224) ("$var7" . 1243) ("class myClassB" 
("declaration" . 1266) ("$var8" . 1293) ("function myFunctionA" ("declaration" 
. 1343) ("$var10" . 1335) ("$var9" . 1357)) ("fun [...]
 
   (phps-mode-test-ast--should-bookkeep
    "<?php\n\n// Conditional assignments\n\n$items = array(1, 2, 3);\nforeach 
($items as $item) {\n    if ($item) {\n        echo 'Hit';\n    }\n}\nforeach 
($items as $key => $value) {\n    if ($key || $value) {\n        echo 'Hit';\n  
  }\n}\nfor ($i = 0; $i < count($items); $i++) {\n    if ($i) {\n        echo 
'Hit';\n    }\n}\nif ($a = 123) {\n    if ($a) {\n        echo 'Hit';\n    
}\n}\nwhile ($b = 123) {\n    if ($a) {\n        echo 'Hit';\n    }\n}\ndo {\n  
  echo 'Hit';\n} while ( [...]
    "Bookkeeping of conditional assignments"
-   '((" id $items" 1) ((36 42) 1) ((70 76) 1) (" id $item" 1) ((80 85) 1) ((97 
102) 1) ((143 149) 1) (" id $key" 1) ((153 157) 1) (" id $value" 1) ((161 167) 
1) ((179 183) 1) ((187 193) 1) (" id $i" 1) ((230 232) 1) ((238 240) 1) ((249 
255) 1) ((258 260) 1) ((274 276) 1) (" id $a" 1) ((312 314) 1) ((332 334) 1) (" 
id $b" 1) ((373 375) 1) ((393 395) 1) (" id $c" 1) ((457 459) 1)))
+   '(((36 42) 1) ((70 76) 1) ((80 85) 2) ((97 102) 2) ((143 149) 1) ((153 157) 
3) ((161 167) 4) ((179 183) 3) ((187 193) 4) ((230 232) 5) ((238 240) 5) ((249 
255) 1) ((258 260) 5) ((274 276) 5) ((312 314) 6) ((332 334) 6) ((373 375) 7) 
((393 395) 6) ((457 459) 8))
+   '(("$items" . 36) ("$item" . 80) ("$key" . 153) ("$value" . 161) ("$i" . 
230) ("$a" . 312) ("$b" . 373) ("$c" . 457)))
 
   (phps-mode-test-ast--should-bookkeep
-   "<?php\n\n// Class properties\n\nclass myParent {}\n\nclass myClass extends 
myParent {\n    private $var1 = 123;\n    protected static $var2;\n    public 
$var3;\n    var $var4;\n    function __construct() {\n        if ($this) {\n    
        echo 'Hit';\n        }\n        if ($this->var1) {\n            echo 
'Hit';\n        }\n        if (self::$var1) {\n            echo 'Miss';\n       
 }\n        if (self::$var2) {\n            echo 'Hit';\n        }\n        if 
($this->var3) {\n   [...]
+   "<?php\n\n// Class properties\n\nclass myParent {}\n\nclass myClass extends 
myParent {\n    private $var1 = 123;\n    protected static $var2;\n    public 
$var3;\n    var $var4;\n    function __construct() {\n        if ($this) {\n    
        echo 'Hit';\n        }\n        if ($this->var1) {\n            echo 
'Hit';\n        }\n        if (self::$var1) {\n            echo 'Miss';\n       
 }\n        if (self::$var2) {\n            echo 'Hit';\n        }\n        if 
(static::$var2) {\n [...]
    "Bookkeeping of class properties"
-   '((" class myClass id $var1" 1) ((93 98) 1) (" class myClass static id 
$var2" 1) ((127 132) 1) (" class myClass id $var3" 1) ((145 150) 1) (" class 
myClass id $var4" 1) ((160 165) 1) (" class myClass function __construct id 
$this" 1) ((208 213) 1) ((263 268) 1) ((270 274) 1) ((330 335) 0) ((392 397) 1) 
((447 452) 1) ((454 458) 1) ((508 513) 1) ((515 519) 1) ((569 574) 1) ((576 
580) 0) ((688 693) 0)))
+   '(((93 98) 1) ((127 132) 2) ((145 150) 3) ((160 165) 4) ((208 213) 5) ((263 
268) 5) ((270 274) 1) ((330 335) 0) ((392 397) 2) ((455 460) 2) ((510 515) 5) 
((517 521) 3) ((571 576) 5) ((578 582) 4) ((632 637) 5) ((639 643) 0) ((751 
756) 0))
+   '(("class myParent" ("declaration" . 35)) ("class myClass" ("declaration" . 
54) ("$var1" . 93) ("$var2" . 127) ("$var3" . 145) ("$var4" . 160) ("function 
__construct" ("declaration" . 194)))))
 
   (phps-mode-test-ast--should-bookkeep
    "<?php\n\ntry {\n    \n} catch (\\Exception $e) {\n    if ($e) {\n        
echo 'Hit';\n    }\n}\n\nif ($e) {\n    echo 'Miss';\n}\n"
    "Bookkeeping of try catch variable assignment"
-   '((" id $e" 1) ((39 41) 1) ((53 55) 1) ((92 94) 1)))
+   '(((39 41) 1) ((53 55) 1) ((92 94) 1))
+   '(("$e" . 39)))
 
   (phps-mode-test-ast--should-bookkeep
-   "<?php\n\n$example = function ($test) {\n    if ($test) {\n        echo 
'Hit';\n    }\n    if ($example) {\n        echo 'Miss';\n    }\n};\n$example2 
= function ($test2) use ($example) {\n    if ($test2) {\n        echo 'Hit';\n  
  }\n    if ($example) {\n        echo 'Hit';\n    }\n    if ($example2) {\n    
    echo 'Miss';\n    }\n    if ($example3) {\n        echo 'Miss';\n    
}\n};\nif ($test) {\n    echo 'Miss';\n}\nif ($test2) {\n    echo 'Miss';\n}"
-   "Bookkeeping of anonymous function variable assignments"
-   '((" id $example" 1) ((8 16) 1) (" anonymous function 1 id $test" 1) ((29 
34) 1) ((46 51) 1) ((89 97) 0) (" id $example2" 1) ((131 140) 1) (" anonymous 
function 2 id $test2" 1) ((153 159) 1) (" anonymous function 2 id $example" 1) 
((166 174) 1) ((186 192) 1) ((230 238) 1) ((276 285) 0) ((324 333) 0) ((371 
376) 0) ((403 409) 0)))
+   "<?php\n\n$example = function ($test) {\n    if ($test) {\n        echo 
'Hit';\n    }\n    if ($example) {\n        echo 'Miss';\n    }\n};\n$example2 
= function ($test2) use ($example) {\n    if ($test2) {\n        echo 'Hit';\n  
  }\n    if ($example) {\n        echo 'Hit';\n    }\n    if ($example2) {\n    
    echo 'Miss';\n    }\n    if ($example3) {\n        echo 'Miss';\n    
}\n};\n$example3 = function ($test3) use ($example4) {\n    if ($test3) {\n     
   echo 'Hit';\n    }\n   [...]
+   "Bookkeeping of anonymous function variable assignments and lexical vars"
+   '(((8 16) 2) ((29 34) 1) ((46 51) 1) ((89 97) 0) ((131 140) 5) ((153 159) 
3) ((166 174) 2) ((186 192) 3) ((230 238) 4) ((276 285) 0) ((324 333) 0) ((367 
376) 8) ((389 395) 6) ((402 411) 0) ((423 429) 6) ((467 476) 7) ((513 518) 0) 
((545 551) 0))
+   '(("$example" . 8) ("$test" . 29) ("$example2" . 131) ("$test2" . 153) 
("$example3" . 367) ("$test3" . 389) ("$example4" . 402)))
 
   (phps-mode-test-ast--should-bookkeep
-   "<?php\nclass myClass {\n    function random() {}\n    function 
__construct()\n    {\n        $this->random();\n        $this->random['abc'] = 
123;\n    }\n}"
+   "<?php\nfinal class myClass {\n    function random() {}\n    function 
__construct()\n    {\n        $this->random();\n        $this->random['abc'] = 
123;\n    }\n}"
    "Method calls should be avoided in bookkeeping"
-   '((" class myClass function random id $this" 1) (" class myClass function 
__construct id $this" 1)))
+   '(((95 100) 2) ((120 125) 2) ((127 133) 0))
+   '(("class myClass" ("declaration" . 19) ("function random" ("declaration" . 
51)) ("function __construct" ("declaration" . 85)))))
 
   (phps-mode-test-ast--should-bookkeep
    "<?php\n$items = array(1, 2, 3);\nforeach ($items as &$item) {\n    if 
($item) {\n        echo 'Hit';\n    }\n}\nforeach ($items as $key => &$item2) 
{\n    if ($item) {\n        echo 'Hit';\n    }\n}"
    "Bookkeeping of foreach reference variable declaration"
-   '((" id $items" 1) ((7 13) 1) ((41 47) 1) (" id $item" 1) ((52 57) 1) ((69 
74) 1) ((115 121) 1) (" id $key" 1) ((125 129) 1) (" id $item2" 1) ((134 140) 
1) ((152 157) 1)))
+   '(((7 13) 1) ((41 47) 1) ((52 57) 2) ((69 74) 2) ((115 121) 1) ((125 129) 
3) ((134 140) 4) ((152 157) 2))
+   '(("$items" . 7) ("$item" . 52) ("$key" . 125) ("$item2" . 134)))
 
   (phps-mode-test-ast--should-bookkeep
    "<?php\n\n[$random, $bandom] = myValues();\nif ($random) {\n    echo 
'Hit';\n}\nif ($bandom) {\n    echo 'Hit';\n}\n"
    "Bookkeeping of variable declarations in array"
-   '((" id $random" 1) ((9 16) 1) (" id $bandom" 1) ((18 25) 1) ((45 52) 1) 
((78 85) 1)))
+   '(((9 16) 1) ((18 25) 2) ((45 52) 1) ((78 85) 2))
+   '(("$random" . 9) ("$bandom" . 18)))
 
   (phps-mode-test-ast--should-bookkeep
-   "<?php\n\n$var = 123;\n\nfunction test($abc) {\n    global $var;\n    if 
($var) {\n        echo 'Hit';\n    }\n}"
+   "<?php\n\n$var = 123;\n\nfunction test($abc) {\n    global $var, $var2;\n   
 if ($var) {\n        echo 'Hit';\n    }\n    if ($var2) {\n        echo 
'Hit';\n    }\n}"
    "Bookkeeping of global variable declaration in function"
-   '((" id $var" 1) ((8 12) 1) (" function test id $abc" 1) ((35 39) 1) (" 
function test id $var" 1) ((54 58) 1) ((68 72) 1)))
+   '(((8 12) 1) ((35 39) 4) ((54 58) 1) ((60 65) 0) ((75 79) 2) ((117 122) 3))
+   '(("$var" . 8) ("function test" ("declaration" . 30) ("$abc" . 35) ("$var" 
. 54) ("$var2" . 60))))
 
   (phps-mode-test-ast--should-bookkeep
    "<?php\n$y = 1;\n$fn1 = fn($x) => $x + $y;\n$z = 1;\n$fn = fn($x2) => 
fn($y2) => $x2 * $y2 + $z;\nfn(array $x3) => $x3;\n$x4 = 4;\nstatic fn(): int 
=> $x4;\nfn($x5 = 42) => $x5;\nfn(&$x6) => $x6;\nfn&($x7) => $x7;\nfn($x8, 
...$rest) => $rest;"
    "Bookkeeping in arrow functions"
-   '((" id $y" 1) ((7 9) 1) (" id $fn1" 1) ((15 19) 1) (" arrow function 1 id 
$x" 1) ((25 27) 1) ((32 34) 1) ((37 39) 1) (" id $z" 1) ((41 43) 1) (" id $fn" 
1) ((49 52) 1) (" arrow function 2 id $x2" 1) ((58 61) 1) (" arrow function 2 
arrow function 3 id $y2" 1) ((69 72) 1) ((77 80) 1) ((83 86) 1) ((89 91) 1) (" 
arrow function 4 id $x3" 1) ((102 105) 1) ((110 113) 1) (" id $x4" 1) ((115 
118) 1) ((144 147) 1) (" arrow function 6 id $x5" 1) ((152 155) 1) ((165 168) 
1) (" arrow function 7 i [...]
+   '(((7 9) 1) ((15 19) 3) ((25 27) 2) ((32 34) 2) ((37 39) 1) ((41 43) 4) 
((49 52) 7) ((58 61) 6) ((69 72) 5) ((77 80) 6) ((83 86) 5) ((89 91) 4) ((102 
105) 8) ((110 113) 8) ((115 118) 9) ((144 147) 9) ((152 155) 10) ((165 168) 10) 
((174 177) 11) ((182 185) 11) ((191 194) 12) ((199 202) 12) ((207 210) 13) 
((215 220) 14) ((225 230) 14))
+   '(("$y" . 7) ("$fn1" . 15) ("$x" . 25) ("$z" . 41) ("$fn" . 49) ("$x2" . 
58) ("$y2" . 69) ("$x3" . 102) ("$x4" . 115) ("$x5" . 152) ("$x6" . 174) ("$x7" 
. 191) ("$x8" . 207) ("$rest" . 215)))
 
   (phps-mode-test-ast--should-bookkeep
-   "<?php\n$z = (object) array('name' => 'random');\nif ($z->name) {\n    echo 
'Hit';\n}"
-   "Bookkeeping ignoring variable properties"
-   '((" id $z" 1) ((7 9) 1) ((52 54) 1)))
+   "<?php\n$z = (object) ['name' => 'random', 'doThis' => function() {}];\nif 
($z->name) {\n    echo 'Hit';\n}\nif ($z->doThis()) {\n    echo 'Hit';\n}"
+   "Bookkeeping ignoring variable properties that is not $this"
+   '(((7 9) 1) ((74 76) 1) ((108 110) 1))
+   '(("$z" . 7)))
 
   (phps-mode-test-ast--should-bookkeep
    "<?php\nif (!$var = false) {\n    echo 'Hit';\n}\n"
    "Bookkeeping negative conditional assignment"
-   '((" id $var" 1) ((12 16) 1)))
+   '(((12 16) 1))
+   '(("$var" . 12)))
 
   (phps-mode-test-ast--should-bookkeep
    "<?php\n\nif (isset($x)) {\n    if ($x) {\n        echo 'Hit';\n        if 
(isset($i, $u)) {\n            if ($i) {\n                echo 'Hit';\n         
   }\n            if ($u) {\n                echo 'Hit';\n            }\n       
     if ($x) {\n                echo 'Hit';\n            }\n        }\n        
if ($i) {\n            echo 'Miss';\n        }\n        if ($u) {\n            
echo 'Miss';\n        }\n    }\n}\nif ($x) {\n    echo 'Miss';\n}\n\nif 
(!empty($y)) {\n    if ( [...]
    "Bookkeeping of isset() and !empty() scoped variables"
-   '((" defined 1 id $x" 1) ((18 20) 1) ((33 35) 1) (" defined 1 defined 2 id 
$i" 1) (" defined 1 defined 2 id $u" 1) ((77 79) 1) ((81 83) 1) ((104 106) 1) 
((168 170) 1) ((232 234) 1) ((302 304) 0) ((355 357) 0) ((408 410) 0) (" 
defined 3 id $y" 1) ((445 447) 1) ((460 462) 1) (" defined 3 defined 4 id $k" 
1) (" defined 3 defined 4 id $L" 1) ((505 507) 1) ((519 521) 1) ((542 544) 1) 
((606 608) 1) ((670 672) 1) ((740 742) 0) ((793 795) 0) ((846 848) 0)))
+   '(((18 20) 1) ((33 35) 1) ((77 79) 3) ((81 83) 2) ((104 106) 3) ((168 170) 
2) ((232 234) 1) ((302 304) 3) ((355 357) 2) ((408 410) 1) ((445 447) 4) ((460 
462) 4) ((505 507) 5) ((519 521) 6) ((542 544) 5) ((606 608) 6) ((670 672) 4) 
((740 742) 5) ((793 795) 6) ((846 848) 4))
+   '(("$x" . 18) ("$i" . 77) ("$u" . 81) ("$y" . 445) ("$k" . 505) ("$L" . 
519)))
 
   (phps-mode-test-ast--should-bookkeep
    "<?php\ninterface myInterface\n{\n    function myFunction1();\n    function 
myFunction2($x);\n}\n"
    "Bookkeeping variable in interface function"
-   '((" class myInterface function myFunction2 id $x" 1) ((84 86) 1)))
+   '(((84 86) 1))
+   '(("interface myInterface" ("declaration" . 17) ("function myFunction1" 
("declaration" . 44)) ("function myFunction2" ("declaration" . 72) ("$x" . 
84)))))
 
   (phps-mode-test-ast--should-bookkeep
-   "<?php\n\nfunction myFunction1()\n{\n    return isset($a);\n}\n\nfunction 
myFunction2()\n{\n    $b = 2;\n    if ($b) {\n        echo 'Hit';\n    }\n    
if ($b) {\n        echo 'Hit';\n    }\n}\n"
+   "<?php\n\nfunction myFunction1()\n{\n    return isset($a);\n}\n\nfunction 
myFunction2()\n{\n    $b = 2;\n    if ($b) {\n        echo 'Hit';\n    }\n    
if ($a) {\n        echo 'Miss';\n    }\n}\n"
    "Bookkeeping after definition condition"
-   '(((50 52) 0) (" function myFunction2 id $b" 1) ((87 89) 1) ((103 105) 1) 
((143 145) 1)))
+   '(((50 52) 1) ((87 89) 2) ((103 105) 2) ((143 145) 0))
+   '(("function myFunction1" ("declaration" . 17) ("$a" . 50)) ("function 
myFunction2" ("declaration" . 67) ("$b" . 87))))
 
   (phps-mode-test-ast--should-bookkeep
    "<?php\n\n$a = array(1, 2, 3);\nforeach ($a as $uri => $page)\n{\n    if 
(isset($pages)) {\n        if ($a) {\n            echo 'Hit';\n        }\n      
  if ($uri) {\n            echo 'Hit';\n        }\n        if ($page) {\n       
     echo 'Hit';\n        }\n    }\n}\n"
    "Bookkeeping of foreach variable inside if (isset()) block"
-   '((" id $a" 1) ((8 10) 1) ((38 40) 1) (" id $uri" 1) ((44 48) 1) (" id 
$page" 1) ((52 57) 1) (" defined 1 id $pages" 1) ((75 81) 1) ((98 100) 1) ((150 
154) 1) ((204 209) 1)))
+   '(((8 10) 1) ((38 40) 1) ((44 48) 2) ((52 57) 3) ((75 81) 4) ((98 100) 1) 
((150 154) 2) ((204 209) 3))
+   '(("$a" . 8) ("$uri" . 44) ("$page" . 52) ("$pages" . 75)))
 
   (phps-mode-test-ast--should-bookkeep
    "<?php\nif (isset($b)) {\n    $b = false;\n}\n$c = 2;\n\nif ($c) {\n    
echo 'Hit';\n}\n"
    "Bookkeeping of variable after isset() block"
-   '((" defined 1 id $b" 2) ((17 19) 1) ((28 30) 2) (" id $c" 1) ((42 44) 1) 
((55 57) 1)))
+   '(((17 19) 1) ((28 30) 1) ((42 44) 3) ((55 57) 3))
+   '(("$b" . 17) ("$c" . 42)))
 
   (phps-mode-test-ast--should-bookkeep
    "<?php\nif (!isset($a)) {\n    if ($a) {\n        echo 'Miss';\n    }\n}"
    "Bookkeeping for variable in negative isset() conditional"
-   '(((18 20) 0) ((33 35) 0)))
+   '(((18 20) 1) ((33 35) 1))
+   '(("$a" . 18)))
 
   (phps-mode-test-ast--should-bookkeep
    "<?php\n\nfunction myFunction($a, $b, $c, $d)\n{\n    global $f, $g;\n    
if (isset($f)) {\n        if (!empty($g)) {\n            if ($a) {\n            
    echo 'Hit';\n            }\n            if ($b) {\n                echo 
'Hit';\n            }\n            if ($c) {\n                echo 'Hit';\n     
       }\n            if ($d) {\n                echo 'Hit';\n            }\n   
     }\n    }\n}\n"
    "Bookkeeping variables inside nested isset() !empty() blocks"
-   '((" function myFunction id $a" 1) ((28 30) 1) (" function myFunction id 
$b" 1) ((32 34) 1) (" function myFunction id $c" 1) ((36 38) 1) (" function 
myFunction id $d" 1) ((40 42) 1) (" function myFunction id $f" 1) ((57 59) 1) 
(" function myFunction id $g" 1) ((61 63) 1) (" function myFunction defined 1 
id $f" 1) ((79 81) 1) (" function myFunction defined 1 defined 2 id $g" 1) 
((105 107) 1) ((128 130) 1) ((192 194) 1) ((256 258) 1) ((320 322) 1)))
+   '(((28 30) 5) ((32 34) 6) ((36 38) 7) ((40 42) 8) ((57 59) 0) ((61 63) 0) 
((79 81) 1) ((105 107) 2) ((128 130) 5) ((192 194) 6) ((256 258) 7) ((320 322) 
8))
+   '(("function myFunction" ("declaration" . 17) ("$a" . 28) ("$b" . 32) ("$c" 
. 36) ("$d" . 40) ("$f" . 57) ("$g" . 61))))
 
   (phps-mode-test-ast--should-bookkeep
    "<?php\n\n$var = 123;\n\nfunction test($abc) {\n    static $var;\n    if 
($var) {\n        echo 'Hit';\n    }\n}"
    "Bookkeeping of static variable declaration in function"
-   '((" id $var" 1) ((8 12) 1) (" function test id $abc" 1) ((35 39) 1) (" 
function test id $var" 1) ((54 58) 1) ((68 72) 1)))
+   '(((8 12) 1) ((35 39) 3) ((54 58) 2) ((68 72) 2))
+   '(("$var" . 8) ("function test" ("declaration" . 30) ("$abc" . 35) ("$var" 
. 54))))
 
   (phps-mode-test-ast--should-bookkeep
    "<?php\n\nglobal $a, $b;\n\nif ($a) {\n    echo 'Hit';\n}\n\nfunction 
myFunction($c)\n{\n    global $a;\n    if ($a) {\n        echo 'Hit';\n    }\n  
  if ($b) {\n        echo 'Miss';\n    }\n}\n"
    "Bookkeeping of global variables in functional-oriented file"
-   '((" id $a" 1) ((15 17) 1) (" id $b" 1) ((19 21) 1) ((28 30) 1) (" function 
myFunction id $c" 1) ((73 75) 1) (" function myFunction id $a" 1) ((90 92) 1) 
((102 104) 1) ((142 144) 0)))
+   '(((15 17) 1) ((19 21) 2) ((28 30) 1) ((73 75) 4) ((90 92) 1) ((102 104) 3) 
((142 144) 0))
+   '(("$a" . 15) ("$b" . 19) ("function myFunction" ("declaration" . 62) ("$c" 
. 73) ("$a" . 90))))
 
   (phps-mode-test-ast--should-bookkeep
    "<?php\n\nstatic $a;\n\nif ($a) {}\n\nfunction test()\n{\n    static $a;\n  
  if ($a) {}\n}\n\nclass There\n{\n    function here()\n    {\n        static 
$a;\n        if ($a) {}\n    }\n}"
    "Bookkeeping of static variables in different scopes without namespaces"
-   '((" id $a" 1) ((15 17) 1) ((24 26) 1) (" function test id $a" 1) ((61 63) 
1) ((73 75) 1) (" class There function here id $this" 1) (" class There 
function here id $a" 1) ((138 140) 1) ((154 156) 1)))
+   '(((15 17) 1) ((24 26) 1) ((61 63) 2) ((73 75) 2) ((138 140) 3) ((154 156) 
3))
+   '(("$a" . 15) ("function test" ("declaration" . 41) ("$a" . 61)) ("class 
There" ("declaration" . 89) ("function here" ("declaration" . 121) ("$a" . 
138)))))
 
   (phps-mode-test-ast--should-bookkeep
    "<?php\nclass There\n{\n    private $variable;\n    private \\My\\Random 
$variable2;\n    private string $variable3;\n    private static $variable4;\n   
 private static \\My\\Random $variable5;\n    private static string 
$variable6;\n    function here()\n    {\n        if ($this->variable) {}\n      
  if ($this->variable2) {}\n        if ($this->variable3) {}\n        if 
($this->variable4) {}\n        if (self::$variable4) {}\n        if 
(self::$variable5) {}\n        if (self::$varia [...]
    "Bookkeeping of typed class variables"
-   '((" class There id $variable" 1) ((33 42) 1) (" class There id $variable2" 
1) ((67 77) 1) (" class There id $variable3" 1) ((98 108) 1) (" class There 
static id $variable4" 1) ((129 139) 1) (" class There static id $variable5" 1) 
((171 181) 1) (" class There static id $variable6" 1) ((209 219) 1) (" class 
There function here id $this" 1) ((259 264) 1) ((266 274) 1) ((291 296) 1) 
((298 307) 1) ((324 329) 1) ((331 340) 1) ((357 362) 1) ((364 373) 0) ((396 
406) 1) ((429 439) 1) ((462 472) 1)))
+   '(((33 42) 1) ((67 77) 2) ((98 108) 3) ((129 139) 4) ((171 181) 5) ((209 
219) 6) ((259 264) 7) ((266 274) 1) ((291 296) 7) ((298 307) 2) ((324 329) 7) 
((331 340) 3) ((357 362) 7) ((364 373) 0) ((396 406) 4) ((429 439) 5) ((462 
472) 6))
+   '(("class There" ("declaration" . 13) ("$variable" . 33) ("$variable2" . 
67) ("$variable3" . 98) ("$variable4" . 129) ("$variable5" . 171) ("$variable6" 
. 209) ("function here" ("declaration" . 245)))))
 
   (phps-mode-test-ast--should-bookkeep
    "<?php\n\n$a = $b = $c = 3;\n\nif ($a) {\n    echo 'a=',$a;\n} else {\n    
echo '$a is undefined!';\n}\nif ($b) {\n    echo 'b=',$b;\n} else {\n    echo 
'$b is undefined!';\n}\nif ($c) {\n    echo 'c=',$c;\n} else {\n    echo '$c is 
undefined!';\n}"
    "Bookkeeping of chained variable assignments"
-   '((" id $a" 1) ((8 10) 1) (" id $b" 1) ((13 15) 1) (" id $c" 1) ((18 20) 1) 
((31 33) 1) ((51 53) 1) ((99 101) 1) ((119 121) 1) ((167 169) 1) ((187 189) 1)))
+   '(((8 10) 3) ((13 15) 2) ((18 20) 1) ((31 33) 3) ((51 53) 3) ((99 101) 2) 
((119 121) 2) ((167 169) 1) ((187 189) 1))
+   '(("$a" . 8) ("$b" . 13) ("$c" . 18)))
 
   (phps-mode-test-ast--should-bookkeep
    "<?php\nclass There\n{\n    private $variable;\n    private ?\\My\\Random 
$variable2;\n    private string $variable3;\n    private static $variable4;\n   
 private static \\My\\Random $variable5;\n    private static ?string 
$variable6;\n    function here()\n    {\n        if ($this->variable) {}\n      
  if ($this->variable2) {}\n        if ($this->variable3) {}\n        if 
($this->variable4) {}\n        if (self::$variable4) {}\n        if 
(self::$variable5) {}\n        if (self::$var [...]
    "Bookkeeping of nullable typed class variables"
-   '((" class There id $variable" 1) ((33 42) 1) (" class There id $variable2" 
1) ((68 78) 1) (" class There id $variable3" 1) ((99 109) 1) (" class There 
static id $variable4" 1) ((130 140) 1) (" class There static id $variable5" 1) 
((172 182) 1) (" class There static id $variable6" 1) ((211 221) 1) (" class 
There function here id $this" 1) ((261 266) 1) ((268 276) 1) ((293 298) 1) 
((300 309) 1) ((326 331) 1) ((333 342) 1) ((359 364) 1) ((366 375) 0) ((398 
408) 1) ((431 441) 1) ((464 474) 1)))
+   '(((33 42) 1) ((68 78) 2) ((99 109) 3) ((130 140) 4) ((172 182) 5) ((211 
221) 6) ((261 266) 7) ((268 276) 1) ((293 298) 7) ((300 309) 2) ((326 331) 7) 
((333 342) 3) ((359 364) 7) ((366 375) 0) ((398 408) 4) ((431 441) 5) ((464 
474) 6))
+   '(("class There" ("declaration" . 13) ("$variable" . 33) ("$variable2" . 
68) ("$variable3" . 99) ("$variable4" . 130) ("$variable5" . 172) ("$variable6" 
. 211) ("function here" ("declaration" . 247)))))
 
   (phps-mode-test-ast--should-bookkeep
    "<?php\nclass MyClass\n{\n    static function here()\n    {\n        if 
($this) {\n            // Miss;\n        }\n    }\n    function there()\n    
{\n        if ($this) {\n            // Hit\n        }\n    }\n}\n"
    "Bookkeeping of $this not available inside static method"
-   '(((68 73) 0) (" class MyClass function there id $this" 1) ((153 158) 1)))
+   '(((68 73) 0) ((153 158) 1))
+   '(("class MyClass" ("declaration" . 13) ("function here" ("declaration" . 
54)) ("function there" ("declaration" . 139)))))
 
   (phps-mode-test-ast--should-bookkeep
-   "<?php\n\nclass myClass\n{\n    private $test = 'abc';\n    public function 
test($d)\n    {\n        return fn($e) => $this->test . $d . $e;\n    
}\n}\n\n$a = new myClass();\necho $a->test('def')('ghi');"
+   "<?php\n\nclass myClass\n{\n    private $tost = 'abc';\n    public function 
test($d)\n    {\n        return fn($e) => $this->tost . $d . $e;\n    
}\n}\n\n$a = new myClass();\necho $a->test('def')('ghi');"
    "Bookkeeping of $this reference inside arrow function inside of method"
-   '((" class myClass id $test" 1) ((36 41) 1) (" class myClass function test 
id $this" 1) (" class myClass function test id $d" 1) ((76 78) 1) (" class 
myClass function test arrow function 1 id $e" 1) ((104 106) 1) ((111 116) 1) 
((118 122) 1) ((125 127) 1) ((130 132) 1) (" id $a" 1) ((143 145) 1)))
+   '(((36 41) 1) ((76 78) 4) ((104 106) 2) ((111 116) 3) ((118 122) 1) ((125 
127) 4) ((130 132) 2) ((143 145) 5) ((168 170) 5))
+   '(("class myClass" ("declaration" . 14) ("$tost" . 36) ("function test" 
("declaration" . 84) ("$d" . 76) ("$e" . 104))) ("$a" . 143)))
 
   (phps-mode-test-ast--should-bookkeep
-   "<?php class myClass { static $var = '123'; static function myMethod($a) { 
return fn($b) => self::$var . $a . $b; }} echo myClass::myMethod('4')('5');"
+   "<?php\n\nclass myClass\n{\n    static $var = '123';\n    static function 
myMethod($a)\n    {\n        return fn($b) => self::$var . $a . $b;\n    
}\n}\n\necho myClass::myMethod('4')('5');"
    "Bookkeeping of self reference inside arrow function inside of static 
method"
-   '((" class myClass static id $var" 1) ((30 34) 1) (" class myClass function 
myMethod id $a" 1) ((69 71) 1) (" class myClass function myMethod arrow 
function 1 id $b" 1) ((85 87) 1) ((98 102) 1) ((105 107) 1) ((110 112) 1)))
+   '(((35 39) 1) ((78 80) 3) ((106 108) 2) ((119 123) 1) ((126 128) 3) ((131 
133) 2))
+  '(("class myClass" ("declaration" . 14) ("$var" . 35) ("function myMethod" 
("declaration" . 86) ("$a" . 78) ("$b" . 106)))))
 
-  ;; TODO Make this test pass
-  ;; (phps-mode-test-ast--should-bookkeep
-  ;;  "<?php\nnamespace myNamespace;\nclass myClass\n{\n    private $property1 
= '';\n    private $property2;\n    protected function myMethod(\n        
$argument1,\n        $argument2,\n        $argument3\n    ) {\n        if 
($this->property2) {\n            echo 'was here';\n        }\n        /* 
@codingStandardsIgnoreEnd */\n        if (\n            $argument1\n            
&& $argument2\n            && $argument3\n            && $argument4\n           
 && !empty($argument1['index']) [...]
-  ;;  "Bookkeeping of properties inside if condition list"
-  ;;  '((" namespace myNamespace class myClass id $property1" 1) ((58 68) 1) 
(" namespace myNamespace class myClass id $property2" 1) ((87 97) 1) (" 
namespace myNamespace class myClass function myMethod id $this" 1) (" namespace 
myNamespace class myClass function myMethod id $argument1" 1) ((140 150) 1) (" 
namespace myNamespace class myClass function myMethod id $argument2" 1) ((160 
170) 1) (" namespace myNamespace class myClass function myMethod id $argument3" 
1) ((180 190) 1) ((211 216 [...]
+  (phps-mode-test-ast--should-bookkeep
+   "<?php\nnamespace myNamespace;\nclass myClass\n{\n    private $property1 = 
'';\n    private $property2;\n    protected function myMethod(\n        
$argument1,\n        $argument2,\n        $argument3\n    ) {\n        if 
($this->property2) {\n            echo 'was here';\n        }\n        /* 
@codingStandardsIgnoreEnd */\n        if (\n            $argument1\n            
&& $argument2\n            && $argument3\n            && $argument4\n           
 && !empty($argument1['index'])\n  [...]
+   "Bookkeeping of properties inside if condition list"
+   '(((58 68) 1) ((87 97) 2) ((140 150) 5) ((160 170) 6) ((180 190) 7) ((211 
216) 4) ((218 227) 2) ((335 345) 5) ((361 371) 6) ((387 397) 7) ((413 423) 0) 
((446 456) 3) ((482 487) 4) ((489 498) 1) ((514 524) 3) ((537 542) 4) ((544 
553) 1))
+  '(("namespace myNamespace" ("declaration" . 17) ("class myClass" 
("declaration" . 36) ("$property1" . 58) ("$property2" . 87) ("function 
myMethod" ("declaration" . 197) ("$argument2" . 160) ("$argument3" . 180) 
("$argument1" . 446))))))
+
+  (phps-mode-test-ast--should-bookkeep
+   "<?php\ntrait MyTrait {\n    private $var = 'abc';\n    public function 
sayHello() {\n        if ($this->var) {\n            echo 'Hit';\n        }\n   
 }\n}\n"
+   "A basic trait class"
+   '(((35 39) 1) ((94 99) 2) ((101 104) 1))
+   '(("trait MyTrait" ("declaration") ("$var" . 35) ("function sayHello" 
("declaration" . 80)))))
+
+  (phps-mode-test-ast--should-bookkeep
+   "<?php\nclass Person {\n    public function __construct(\n        private 
string $name,\n        private int $age,\n        public $address\n    ) {}\n}"
+   "Class with class properties in constructor."
+   '(((78 83) 3) ((105 109) 5) ((126 134) 7))
+   '(("class Person" ("declaration" . 13) ("$name" . 78) ("$age" . 105) 
("$address" . 126) ("function __construct" ("declaration" . 141) ("$name" . 78) 
("$age" . 105) ("$address" . 126)))))
+
+  (phps-mode-test-ast--should-bookkeep
+   "<?php\nfunction myFunction()\n{\n    $variable = 123;\n    if ($variable 
=== 456) {\n        $variable = 789;\n    }\n}\n"
+   "Variable inside function with assignment inside conditional block"
+   '(((35 44) 1) ((60 69) 1) ((89 98) 1))
+   '(("function myFunction" ("declaration" . 16) ("$variable" . 35))))
 
   (message "\n-- Ran tests for bookkeeping generation. --"))
 
 (defun phps-mode-test-ast ()
   "Run test for ast."
   (message "-- Running all tests for ast... --\n")
-  (phps-mode-test-ast-imenu)
   (phps-mode-test-ast-bookkeeping)
   (message "\n-- Ran all tests for ast. --"))
 
diff --git a/test/phps-mode-test-parser.el b/test/phps-mode-test-parser.el
index c12c38d2fe..44a5eceb53 100644
--- a/test/phps-mode-test-parser.el
+++ b/test/phps-mode-test-parser.el
@@ -76,7 +76,7 @@
 
      (let ((parse (phps-mode-parser-parse)))
        (message "Left-to-right with right-most derivation:\n%S\n" parse)
-       (dolist (production-number (reverse parse))
+       (dolist (production-number parse)
          (let ((production
                 (phps-mode-parser--get-grammar-production-by-number
                  production-number)))
@@ -129,7 +129,7 @@
    (lambda()
      (let ((parse (phps-mode-parser-parse)))
        (message "Left-to-right with right-most derivation:\n%S\n" parse)
-       (dolist (production-number (reverse parse))
+       (dolist (production-number parse)
          (let ((production
                 (phps-mode-parser--get-grammar-production-by-number
                  production-number)))
@@ -150,7 +150,7 @@
    (lambda()
      (let ((parse (phps-mode-parser-parse)))
        (message "Left-to-right with right-most derivation:\n%S\n" parse)
-       (dolist (production-number (reverse parse))
+       (dolist (production-number parse)
          (let ((production
                 (phps-mode-parser--get-grammar-production-by-number
                  production-number)))
@@ -171,7 +171,7 @@
    (lambda()
      (let ((parse (phps-mode-parser-parse)))
        (message "Left-to-right with right-most derivation:\n%S\n" parse)
-       (dolist (production-number (reverse parse))
+       (dolist (production-number parse)
          (let ((production
                 (phps-mode-parser--get-grammar-production-by-number
                  production-number)))
@@ -192,7 +192,7 @@
    (lambda()
      (let ((parse (phps-mode-parser-parse)))
        (message "Left-to-right with right-most derivation:\n%S\n" parse)
-       (dolist (production-number (reverse parse))
+       (dolist (production-number parse)
          (let ((production
                 (phps-mode-parser--get-grammar-production-by-number
                  production-number)))
@@ -213,7 +213,7 @@
    (lambda()
      (let ((parse (phps-mode-parser-parse)))
        (message "Left-to-right with right-most derivation:\n%S\n" parse)
-       (dolist (production-number (reverse parse))
+       (dolist (production-number parse)
          (let ((production
                 (phps-mode-parser--get-grammar-production-by-number
                  production-number)))



reply via email to

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