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

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

[elpa] externals/phps-mode c279508: Fixed lexer-based indentation issue


From: Christian Johansson
Subject: [elpa] externals/phps-mode c279508: Fixed lexer-based indentation issue with switch, case with trailing comments
Date: Thu, 2 Jul 2020 03:16:52 -0400 (EDT)

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

    Fixed lexer-based indentation issue with switch, case with trailing comments
---
 Makefile                                    |    4 +-
 admin/phps-mode-automation-header.wy        |  294 ++++++-
 admin/phps-mode-automation.el               |   47 +-
 phps-mode-lex-analyzer.el                   |   15 +-
 phps-mode-lexer.el                          |   20 +-
 phps-mode-macros.el                         |    2 +-
 phps-mode-parser-grammar-macro.el           |   82 ++
 phps-mode-parser-grammar-raw.wy             | 1245 +++++++++++++++++++++++++++
 phps-mode-parser-grammar.wy                 |  665 ++++++++++++++
 phps-mode-semantic.el                       |   36 -
 phps-mode-tags.el                           |   37 -
 phps-mode-wy-macros.el                      |  113 ---
 phps-mode-wy.el                             | 1004 +++++++++++++++++++++
 phps-mode-wy.wy                             |  981 ---------------------
 phps-mode.el                                |    5 +-
 test/phps-mode-test-lex-analyzer.el         |    7 +
 phps-mode-test.el => test/phps-mode-test.el |    0
 17 files changed, 3346 insertions(+), 1211 deletions(-)

diff --git a/Makefile b/Makefile
index 137a3f9..4500e66 100644
--- a/Makefile
+++ b/Makefile
@@ -2,9 +2,9 @@ EMACS = emacs
 ifdef emacs
        EMACS = $(emacs)
 endif
-EMACS_CMD := $(EMACS) -Q -batch -L .
+EMACS_CMD := $(EMACS) -Q -batch -L . -L test/
 
-EL  := admin/phps-mode-automation.el phps-mode-flymake.el 
phps-mode-lex-analyzer.el phps-mode-lexer.el phps-mode-macros.el 
phps-mode-syntax-table.el  phps-mode-test.el phps-mode-wy-macros.el 
phps-mode.el test/phps-mode-test-lex-analyzer.el 
test/phps-mode-test-integration.el test/phps-mode-test-lexer.el 
test/phps-mode-test-parser.el test/phps-mode-test-syntax-table.el
+EL  := admin/phps-mode-automation.el phps-mode-flymake.el 
phps-mode-lex-analyzer.el phps-mode-lexer.el phps-mode-macros.el 
phps-mode-syntax-table.el  phps-mode-parser-grammar-macro.el phps-mode.el 
test/phps-mode-test.el test/phps-mode-test-lex-analyzer.el 
test/phps-mode-test-integration.el test/phps-mode-test-lexer.el 
test/phps-mode-test-parser.el test/phps-mode-test-syntax-table.el
 ELC := $(EL:.el=.elc)
 
 .PHONY: clean
diff --git a/admin/phps-mode-automation-header.wy 
b/admin/phps-mode-automation-header.wy
index 7e6fcf9..17c4b33 100644
--- a/admin/phps-mode-automation-header.wy
+++ b/admin/phps-mode-automation-header.wy
@@ -1,6 +1,6 @@
-;;; phps.wy -- Semantic LALR grammar for PHP
+;;; phps.wy --- Semantic LALR grammar for PHP -*- lexical-binding: t -*-
 
-;; Copyright (C) 2018-2019  Free Software Foundation, Inc.
+;; Copyright (C) 2018-2020  Free Software Foundation, Inc.
 
 ;; This file is not part of GNU Emacs.
 
@@ -22,12 +22,18 @@
 
 ;; Run `(wisent-make-parsers)' or "C-c C-c" to generate grammar-file in Emacs 
Lisp.
 ;;
+;; To debug (setq wisent-verbose-flag t) and check buffer *wisent-log*
+;;
 ;; Based on the Zend PHP Parser YACC 
https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y
 
 ;; Create macros for all macros uses in original YACC, base macro structure on 
semantic-php-wy-macro.el
 
 ;; Don't edit phps.wy because it's generated by phps-automation.el and 
phps-automation-header.wy
 
+;; Check semantic/wisent/grammar.el for macro definitions
+
+;; To force compile grammar use: (semantic-grammar-create-package t)
+
 
 ;;; Code:
 
@@ -36,21 +42,271 @@
 
 %languagemode phps-mode
 
-%use-macros phps-mode-wy-macros {
-             phps-mode-wy-macros--zend_add_class_modifier
-             phps-mode-wy-macros--zend_add_member_modifier
-             phps-mode-wy-macros--zend_append_str
-             phps-mode-wy-macros--zend_ast_create
-             phps-mode-wy-macros--zend_ast_create_assign_op
-             phps-mode-wy-macros--zend_ast_create_binary_op
-             phps-mode-wy-macros--zend_ast_create_cast
-             phps-mode-wy-macros--zend_ast_create_decl
-             phps-mode-wy-macros--zend_ast_create_ex
-             phps-mode-wy-macros--zend_ast_create_list
-             phps-mode-wy-macros--zend_ast_create_zval_from_str
-             phps-mode-wy-macros--zend_ast_get_str
-             phps-mode-wy-macros--zend_ast_list_add
-             phps-mode-wy-macros--zend_ast_list_rtrim
-             phps-mode-wy-macros--zend_handle_encoding_declaration
-             phps-mode-wy-macros--zend_negate_num_string
+%{
+  (setq max-specpdl-size 160000)
+}
+
+%use-macros phps-mode-parser-grammar-macro
+{
+ ZEND_AST_CREATE
+ ZEND_AST_CREATE_ASSIGN_OP
+ ZEND_AST_CREATE_BINARY_OP
+ ZEND_AST_CREATE_CAST
+ ZEND_AST_CREATE_CLASS_CONST_OR_NAME
+ ZEND_AST_CREATE_EX
+ ZEND_AST_CREATE_LIST
+ ZEND_AST_CREATE_ZVAL
+ ZEND_AST_LIST_ADD
+ ZEND_AST_LIST_RTRIM
+ ZEND_LEX_TSTRING
+ ZEND_NEGATE_NUM_STRING
+ ZVAL_INTERNED_STR
 }
+
+%precedence T_THROW
+%precedence PREC_ARROW_FUNCTION
+%precedence T_INCLUDE T_INCLUDE_ONCE T_REQUIRE T_REQUIRE_ONCE
+%left T_LOGICAL_OR
+%left T_LOGICAL_XOR
+%left T_LOGICAL_AND
+%precedence T_PRINT
+%precedence T_YIELD
+%precedence T_DOUBLE_ARROW
+%precedence T_YIELD_FROM
+%precedence '=' T_PLUS_EQUAL T_MINUS_EQUAL T_MUL_EQUAL T_DIV_EQUAL 
T_CONCAT_EQUAL T_MOD_EQUAL T_AND_EQUAL T_OR_EQUAL T_XOR_EQUAL T_SL_EQUAL 
T_SR_EQUAL T_POW_EQUAL T_COALESCE_EQUAL
+%left '?' ':'
+%right T_COALESCE
+%left T_BOOLEAN_OR
+%left T_BOOLEAN_AND
+%left '|'
+%left '^'
+%left '&'
+%nonassoc T_IS_EQUAL T_IS_NOT_EQUAL T_IS_IDENTICAL T_IS_NOT_IDENTICAL 
T_SPACESHIP
+%nonassoc '<' T_IS_SMALLER_OR_EQUAL '>' T_IS_GREATER_OR_EQUAL
+%left '.'
+%left T_SL T_SR
+%left '+' '-'
+%left '*' '/' '%'
+%precedence '!'
+%precedence T_INSTANCEOF
+%precedence '~' T_INT_CAST T_DOUBLE_CAST T_STRING_CAST T_ARRAY_CAST 
T_OBJECT_CAST T_BOOL_CAST T_UNSET_CAST '@'
+%right T_POW
+%precedence T_CLONE
+
+;; Resolve danging else conflict
+%precedence T_NOELSE
+%precedence T_ELSEIF
+%precedence T_ELSE
+
+%token <ast> T_LNUMBER   "integer number (T_LNUMBER)"
+%token <ast> T_DNUMBER   "floating-point number (T_DNUMBER)"
+%token <ast> T_STRING    "identifier (T_STRING)"
+%token <ast> T_VARIABLE  "variable (T_VARIABLE)"
+%token <ast> T_INLINE_HTML
+%token <ast> T_ENCAPSED_AND_WHITESPACE  "quoted-string and whitespace 
(T_ENCAPSED_AND_WHITESPACE)"
+%token <ast> T_CONSTANT_ENCAPSED_STRING "quoted-string 
(T_CONSTANT_ENCAPSED_STRING)"
+%token <ast> T_STRING_VARNAME "variable name (T_STRING_VARNAME)"
+%token <ast> T_NUM_STRING "number (T_NUM_STRING)"
+
+%type <punctuation>
+%token <punctuation> ADDITION "+"
+%token <punctuation> ASSIGN "="
+%token <punctuation> AT "@"
+%token <punctuation> BACKTICK "`"
+%token <punctuation> BITWISE_AND "&"
+%token <punctuation> BITWISE_OR "|"
+%token <punctuation> CLOSE_CURLY_BRACKET "]"
+%token <punctuation> CLOSE_PARENTHESIS ")"
+%token <punctuation> CLOSE_SQUARE_BRACKET "]"
+%token <punctuation> COLON ":"
+%token <punctuation> COMMA ","
+%token <punctuation> DOLLAR_SIGN "$"
+%token <punctuation> DOUBLE_QUOTE "\""
+%token <punctuation> DIVISION "/"
+%token <punctuation> DOT "."
+%token <punctuation> GREATER_THAN ">"
+%token <punctuation> LESSER_THAN "<"
+%token <punctuation> MODULO "%"
+%token <punctuation> MULTIPLICATION "*"
+%token <punctuation> NEGATION "!"
+%token <punctuation> OPEN_CURLY_BRACKET "{"
+%token <punctuation> OPEN_PARENTHESIS "("
+%token <punctuation> OPEN_SQUARE_BRACKET "["
+%token <punctuation> POW "^"
+%token <punctuation> QUESTION_MARK "?"
+%token <punctuation> SEMICOLON ";"
+%token <punctuation> SINGLE_QUOTE "'"
+%token <punctuation> SUBTRACTION "-"
+%token <punctuation> UNARY "~"
+
+%token END 0 "end of file"
+%token T_INCLUDE      "include (T_INCLUDE)"
+%token T_INCLUDE_ONCE "include_once (T_INCLUDE_ONCE)"
+%token T_EVAL         "eval (T_EVAL)"
+%token T_REQUIRE      "require (T_REQUIRE)"
+%token T_REQUIRE_ONCE "require_once (T_REQUIRE_ONCE)"
+%token T_LOGICAL_OR   "or (T_LOGICAL_OR)"
+%token T_LOGICAL_XOR  "xor (T_LOGICAL_XOR)"
+%token T_LOGICAL_AND  "and (T_LOGICAL_AND)"
+%token T_PRINT        "print (T_PRINT)"
+%token T_YIELD        "yield (T_YIELD)"
+%token T_YIELD_FROM   "yield from (T_YIELD_FROM)"
+%token T_PLUS_EQUAL   "+= (T_PLUS_EQUAL)"
+%token T_MINUS_EQUAL  "-= (T_MINUS_EQUAL)"
+%token T_MUL_EQUAL    "*= (T_MUL_EQUAL)"
+%token T_DIV_EQUAL    "/= (T_DIV_EQUAL)"
+%token T_CONCAT_EQUAL ".= (T_CONCAT_EQUAL)"
+%token T_MOD_EQUAL    "%= (T_MOD_EQUAL)"
+%token T_AND_EQUAL    "&= (T_AND_EQUAL)"
+%token T_OR_EQUAL     "|= (T_OR_EQUAL)"
+%token T_XOR_EQUAL    "^= (T_XOR_EQUAL)"
+%token T_SL_EQUAL     "<<= (T_SL_EQUAL)"
+%token T_SR_EQUAL     ">>= (T_SR_EQUAL)"
+%token T_COALESCE_EQUAL "??= (T_COALESCE_EQUAL)"
+%token T_BOOLEAN_OR   "|| (T_BOOLEAN_OR)"
+%token T_BOOLEAN_AND  "&& (T_BOOLEAN_AND)"
+%token T_IS_EQUAL     "== (T_IS_EQUAL)"
+%token T_IS_NOT_EQUAL "!= (T_IS_NOT_EQUAL)"
+%token T_IS_IDENTICAL "=== (T_IS_IDENTICAL)"
+%token T_IS_NOT_IDENTICAL "!== (T_IS_NOT_IDENTICAL)"
+%token T_IS_SMALLER_OR_EQUAL "<= (T_IS_SMALLER_OR_EQUAL)"
+%token T_IS_GREATER_OR_EQUAL ">= (T_IS_GREATER_OR_EQUAL)"
+%token T_SPACESHIP "<=> (T_SPACESHIP)"
+%token T_SL "<< (T_SL)"
+%token T_SR ">> (T_SR)"
+%token T_INSTANCEOF  "instanceof (T_INSTANCEOF)"
+%token T_INC "++ (T_INC)"
+%token T_DEC "-- (T_DEC)"
+%token T_INT_CAST    "(int) (T_INT_CAST)"
+%token T_DOUBLE_CAST "(double) (T_DOUBLE_CAST)"
+%token T_STRING_CAST "(string) (T_STRING_CAST)"
+%token T_ARRAY_CAST  "(array) (T_ARRAY_CAST)"
+%token T_OBJECT_CAST "(object) (T_OBJECT_CAST)"
+%token T_BOOL_CAST   "(bool) (T_BOOL_CAST)"
+%token T_UNSET_CAST  "(unset) (T_UNSET_CAST)"
+%token T_NEW       "new (T_NEW)"
+%token T_CLONE     "clone (T_CLONE)"
+%token T_EXIT      "exit (T_EXIT)"
+%token T_IF        "if (T_IF)"
+%token T_ELSEIF    "elseif (T_ELSEIF)"
+%token T_ELSE      "else (T_ELSE)"
+%token T_ENDIF     "endif (T_ENDIF)"
+%token T_ECHO       "echo (T_ECHO)"
+%token T_DO         "do (T_DO)"
+%token T_WHILE      "while (T_WHILE)"
+%token T_ENDWHILE   "endwhile (T_ENDWHILE)"
+%token T_FOR        "for (T_FOR)"
+%token T_ENDFOR     "endfor (T_ENDFOR)"
+%token T_FOREACH    "foreach (T_FOREACH)"
+%token T_ENDFOREACH "endforeach (T_ENDFOREACH)"
+%token T_DECLARE    "declare (T_DECLARE)"
+%token T_ENDDECLARE "enddeclare (T_ENDDECLARE)"
+%token T_AS         "as (T_AS)"
+%token T_SWITCH     "switch (T_SWITCH)"
+%token T_ENDSWITCH  "endswitch (T_ENDSWITCH)"
+%token T_CASE       "case (T_CASE)"
+%token T_DEFAULT    "default (T_DEFAULT)"
+%token T_BREAK      "break (T_BREAK)"
+%token T_CONTINUE   "continue (T_CONTINUE)"
+%token T_GOTO       "goto (T_GOTO)"
+%token T_FUNCTION   "function (T_FUNCTION)"
+%token T_FN         "fn (T_FN)"
+%token T_CONST      "const (T_CONST)"
+%token T_RETURN     "return (T_RETURN)"
+%token T_TRY        "try (T_TRY)"
+%token T_CATCH      "catch (T_CATCH)"
+%token T_FINALLY    "finally (T_FINALLY)"
+%token T_THROW      "throw (T_THROW)"
+%token T_USE        "use (T_USE)"
+%token T_INSTEADOF  "insteadof (T_INSTEADOF)"
+%token T_GLOBAL     "global (T_GLOBAL)"
+%token T_STATIC     "static (T_STATIC)"
+%token T_ABSTRACT   "abstract (T_ABSTRACT)"
+%token T_FINAL      "final (T_FINAL)"
+%token T_PRIVATE    "private (T_PRIVATE)"
+%token T_PROTECTED  "protected (T_PROTECTED)"
+%token T_PUBLIC     "public (T_PUBLIC)"
+%token T_VAR        "var (T_VAR)"
+%token T_UNSET      "unset (T_UNSET)"
+%token T_ISSET      "isset (T_ISSET)"
+%token T_EMPTY      "empty (T_EMPTY)"
+%token T_HALT_COMPILER "__halt_compiler (T_HALT_COMPILER)"
+%token T_CLASS      "class (T_CLASS)"
+%token T_TRAIT      "trait (T_TRAIT)"
+%token T_INTERFACE  "interface (T_INTERFACE)"
+%token T_EXTENDS    "extends (T_EXTENDS)"
+%token T_IMPLEMENTS "implements (T_IMPLEMENTS)"
+%token T_OBJECT_OPERATOR "-> (T_OBJECT_OPERATOR)"
+%token T_DOUBLE_ARROW    "=> (T_DOUBLE_ARROW)"
+%token T_LIST            "list (T_LIST)"
+%token T_ARRAY           "array (T_ARRAY)"
+%token T_CALLABLE        "callable (T_CALLABLE)"
+%token T_LINE            "__LINE__ (T_LINE)"
+%token T_FILE            "__FILE__ (T_FILE)"
+%token T_DIR             "__DIR__ (T_DIR)"
+%token T_CLASS_C         "__CLASS__ (T_CLASS_C)"
+%token T_TRAIT_C         "__TRAIT__ (T_TRAIT_C)"
+%token T_METHOD_C        "__METHOD__ (T_METHOD_C)"
+%token T_FUNC_C          "__FUNCTION__ (T_FUNC_C)"
+%token T_COMMENT         "comment (T_COMMENT)"
+%token T_DOC_COMMENT     "doc comment (T_DOC_COMMENT)"
+%token T_OPEN_TAG        "open tag (T_OPEN_TAG)"
+%token T_OPEN_TAG_WITH_ECHO "open tag with echo (T_OPEN_TAG_WITH_ECHO)"
+%token T_CLOSE_TAG       "close tag (T_CLOSE_TAG)"
+%token T_WHITESPACE      "whitespace (T_WHITESPACE)"
+%token T_START_HEREDOC   "heredoc start (T_START_HEREDOC)"
+%token T_END_HEREDOC     "heredoc end (T_END_HEREDOC)"
+%token T_DOLLAR_OPEN_CURLY_BRACES "${ (T_DOLLAR_OPEN_CURLY_BRACES)"
+%token T_CURLY_OPEN      "{$ (T_CURLY_OPEN)"
+%token T_PAAMAYIM_NEKUDOTAYIM ":: (T_PAAMAYIM_NEKUDOTAYIM)"
+%token T_NAMESPACE       "namespace (T_NAMESPACE)"
+%token T_NS_C            "__NAMESPACE__ (T_NS_C)"
+%token T_NS_SEPARATOR    "\\ (T_NS_SEPARATOR)"
+%token T_ELLIPSIS        "... (T_ELLIPSIS)"
+%token T_COALESCE        "?? (T_COALESCE)"
+%token T_POW             "** (T_POW)"
+%token T_POW_EQUAL       "**= (T_POW_EQUAL)"
+%token T_BAD_CHARACTER   "invalid character (T_BAD_CHARACTER)"
+
+;; Token used to force a parse error from the lexer
+%token T_ERROR
+
+%type <ast> top_statement namespace_name name statement 
function_declaration_statement
+%type <ast> class_declaration_statement trait_declaration_statement
+%type <ast> interface_declaration_statement interface_extends_list
+%type <ast> group_use_declaration inline_use_declarations 
inline_use_declaration
+%type <ast> mixed_group_use_declaration use_declaration 
unprefixed_use_declaration
+%type <ast> unprefixed_use_declarations const_decl inner_statement
+%type <ast> expr optional_expr while_statement for_statement foreach_variable
+%type <ast> foreach_statement declare_statement finally_statement 
unset_variable variable
+%type <ast> extends_from parameter optional_type_without_static argument 
global_var
+%type <ast> static_var class_statement trait_adaptation trait_precedence 
trait_alias
+%type <ast> absolute_trait_method_reference trait_method_reference property 
echo_expr
+%type <ast> new_expr anonymous_class class_name class_name_reference 
simple_variable
+%type <ast> internal_functions_in_yacc
+%type <ast> exit_expr scalar backticks_expr lexical_var function_call 
member_name property_name
+%type <ast> variable_class_name dereferencable_scalar constant class_constant
+%type <ast> fully_dereferencable array_object_dereferencable
+%type <ast> callable_expr callable_variable static_member new_variable
+%type <ast> encaps_var encaps_var_offset isset_variables
+%type <ast> top_statement_list use_declarations const_list 
inner_statement_list if_stmt
+%type <ast> alt_if_stmt for_exprs switch_case_list global_var_list 
static_var_list
+%type <ast> echo_expr_list unset_variables catch_name_list catch_list 
optional_variable parameter_list class_statement_list
+%type <ast> implements_list case_list if_stmt_without_else
+%type <ast> non_empty_parameter_list argument_list non_empty_argument_list 
property_list
+%type <ast> class_const_list class_const_decl class_name_list 
trait_adaptations method_body non_empty_for_exprs
+%type <ast> ctor_arguments alt_if_stmt_without_else trait_adaptation_list 
lexical_vars
+%type <ast> lexical_var_list encaps_list
+%type <ast> array_pair non_empty_array_pair_list array_pair_list 
possible_array_pair
+%type <ast> isset_variable type return_type type_expr type_without_static
+%type <ast> identifier type_expr_without_static union_type_without_static
+%type <ast> inline_function union_type
+
+%type <num> returns_ref function fn is_reference is_variadic variable_modifiers
+%type <num> method_modifiers non_empty_member_modifiers member_modifier
+%type <num> class_modifiers class_modifier use_type backup_fn_flags
+
+%type <ptr> backup_lex_pos
+%type <str> backup_doc_comment
+
+%start start
\ No newline at end of file
diff --git a/admin/phps-mode-automation.el b/admin/phps-mode-automation.el
index 316d33e..6e900a9 100644
--- a/admin/phps-mode-automation.el
+++ b/admin/phps-mode-automation.el
@@ -1,6 +1,6 @@
 ;;; phps-automation --- Generate a Wisent Parser file -*- lexical-binding: t 
-*-
 
-;; Copyright (C) 2018-2019  Free Software Foundation, Inc.
+;; Copyright (C) 2018-2020  Free Software Foundation, Inc.
 
 ;; This file is not part of GNU Emacs.
 
@@ -29,8 +29,39 @@
 
 (let ((php-yacc-url 
"https://raw.githubusercontent.com/php/php-src/master/Zend/zend_language_parser.y";)
       (php-yacc-file (expand-file-name "zend_language_parser.y"))
-      (wisent-destination (expand-file-name "../phps-mode-wy.wy"))
-      (header (expand-file-name "phps-mode-automation-header.wy")))
+      (wisent-destination (expand-file-name 
"../phps-mode-parser-grammar-raw.wy"))
+      (header (expand-file-name "phps-mode-automation-header.wy"))
+      (terminal-replacements (make-hash-table :test 'equal)))
+
+  (puthash "'+'" "ADDITION" terminal-replacements)
+  (puthash "'='" "ASSIGN" terminal-replacements)
+  (puthash "'@'" "AT" terminal-replacements)
+  (puthash "'`'" "BACKTICK" terminal-replacements)
+  (puthash "'&'" "BITWISE_AND" terminal-replacements)
+  (puthash "'|'" "BITWISE_OR" terminal-replacements)
+  (puthash "'}'" "CLOSE_CURLY_BRACKET" terminal-replacements)
+  (puthash "')'" "CLOSE_PARENTHESIS" terminal-replacements)
+  (puthash "']'" "CLOSE_SQUARE_BRACKET" terminal-replacements)
+  (puthash "':'" "COLON" terminal-replacements)
+  (puthash "','" "COMMA" terminal-replacements)
+  (puthash "'$'" "DOLLAR_SIGN" terminal-replacements)
+  (puthash "'\"'" "DOUBLE_QUOTE" terminal-replacements)
+  (puthash "'/'" "DIVISION" terminal-replacements)
+  (puthash "'.'" "DOT" terminal-replacements)
+  (puthash "'>'" "GREATER_THAN" terminal-replacements)
+  (puthash "'<'" "LESSER_THAN" terminal-replacements)
+  (puthash "'%'" "MODULO" terminal-replacements)
+  (puthash "'*'" "MULTIPLICATION" terminal-replacements)
+  (puthash "'!'" "NEGATION" terminal-replacements)
+  (puthash "'{'" "OPEN_CURLY_BRACKET" terminal-replacements)
+  (puthash "'('" "OPEN_PARENTHESIS" terminal-replacements)
+  (puthash "'['" "OPEN_SQUARE_BRACKET" terminal-replacements)
+  (puthash "'^'" "POW" terminal-replacements)
+  (puthash "'?'" "QUESTION_MARK" terminal-replacements)
+  (puthash "';'" "SEMICOLON" terminal-replacements)
+  (puthash "'''" "SINGLE_QUOTE" terminal-replacements)
+  (puthash "'-'" "SUBTRACTION" terminal-replacements)
+  (puthash "'~'" "UNARY" terminal-replacements)
 
   ;; Download Yacc if not available
   (unless (file-exists-p php-yacc-file)
@@ -42,8 +73,14 @@
   (message "Generating Wisent grammar..")
   (if (fboundp 'emacs-wisent-grammar-converter--generate-grammar-from-filename)
       (emacs-wisent-grammar-converter--generate-grammar-from-filename
-       php-yacc-file wisent-destination header "phps-mode-wy-macros--")
-    (display-warning 'warning "Missing emacs-wisent-grammar-converter!"))
+       php-yacc-file
+       wisent-destination
+       header
+       "phps-mode-parser--"
+       terminal-replacements)
+    (display-warning
+     'warning
+     "Missing emacs-wisent-grammar-converter!"))
   (message "Automation completed"))
 
 (provide 'phps-mode-automation)
diff --git a/phps-mode-lex-analyzer.el b/phps-mode-lex-analyzer.el
index 4497595..2c552eb 100644
--- a/phps-mode-lex-analyzer.el
+++ b/phps-mode-lex-analyzer.el
@@ -458,7 +458,7 @@
                    (phps-mode-lex-analyzer--clear-region-syntax-color start 
end)))))
 
            (phps-mode-debug-message
-            (message "Incremental tokens: %s" incremental-tokens)))))
+            (message "Incremental tokens: %s" 
phps-mode-lex-analyzer--tokens)))))
 
      (lambda(result)
        (when (get-buffer buffer-name)
@@ -995,6 +995,7 @@ SQUARE-BRACKET-LEVEL and ROUND-BRACKET-LEVEL."
               (tokens (nreverse (copy-sequence tokens)))
               (nesting-stack nil)
               (nesting-key nil)
+              (nesting-value nil)
               (class-declaration-started-this-line nil)
               (special-control-structure-started-this-line nil)
               (temp-pre-indent nil)
@@ -1398,6 +1399,8 @@ SQUARE-BRACKET-LEVEL and ROUND-BRACKET-LEVEL."
 
                             (setq alternative-control-structure-level (1+ 
alternative-control-structure-level))
 
+                            (setq nesting-value token)
+
                             (phps-mode-debug-message
                              (message
                               "\nIncreasing alternative-control-structure 
after %s %s to %s\n"
@@ -1425,6 +1428,7 @@ SQUARE-BRACKET-LEVEL and ROUND-BRACKET-LEVEL."
                 ;; Support extra special control structures (CASE)
                 (when (and after-extra-special-control-structure
                            (string= token ":"))
+                  (setq nesting-value token)
                   (setq alternative-control-structure-level (1+ 
alternative-control-structure-level))
                   (when after-extra-special-control-structure-first-on-line
                     (setq first-token-is-nesting-decrease t))
@@ -1474,6 +1478,7 @@ SQUARE-BRACKET-LEVEL and ROUND-BRACKET-LEVEL."
                   (setq after-special-control-structure-token token)
                   (setq alternative-control-structure-line 
token-start-line-number)
                   (setq nesting-key token)
+                  (setq nesting-value nil)
                   (setq special-control-structure-started-this-line t)
 
                   ;; ELSE and ELSEIF after a IF, ELSE, ELESIF
@@ -1569,7 +1574,8 @@ SQUARE-BRACKET-LEVEL and ROUND-BRACKET-LEVEL."
                                (equal token 'T_OR_EQUAL)
                                (equal token 'T_XOR_EQUAL)
                                (equal token 'T_COALESCE_EQUAL)))
-                  (phps-mode-debug-message "Started assignment")
+                  (phps-mode-debug-message
+                   (message "Started assignment at token: %s" token))
                   (setq in-assignment t)
                   (push round-bracket-level in-assignment-round-bracket-level)
                   (push square-bracket-level 
in-assignment-square-bracket-level)
@@ -1639,6 +1645,7 @@ SQUARE-BRACKET-LEVEL and ROUND-BRACKET-LEVEL."
                 (when (equal token 'T_CASE)
                   (setq after-extra-special-control-structure t)
                   (setq nesting-key token)
+                  (setq nesting-value nil)
                   (setq after-extra-special-control-structure-first-on-line 
first-token-on-line)
 
                   (when (and switch-case-alternative-stack
@@ -1829,11 +1836,11 @@ SQUARE-BRACKET-LEVEL and ROUND-BRACKET-LEVEL."
                             nesting-start
                             nesting-end
                             nesting-key
-                            token
+                            nesting-value
                             nesting-end
                             (car (cdr (car nesting-stack))))
                            )
-                          (push `(,nesting-stack-end ,nesting-end ,nesting-key 
,token) nesting-stack)))
+                          (push `(,nesting-stack-end ,nesting-end ,nesting-key 
,nesting-value) nesting-stack)))
 
 
                       ;; Does token span over several lines and is it not a 
INLINE_HTML token?
diff --git a/phps-mode-lexer.el b/phps-mode-lexer.el
index 24d9bbc..c1990b4 100644
--- a/phps-mode-lexer.el
+++ b/phps-mode-lexer.el
@@ -32,7 +32,7 @@
 
 
 (require 'phps-mode-macros)
-(require 'phps-mode-wy-macros)
+(require 'phps-mode-parser-grammar-macro)
 
 (require 'semantic)
 (require 'semantic/lex)
@@ -45,8 +45,8 @@
 ;; INITIALIZE SETTINGS
 
 
-(phps-mode-wy-macros--CG 'PARSER_MODE t)
-(phps-mode-wy-macros--CG 'SHORT_TAGS t)
+(phps-mode-parser-grammar-macro-CG 'PARSER_MODE t)
+(phps-mode-parser-grammar-macro-CG 'SHORT_TAGS t)
 
 
 ;; SETTINGS
@@ -233,7 +233,7 @@
 
 (defun phps-mode-lexer--RETURN_OR_SKIP_TOKEN (token start end)
   "Return TOKEN with START and END but only in parse-mode."
-  (when (phps-mode-wy-macros--CG 'PARSER_MODE)
+  (when (phps-mode-parser-grammar-macro-CG 'PARSER_MODE)
     (phps-mode-lexer--RETURN_TOKEN token start end)))
 
 
@@ -471,7 +471,7 @@
        (let* ((start (match-beginning 0))
               (end (match-end 0))
               (data (buffer-substring-no-properties start end)))
-         (if (phps-mode-wy-macros--CG 'PARSER_MODE)
+         (if (phps-mode-parser-grammar-macro-CG 'PARSER_MODE)
              (phps-mode-lexer--MOVE_FORWARD end)
            (phps-mode-lexer--RETURN_TOKEN data start end))))
 
@@ -551,7 +551,7 @@
               "\\(real\\)"
               phps-mode-lexer--TABS_AND_SPACES
               ")")))
-       (when (phps-mode-wy-macros--CG 'PARSER_MODE)
+       (when (phps-mode-parser-grammar-macro-CG 'PARSER_MODE)
          (signal
           'phps-lexer-error
           (list
@@ -969,7 +969,7 @@
        (let ((start (match-beginning 0))
              (end (match-end 0)))
          (phps-mode-lexer--BEGIN 'ST_IN_SCRIPTING)
-         (when (phps-mode-wy-macros--CG 'PARSER_MODE)
+         (when (phps-mode-parser-grammar-macro-CG 'PARSER_MODE)
            (phps-mode-lexer--RETURN_TOKEN 'T_ECHO start end))
          (phps-mode-lexer--RETURN_TOKEN 'T_OPEN_TAG_WITH_ECHO start end)))
 
@@ -1000,7 +1000,7 @@
             start
             end))
 
-          ((phps-mode-wy-macros--CG 'SHORT_TAGS)
+          ((phps-mode-parser-grammar-macro-CG 'SHORT_TAGS)
            (phps-mode-lexer--yyless 3)
            (setq end (- end 3))
            (phps-mode-lexer--BEGIN 'ST_IN_SCRIPTING)
@@ -1014,7 +1014,7 @@
 
       (phps-mode-lexer--match-macro
        (and ST_INITIAL (looking-at "<\\?"))
-       (when (phps-mode-wy-macros--CG 'SHORT_TAGS)
+       (when (phps-mode-parser-grammar-macro-CG 'SHORT_TAGS)
          (let ((start (match-beginning 0))
                (end (match-end 0)))
            (phps-mode-lexer--BEGIN 'ST_IN_SCRIPTING)
@@ -1128,7 +1128,7 @@
          (when (= (- end start) 3)
            (setq end (1- end)))
          (phps-mode-lexer--BEGIN 'ST_INITIAL)
-         (when (phps-mode-wy-macros--CG 'PARSER_MODE)
+         (when (phps-mode-parser-grammar-macro-CG 'PARSER_MODE)
            (phps-mode-lexer--RETURN_TOKEN ";" start end))
          (phps-mode-lexer--RETURN_TOKEN 'T_CLOSE_TAG start end)))
 
diff --git a/phps-mode-macros.el b/phps-mode-macros.el
index 8bed5e7..5b7e17f 100644
--- a/phps-mode-macros.el
+++ b/phps-mode-macros.el
@@ -1,6 +1,6 @@
 ;;; phps-mode-macros.el --- Macros for major mode -*- lexical-binding: t -*-
 
-;; Copyright (C) 2018-2019  Free Software Foundation, Inc.
+;; Copyright (C) 2018-2020  Free Software Foundation, Inc.
 
 ;;; Commentary:
 
diff --git a/phps-mode-parser-grammar-macro.el 
b/phps-mode-parser-grammar-macro.el
new file mode 100644
index 0000000..324437c
--- /dev/null
+++ b/phps-mode-parser-grammar-macro.el
@@ -0,0 +1,82 @@
+;;; phps-mode-parser-grammar-macro.el
+
+(require 'semantic/wisent/grammar)
+
+(defvar phps-mode-parser-grammar-macro-CG-data
+  (make-hash-table :test 'equal)
+  "A hash-table with all settings.")
+
+(defun phps-mode-parser-grammar-macro-CG (subject &optional value)
+  "Return and optionally set VALUE of SUBJECT."
+  (if value
+      (puthash subject value phps-mode-parser-grammar-macro-CG-data)
+    (gethash subject phps-mode-parser-grammar-macro-CG-data)))
+
+(defun phps-mode-parser-grammar-macro-ZEND_AST_CREATE (symbol value &rest 
attributes)
+  "Create AST SYMBOL with VALUE."
+  `(wisent-raw-tag
+    (semantic-tag ,symbol ,value ,@attributes)))
+
+(defun phps-mode-parser-grammar-macro-ZEND_AST_CREATE_ASSIGN_OP (symbol 
subject object)
+  "Create AST assignment."
+  `(wisent-raw-tag
+    (semantic-tag ,symbol 'ZEND_AST_ASSIGN_OP :object ,object :subject 
,subject)))
+
+(defun phps-mode-parser-grammar-macro-ZEND_AST_CREATE_BINARY_OP (symbol 
subject object)
+  "Create AST assignment."
+  `(wisent-raw-tag
+    (semantic-tag ,symbol 'ZEND_AST_BINARY_OP :object ,object :subject 
,subject)))
+
+(defun phps-mode-parser-grammar-macro-ZEND_AST_CREATE_CAST (symbol subject)
+  "Create cast."
+  `(wisent-raw-tag
+    (semantic-tag ,symbol 'ZEND_AST_CAST :subject ,subject)))
+
+(defun phps-mode-parser-grammar-macro-ZEND_AST_CREATE_EX (symbol operator 
&optional subject subject2)
+  "Create stuff."
+  (let ((attributes `(:operator ,operator)))
+    (when subject
+      (plist-put attributes :subject subject))
+    (when subject2
+      (plist-put attributes :subject2 subject2))
+    `(wisent-raw-tag
+      (semantic-tag ,symbol 'ZEND_AST_EX ,@attributes))))
+
+(defun phps-mode-parser-grammar-macro-ZEND_AST_LIST_RTRIM (subject)
+  `(wisent-raw-tag
+    (semantic-tag ,subject 'ZEND_AST_LIST_RTRIM)))
+
+(defun phps-mode-parser-grammar-macro-ZEND_AST_CREATE_LIST (size type &rest 
elements)
+  `(wisent-raw-tag
+    (semantic-tag "" ,type :elements @elements :size ,size)))
+
+(defun phps-mode-parser-grammar-macro-ZEND_AST_LIST_ADD (array new-element)
+  `(wisent-raw-tag
+    (semantic-tag ,array 'ZEND_AST_LIST_ADD :new-element ,new-element)))
+
+(defun phps-mode-parser-grammar-macro-ZEND_NEGATE_NUM_STRING (num-string)
+  `(* (string-to-number ,num-string) -1))
+
+(defun phps-mode-parser-grammar-macro-ZEND_AST_CREATE_CLASS_CONST_OR_NAME 
(object member)
+  `(wisent-raw-tag
+    (semantic-tag ,object 'ZEND_AST_CLASS_CONST_OR_NAME :member ,member)))
+
+(defun phps-mode-parser-grammar-macro-ZVAL_INTERNED_STR (callback string)
+  "Convert string to symbol."
+  `(let ((symbol ',string))
+     (funcall callback symbol)))
+
+(defun phps-mode-parser-grammar-macro-ZEND_AST_CREATE_ZVAL_EX (subject symbol)
+  `(wisent-raw-tag
+    (semantic-tag ,subject ,symbol)))
+
+(defun phps-mode-parser-grammar-macro-ZEND_AST_CREATE_ZVAL (subject)
+  `(wisent-raw-tag
+    (semantic-tag ,subject 'ZEND_AST_ZVAL :attr 0)))
+
+(defun phps-mode-parser-grammar-macro-ZEND_LEX_TSTRING (callback)
+  (let ((token (semantic-lex (point) (point-max) nil 1)))
+    (funcall callback token)))
+
+(provide 'phps-mode-parser-grammar-macro)
+;;; phps-mode-parser-grammar-macro.el ends here
diff --git a/phps-mode-parser-grammar-raw.wy b/phps-mode-parser-grammar-raw.wy
new file mode 100644
index 0000000..c52a375
--- /dev/null
+++ b/phps-mode-parser-grammar-raw.wy
@@ -0,0 +1,1245 @@
+;;; phps.wy --- Semantic LALR grammar for PHP -*- lexical-binding: t -*-
+
+;; Copyright (C) 2018-2020  Free Software Foundation, Inc.
+
+;; This file is not part of GNU Emacs.
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2, or (at
+;; your option) any later version.
+
+;; This program is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;; General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+
+
+;;; Commentary:
+
+;; Run `(wisent-make-parsers)' or "C-c C-c" to generate grammar-file in Emacs 
Lisp.
+;;
+;; To debug (setq wisent-verbose-flag t) and check buffer *wisent-log*
+;;
+;; Based on the Zend PHP Parser YACC 
https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y
+
+;; Create macros for all macros uses in original YACC, base macro structure on 
semantic-php-wy-macro.el
+
+;; Don't edit phps.wy because it's generated by phps-automation.el and 
phps-automation-header.wy
+
+;; Check semantic/wisent/grammar.el for macro definitions
+
+;; To force compile grammar use: (semantic-grammar-create-package t)
+
+
+;;; Code:
+
+%package phps-mode
+%provide phps-mode-wy
+
+%languagemode phps-mode
+
+%{
+  (setq max-specpdl-size 160000)
+}
+
+%use-macros phps-mode-parser-grammar-macro
+{
+ ZEND_AST_CREATE
+ ZEND_AST_CREATE_ASSIGN_OP
+ ZEND_AST_CREATE_BINARY_OP
+ ZEND_AST_CREATE_CAST
+ ZEND_AST_CREATE_CLASS_CONST_OR_NAME
+ ZEND_AST_CREATE_EX
+ ZEND_AST_CREATE_LIST
+ ZEND_AST_CREATE_ZVAL
+ ZEND_AST_LIST_ADD
+ ZEND_AST_LIST_RTRIM
+ ZEND_LEX_TSTRING
+ ZEND_NEGATE_NUM_STRING
+ ZVAL_INTERNED_STR
+}
+
+%precedence T_THROW
+%precedence PREC_ARROW_FUNCTION
+%precedence T_INCLUDE T_INCLUDE_ONCE T_REQUIRE T_REQUIRE_ONCE
+%left T_LOGICAL_OR
+%left T_LOGICAL_XOR
+%left T_LOGICAL_AND
+%precedence T_PRINT
+%precedence T_YIELD
+%precedence T_DOUBLE_ARROW
+%precedence T_YIELD_FROM
+%precedence '=' T_PLUS_EQUAL T_MINUS_EQUAL T_MUL_EQUAL T_DIV_EQUAL 
T_CONCAT_EQUAL T_MOD_EQUAL T_AND_EQUAL T_OR_EQUAL T_XOR_EQUAL T_SL_EQUAL 
T_SR_EQUAL T_POW_EQUAL T_COALESCE_EQUAL
+%left '?' ':'
+%right T_COALESCE
+%left T_BOOLEAN_OR
+%left T_BOOLEAN_AND
+%left '|'
+%left '^'
+%left '&'
+%nonassoc T_IS_EQUAL T_IS_NOT_EQUAL T_IS_IDENTICAL T_IS_NOT_IDENTICAL 
T_SPACESHIP
+%nonassoc '<' T_IS_SMALLER_OR_EQUAL '>' T_IS_GREATER_OR_EQUAL
+%left '.'
+%left T_SL T_SR
+%left '+' '-'
+%left '*' '/' '%'
+%precedence '!'
+%precedence T_INSTANCEOF
+%precedence '~' T_INT_CAST T_DOUBLE_CAST T_STRING_CAST T_ARRAY_CAST 
T_OBJECT_CAST T_BOOL_CAST T_UNSET_CAST '@'
+%right T_POW
+%precedence T_CLONE
+
+;; Resolve danging else conflict
+%precedence T_NOELSE
+%precedence T_ELSEIF
+%precedence T_ELSE
+
+%token <ast> T_LNUMBER   "integer number (T_LNUMBER)"
+%token <ast> T_DNUMBER   "floating-point number (T_DNUMBER)"
+%token <ast> T_STRING    "identifier (T_STRING)"
+%token <ast> T_VARIABLE  "variable (T_VARIABLE)"
+%token <ast> T_INLINE_HTML
+%token <ast> T_ENCAPSED_AND_WHITESPACE  "quoted-string and whitespace 
(T_ENCAPSED_AND_WHITESPACE)"
+%token <ast> T_CONSTANT_ENCAPSED_STRING "quoted-string 
(T_CONSTANT_ENCAPSED_STRING)"
+%token <ast> T_STRING_VARNAME "variable name (T_STRING_VARNAME)"
+%token <ast> T_NUM_STRING "number (T_NUM_STRING)"
+
+%type <punctuation>
+%token <punctuation> ADDITION "+"
+%token <punctuation> ASSIGN "="
+%token <punctuation> AT "@"
+%token <punctuation> BACKTICK "`"
+%token <punctuation> BITWISE_AND "&"
+%token <punctuation> BITWISE_OR "|"
+%token <punctuation> CLOSE_CURLY_BRACKET "]"
+%token <punctuation> CLOSE_PARENTHESIS ")"
+%token <punctuation> CLOSE_SQUARE_BRACKET "]"
+%token <punctuation> COLON ":"
+%token <punctuation> COMMA ","
+%token <punctuation> DOLLAR_SIGN "$"
+%token <punctuation> DOUBLE_QUOTE "\""
+%token <punctuation> DIVISION "/"
+%token <punctuation> DOT "."
+%token <punctuation> GREATER_THAN ">"
+%token <punctuation> LESSER_THAN "<"
+%token <punctuation> MODULO "%"
+%token <punctuation> MULTIPLICATION "*"
+%token <punctuation> NEGATION "!"
+%token <punctuation> OPEN_CURLY_BRACKET "{"
+%token <punctuation> OPEN_PARENTHESIS "("
+%token <punctuation> OPEN_SQUARE_BRACKET "["
+%token <punctuation> POW "^"
+%token <punctuation> QUESTION_MARK "?"
+%token <punctuation> SINGLE_QUOTE "'"
+%token <punctuation> SUBTRACTION "-"
+%token <punctuation> UNARY "~"
+
+%token END 0 "end of file"
+%token T_INCLUDE      "include (T_INCLUDE)"
+%token T_INCLUDE_ONCE "include_once (T_INCLUDE_ONCE)"
+%token T_EVAL         "eval (T_EVAL)"
+%token T_REQUIRE      "require (T_REQUIRE)"
+%token T_REQUIRE_ONCE "require_once (T_REQUIRE_ONCE)"
+%token T_LOGICAL_OR   "or (T_LOGICAL_OR)"
+%token T_LOGICAL_XOR  "xor (T_LOGICAL_XOR)"
+%token T_LOGICAL_AND  "and (T_LOGICAL_AND)"
+%token T_PRINT        "print (T_PRINT)"
+%token T_YIELD        "yield (T_YIELD)"
+%token T_YIELD_FROM   "yield from (T_YIELD_FROM)"
+%token T_PLUS_EQUAL   "+= (T_PLUS_EQUAL)"
+%token T_MINUS_EQUAL  "-= (T_MINUS_EQUAL)"
+%token T_MUL_EQUAL    "*= (T_MUL_EQUAL)"
+%token T_DIV_EQUAL    "/= (T_DIV_EQUAL)"
+%token T_CONCAT_EQUAL ".= (T_CONCAT_EQUAL)"
+%token T_MOD_EQUAL    "%= (T_MOD_EQUAL)"
+%token T_AND_EQUAL    "&= (T_AND_EQUAL)"
+%token T_OR_EQUAL     "|= (T_OR_EQUAL)"
+%token T_XOR_EQUAL    "^= (T_XOR_EQUAL)"
+%token T_SL_EQUAL     "<<= (T_SL_EQUAL)"
+%token T_SR_EQUAL     ">>= (T_SR_EQUAL)"
+%token T_COALESCE_EQUAL "??= (T_COALESCE_EQUAL)"
+%token T_BOOLEAN_OR   "|| (T_BOOLEAN_OR)"
+%token T_BOOLEAN_AND  "&& (T_BOOLEAN_AND)"
+%token T_IS_EQUAL     "== (T_IS_EQUAL)"
+%token T_IS_NOT_EQUAL "!= (T_IS_NOT_EQUAL)"
+%token T_IS_IDENTICAL "=== (T_IS_IDENTICAL)"
+%token T_IS_NOT_IDENTICAL "!== (T_IS_NOT_IDENTICAL)"
+%token T_IS_SMALLER_OR_EQUAL "<= (T_IS_SMALLER_OR_EQUAL)"
+%token T_IS_GREATER_OR_EQUAL ">= (T_IS_GREATER_OR_EQUAL)"
+%token T_SPACESHIP "<=> (T_SPACESHIP)"
+%token T_SL "<< (T_SL)"
+%token T_SR ">> (T_SR)"
+%token T_INSTANCEOF  "instanceof (T_INSTANCEOF)"
+%token T_INC "++ (T_INC)"
+%token T_DEC "-- (T_DEC)"
+%token T_INT_CAST    "(int) (T_INT_CAST)"
+%token T_DOUBLE_CAST "(double) (T_DOUBLE_CAST)"
+%token T_STRING_CAST "(string) (T_STRING_CAST)"
+%token T_ARRAY_CAST  "(array) (T_ARRAY_CAST)"
+%token T_OBJECT_CAST "(object) (T_OBJECT_CAST)"
+%token T_BOOL_CAST   "(bool) (T_BOOL_CAST)"
+%token T_UNSET_CAST  "(unset) (T_UNSET_CAST)"
+%token T_NEW       "new (T_NEW)"
+%token T_CLONE     "clone (T_CLONE)"
+%token T_EXIT      "exit (T_EXIT)"
+%token T_IF        "if (T_IF)"
+%token T_ELSEIF    "elseif (T_ELSEIF)"
+%token T_ELSE      "else (T_ELSE)"
+%token T_ENDIF     "endif (T_ENDIF)"
+%token T_ECHO       "echo (T_ECHO)"
+%token T_DO         "do (T_DO)"
+%token T_WHILE      "while (T_WHILE)"
+%token T_ENDWHILE   "endwhile (T_ENDWHILE)"
+%token T_FOR        "for (T_FOR)"
+%token T_ENDFOR     "endfor (T_ENDFOR)"
+%token T_FOREACH    "foreach (T_FOREACH)"
+%token T_ENDFOREACH "endforeach (T_ENDFOREACH)"
+%token T_DECLARE    "declare (T_DECLARE)"
+%token T_ENDDECLARE "enddeclare (T_ENDDECLARE)"
+%token T_AS         "as (T_AS)"
+%token T_SWITCH     "switch (T_SWITCH)"
+%token T_ENDSWITCH  "endswitch (T_ENDSWITCH)"
+%token T_CASE       "case (T_CASE)"
+%token T_DEFAULT    "default (T_DEFAULT)"
+%token T_BREAK      "break (T_BREAK)"
+%token T_CONTINUE   "continue (T_CONTINUE)"
+%token T_GOTO       "goto (T_GOTO)"
+%token T_FUNCTION   "function (T_FUNCTION)"
+%token T_FN         "fn (T_FN)"
+%token T_CONST      "const (T_CONST)"
+%token T_RETURN     "return (T_RETURN)"
+%token T_TRY        "try (T_TRY)"
+%token T_CATCH      "catch (T_CATCH)"
+%token T_FINALLY    "finally (T_FINALLY)"
+%token T_THROW      "throw (T_THROW)"
+%token T_USE        "use (T_USE)"
+%token T_INSTEADOF  "insteadof (T_INSTEADOF)"
+%token T_GLOBAL     "global (T_GLOBAL)"
+%token T_STATIC     "static (T_STATIC)"
+%token T_ABSTRACT   "abstract (T_ABSTRACT)"
+%token T_FINAL      "final (T_FINAL)"
+%token T_PRIVATE    "private (T_PRIVATE)"
+%token T_PROTECTED  "protected (T_PROTECTED)"
+%token T_PUBLIC     "public (T_PUBLIC)"
+%token T_VAR        "var (T_VAR)"
+%token T_UNSET      "unset (T_UNSET)"
+%token T_ISSET      "isset (T_ISSET)"
+%token T_EMPTY      "empty (T_EMPTY)"
+%token T_HALT_COMPILER "__halt_compiler (T_HALT_COMPILER)"
+%token T_CLASS      "class (T_CLASS)"
+%token T_TRAIT      "trait (T_TRAIT)"
+%token T_INTERFACE  "interface (T_INTERFACE)"
+%token T_EXTENDS    "extends (T_EXTENDS)"
+%token T_IMPLEMENTS "implements (T_IMPLEMENTS)"
+%token T_OBJECT_OPERATOR "-> (T_OBJECT_OPERATOR)"
+%token T_DOUBLE_ARROW    "=> (T_DOUBLE_ARROW)"
+%token T_LIST            "list (T_LIST)"
+%token T_ARRAY           "array (T_ARRAY)"
+%token T_CALLABLE        "callable (T_CALLABLE)"
+%token T_LINE            "__LINE__ (T_LINE)"
+%token T_FILE            "__FILE__ (T_FILE)"
+%token T_DIR             "__DIR__ (T_DIR)"
+%token T_CLASS_C         "__CLASS__ (T_CLASS_C)"
+%token T_TRAIT_C         "__TRAIT__ (T_TRAIT_C)"
+%token T_METHOD_C        "__METHOD__ (T_METHOD_C)"
+%token T_FUNC_C          "__FUNCTION__ (T_FUNC_C)"
+%token T_COMMENT         "comment (T_COMMENT)"
+%token T_DOC_COMMENT     "doc comment (T_DOC_COMMENT)"
+%token T_OPEN_TAG        "open tag (T_OPEN_TAG)"
+%token T_OPEN_TAG_WITH_ECHO "open tag with echo (T_OPEN_TAG_WITH_ECHO)"
+%token T_CLOSE_TAG       "close tag (T_CLOSE_TAG)"
+%token T_WHITESPACE      "whitespace (T_WHITESPACE)"
+%token T_START_HEREDOC   "heredoc start (T_START_HEREDOC)"
+%token T_END_HEREDOC     "heredoc end (T_END_HEREDOC)"
+%token T_DOLLAR_OPEN_CURLY_BRACES "${ (T_DOLLAR_OPEN_CURLY_BRACES)"
+%token T_CURLY_OPEN      "{$ (T_CURLY_OPEN)"
+%token T_PAAMAYIM_NEKUDOTAYIM ":: (T_PAAMAYIM_NEKUDOTAYIM)"
+%token T_NAMESPACE       "namespace (T_NAMESPACE)"
+%token T_NS_C            "__NAMESPACE__ (T_NS_C)"
+%token T_NS_SEPARATOR    "\\ (T_NS_SEPARATOR)"
+%token T_ELLIPSIS        "... (T_ELLIPSIS)"
+%token T_COALESCE        "?? (T_COALESCE)"
+%token T_POW             "** (T_POW)"
+%token T_POW_EQUAL       "**= (T_POW_EQUAL)"
+%token T_BAD_CHARACTER   "invalid character (T_BAD_CHARACTER)"
+
+;; Token used to force a parse error from the lexer
+%token T_ERROR
+
+%type <ast> top_statement namespace_name name statement 
function_declaration_statement
+%type <ast> class_declaration_statement trait_declaration_statement
+%type <ast> interface_declaration_statement interface_extends_list
+%type <ast> group_use_declaration inline_use_declarations 
inline_use_declaration
+%type <ast> mixed_group_use_declaration use_declaration 
unprefixed_use_declaration
+%type <ast> unprefixed_use_declarations const_decl inner_statement
+%type <ast> expr optional_expr while_statement for_statement foreach_variable
+%type <ast> foreach_statement declare_statement finally_statement 
unset_variable variable
+%type <ast> extends_from parameter optional_type_without_static argument 
global_var
+%type <ast> static_var class_statement trait_adaptation trait_precedence 
trait_alias
+%type <ast> absolute_trait_method_reference trait_method_reference property 
echo_expr
+%type <ast> new_expr anonymous_class class_name class_name_reference 
simple_variable
+%type <ast> internal_functions_in_yacc
+%type <ast> exit_expr scalar backticks_expr lexical_var function_call 
member_name property_name
+%type <ast> variable_class_name dereferencable_scalar constant class_constant
+%type <ast> fully_dereferencable array_object_dereferencable
+%type <ast> callable_expr callable_variable static_member new_variable
+%type <ast> encaps_var encaps_var_offset isset_variables
+%type <ast> top_statement_list use_declarations const_list 
inner_statement_list if_stmt
+%type <ast> alt_if_stmt for_exprs switch_case_list global_var_list 
static_var_list
+%type <ast> echo_expr_list unset_variables catch_name_list catch_list 
optional_variable parameter_list class_statement_list
+%type <ast> implements_list case_list if_stmt_without_else
+%type <ast> non_empty_parameter_list argument_list non_empty_argument_list 
property_list
+%type <ast> class_const_list class_const_decl class_name_list 
trait_adaptations method_body non_empty_for_exprs
+%type <ast> ctor_arguments alt_if_stmt_without_else trait_adaptation_list 
lexical_vars
+%type <ast> lexical_var_list encaps_list
+%type <ast> array_pair non_empty_array_pair_list array_pair_list 
possible_array_pair
+%type <ast> isset_variable type return_type type_expr type_without_static
+%type <ast> identifier type_expr_without_static union_type_without_static
+%type <ast> inline_function union_type
+
+%type <num> returns_ref function fn is_reference is_variadic variable_modifiers
+%type <num> method_modifiers non_empty_member_modifiers member_modifier
+%type <num> class_modifiers class_modifier use_type backup_fn_flags
+
+%type <ptr> backup_lex_pos
+%type <str> backup_doc_comment
+
+%start start
+
+;; NOTE Generated grammar starts here
+
+
+start:
+    top_statement_list (let ((r)) (CG 'phps-mode-parser--ast $1) r)
+    ;
+
+reserved_non_modifiers:
+    T_INCLUDE
+    | T_INCLUDE_ONCE
+    | T_EVAL
+    | T_REQUIRE
+    | T_REQUIRE_ONCE
+    | T_LOGICAL_OR
+    | T_LOGICAL_XOR
+    | T_LOGICAL_AND
+    | T_INSTANCEOF
+    | T_NEW
+    | T_CLONE
+    | T_EXIT
+    | T_IF
+    | T_ELSEIF
+    | T_ELSE
+    | T_ENDIF
+    | T_ECHO
+    | T_DO
+    | T_WHILE
+    | T_ENDWHILE
+    | T_FOR
+    | T_ENDFOR
+    | T_FOREACH
+    | T_ENDFOREACH
+    | T_DECLARE
+    | T_ENDDECLARE
+    | T_AS
+    | T_TRY
+    | T_CATCH
+    | T_FINALLY
+    | T_THROW
+    | T_USE
+    | T_INSTEADOF
+    | T_GLOBAL
+    | T_VAR
+    | T_UNSET
+    | T_ISSET
+    | T_EMPTY
+    | T_CONTINUE
+    | T_GOTO
+    | T_FUNCTION
+    | T_CONST
+    | T_RETURN
+    | T_PRINT
+    | T_YIELD
+    | T_LIST
+    | T_SWITCH
+    | T_ENDSWITCH
+    | T_CASE
+    | T_DEFAULT
+    | T_BREAK
+    | T_ARRAY
+    | T_CALLABLE
+    | T_EXTENDS
+    | T_IMPLEMENTS
+    | T_NAMESPACE
+    | T_TRAIT
+    | T_INTERFACE
+    | T_CLASS
+    | T_CLASS_C
+    | T_TRAIT_C
+    | T_FUNC_C
+    | T_METHOD_C
+    | T_LINE
+    | T_FILE
+    | T_DIR
+    | T_NS_C
+    | T_FN
+    ;
+
+semi_reserved:
+    reserved_non_modifiers
+    | T_STATIC
+    | T_ABSTRACT
+    | T_FINAL
+    | T_PRIVATE
+    | T_PROTECTED
+    | T_PUBLIC
+    ;
+
+identifier:
+    T_STRING (let ((r)) (setq r $1) r)
+    | semi_reserved (let ((r)(zv)) (ZEND_LEX_TSTRING (lambda(return) (setq zv 
return)))(setq r (ZEND_AST_CREATE_ZVAL zv)) r)
+    ;
+
+top_statement_list:
+    top_statement_list top_statement (let ((r)) (setq r (ZEND_AST_LIST_ADD $1 
$2)) r)
+    | empty (let ((r)) (setq r (ZEND_AST_CREATE_LIST 0 
'phps-mode-parser--ZEND_AST_STMT_LIST)) r)
+    ;
+
+namespace_name:
+    T_STRING (let ((r)) (setq r $1) r)
+    | namespace_name T_NS_SEPARATOR T_STRING (let ((r)) (setq r 
(ZEND_AST_APPEND_STR $1 $3)) r)
+    ;
+
+name:
+    namespace_name (let ((r)) (setq r $1)(semantic-tag-put-attribute r 'attr 
'phps-mode-parser--ZEND_NAME_NOT_FQ) r)
+    | T_NAMESPACE T_NS_SEPARATOR namespace_name (let ((r)) (setq r 
$3)(semantic-tag-put-attribute r 'attr 'phps-mode-parser--ZEND_NAME_RELATIVE) r)
+    | T_NS_SEPARATOR namespace_name (let ((r)) (setq r 
$2)(semantic-tag-put-attribute r 'attr 'phps-mode-parser--ZEND_NAME_FQ) r)
+    ;
+
+top_statement:
+    statement (let ((r)) (setq r $1) r)
+    | function_declaration_statement (let ((r)) (setq r $1) r)
+    | class_declaration_statement (let ((r)) (setq r $1) r)
+    | trait_declaration_statement (let ((r)) (setq r $1) r)
+    | interface_declaration_statement (let ((r)) (setq r $1) r)
+    | T_HALT_COMPILER OPEN_PARENTHESIS CLOSE_PARENTHESIS SEMICOLON (let ((r)) 
(setq r (ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_HALT_COMPILER 
(ZEND_AST_CREATE_ZVAL_FROM_LONG 
(ZEND_GET_SCANNED_FILE_OFFSET))))(ZEND_STOP_LEXING) r)
+    | T_NAMESPACE namespace_name SEMICOLON (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_NAMESPACE $2 nil))(RESET_DOC_COMMENT) r)
+    | T_NAMESPACE namespace_name (let ((r)) (RESET_DOC_COMMENT) r) 
OPEN_CURLY_BRACKET top_statement_list CLOSE_CURLY_BRACKET (let ((r)) (setq r 
(ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_NAMESPACE $2 $5)) r)
+    | T_NAMESPACE (let ((r)) (RESET_DOC_COMMENT) r) OPEN_CURLY_BRACKET 
top_statement_list CLOSE_CURLY_BRACKET (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_NAMESPACE nil $4)) r)
+    | T_USE mixed_group_use_declaration SEMICOLON (let ((r)) (setq r $2) r)
+    | T_USE use_type group_use_declaration SEMICOLON (let ((r)) (setq r 
$3)(semantic-tag-put-attribute r 'attr $2) r)
+    | T_USE use_declarations SEMICOLON (let ((r)) (setq r 
$2)(semantic-tag-put-attribute r 'attr 'phps-mode-parser--ZEND_SYMBOL_CLASS) r)
+    | T_USE use_type use_declarations SEMICOLON (let ((r)) (setq r 
$3)(semantic-tag-put-attribute r 'attr $2) r)
+    | T_CONST const_list SEMICOLON (let ((r)) (setq r $2) r)
+    ;
+
+use_type:
+    T_FUNCTION (let ((r)) (setq r 'phps-mode-parser--ZEND_SYMBOL_FUNCTION) r)
+    | T_CONST (let ((r)) (setq r 'phps-mode-parser--ZEND_SYMBOL_CONST) r)
+    ;
+
+group_use_declaration:
+    namespace_name T_NS_SEPARATOR OPEN_CURLY_BRACKET 
unprefixed_use_declarations possible_comma CLOSE_CURLY_BRACKET (let ((r)) (setq 
r (ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_GROUP_USE $1 $4)) r)
+    | T_NS_SEPARATOR namespace_name T_NS_SEPARATOR OPEN_CURLY_BRACKET 
unprefixed_use_declarations possible_comma CLOSE_CURLY_BRACKET (let ((r)) (setq 
r (ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_GROUP_USE $2 $5)) r)
+    ;
+
+mixed_group_use_declaration:
+    namespace_name T_NS_SEPARATOR OPEN_CURLY_BRACKET inline_use_declarations 
possible_comma CLOSE_CURLY_BRACKET (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_GROUP_USE $1 $4)) r)
+    | T_NS_SEPARATOR namespace_name T_NS_SEPARATOR OPEN_CURLY_BRACKET 
inline_use_declarations possible_comma CLOSE_CURLY_BRACKET (let ((r)) (setq r 
(ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_GROUP_USE $2 $5)) r)
+    ;
+
+possible_comma:
+    empty
+    | COMMA
+    ;
+
+inline_use_declarations:
+    inline_use_declarations COMMA inline_use_declaration (let ((r)) (setq r 
(ZEND_AST_LIST_ADD $1 $3)) r)
+    | inline_use_declaration (let ((r)) (setq r (ZEND_AST_CREATE_LIST 1 
'phps-mode-parser--ZEND_AST_USE $1)) r)
+    ;
+
+unprefixed_use_declarations:
+    unprefixed_use_declarations COMMA unprefixed_use_declaration (let ((r)) 
(setq r (ZEND_AST_LIST_ADD $1 $3)) r)
+    | unprefixed_use_declaration (let ((r)) (setq r (ZEND_AST_CREATE_LIST 1 
'phps-mode-parser--ZEND_AST_USE $1)) r)
+    ;
+
+use_declarations:
+    use_declarations COMMA use_declaration (let ((r)) (setq r 
(ZEND_AST_LIST_ADD $1 $3)) r)
+    | use_declaration (let ((r)) (setq r (ZEND_AST_CREATE_LIST 1 
'phps-mode-parser--ZEND_AST_USE $1)) r)
+    ;
+
+inline_use_declaration:
+    unprefixed_use_declaration (let ((r)) (setq r 
$1)(semantic-tag-put-attribute r 'attr 'phps-mode-parser--ZEND_SYMBOL_CLASS) r)
+    | use_type unprefixed_use_declaration (let ((r)) (setq r 
$2)(semantic-tag-put-attribute r 'attr $1) r)
+    ;
+
+unprefixed_use_declaration:
+    namespace_name (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_USE_ELEM $1 nil)) r)
+    | namespace_name T_AS T_STRING (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_USE_ELEM $1 $3)) r)
+    ;
+
+use_declaration:
+    unprefixed_use_declaration (let ((r)) (setq r $1) r)
+    | T_NS_SEPARATOR unprefixed_use_declaration (let ((r)) (setq r $2) r)
+    ;
+
+const_list:
+    const_list COMMA const_decl (let ((r)) (setq r (ZEND_AST_LIST_ADD $1 $3)) 
r)
+    | const_decl (let ((r)) (setq r (ZEND_AST_CREATE_LIST 1 
'phps-mode-parser--ZEND_AST_CONST_DECL $1)) r)
+    ;
+
+inner_statement_list:
+    inner_statement_list inner_statement (let ((r)) (setq r (ZEND_AST_LIST_ADD 
$1 $2)) r)
+    | empty (let ((r)) (setq r (ZEND_AST_CREATE_LIST 0 
'phps-mode-parser--ZEND_AST_STMT_LIST)) r)
+    ;
+
+inner_statement:
+    statement (let ((r)) (setq r $1) r)
+    | function_declaration_statement (let ((r)) (setq r $1) r)
+    | class_declaration_statement (let ((r)) (setq r $1) r)
+    | trait_declaration_statement (let ((r)) (setq r $1) r)
+    | interface_declaration_statement (let ((r)) (setq r $1) r)
+    | T_HALT_COMPILER OPEN_PARENTHESIS CLOSE_PARENTHESIS SEMICOLON (let ((r)) 
(setq r nil)(ZEND_THROW_EXCEPTION phps-mode-parser--zend_ce_compile_error 
"__HALT_COMPILER() can only be used from the outermost scope" 0)(setq r 
'phps-mode-parser--YYERROR) r)
+    ;
+
+statement:
+    OPEN_CURLY_BRACKET inner_statement_list CLOSE_CURLY_BRACKET (let ((r)) 
(setq r $2) r)
+    | if_stmt (let ((r)) (setq r $1) r)
+    | alt_if_stmt (let ((r)) (setq r $1) r)
+    | T_WHILE OPEN_PARENTHESIS expr CLOSE_PARENTHESIS while_statement (let 
((r)) (setq r (ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_WHILE $3 $5)) r)
+    | T_DO statement T_WHILE OPEN_PARENTHESIS expr CLOSE_PARENTHESIS SEMICOLON 
(let ((r)) (setq r (ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_DO_WHILE $2 
$5)) r)
+    | T_FOR OPEN_PARENTHESIS for_exprs SEMICOLON for_exprs SEMICOLON for_exprs 
CLOSE_PARENTHESIS for_statement (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_FOR $3 $5 $7 $9)) r)
+    | T_SWITCH OPEN_PARENTHESIS expr CLOSE_PARENTHESIS switch_case_list (let 
((r)) (setq r (ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_SWITCH $3 $5)) r)
+    | T_BREAK optional_expr SEMICOLON (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_BREAK $2)) r)
+    | T_CONTINUE optional_expr SEMICOLON (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_CONTINUE $2)) r)
+    | T_RETURN optional_expr SEMICOLON (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_RETURN $2)) r)
+    | T_GLOBAL global_var_list SEMICOLON (let ((r)) (setq r $2) r)
+    | T_STATIC static_var_list SEMICOLON (let ((r)) (setq r $2) r)
+    | T_ECHO echo_expr_list SEMICOLON (let ((r)) (setq r $2) r)
+    | T_INLINE_HTML (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_ECHO $1)) r)
+    | expr SEMICOLON (let ((r)) (setq r $1) r)
+    | T_UNSET OPEN_PARENTHESIS unset_variables possible_comma 
CLOSE_PARENTHESIS SEMICOLON (let ((r)) (setq r $3) r)
+    | T_FOREACH OPEN_PARENTHESIS expr T_AS foreach_variable CLOSE_PARENTHESIS 
foreach_statement (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_FOREACH $3 $5 nil $7)) r)
+    | T_FOREACH OPEN_PARENTHESIS expr T_AS foreach_variable T_DOUBLE_ARROW 
foreach_variable CLOSE_PARENTHESIS foreach_statement (let ((r)) (setq r 
(ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_FOREACH $3 $7 $5 $9)) r)
+    | T_DECLARE OPEN_PARENTHESIS const_list CLOSE_PARENTHESIS  (if 
(!zend_handle_encoding_declaration($3))(let ((r)) (setq r 
'phps-mode-parser--YYERROR) r)(let ((r))  r) declare_statement (let ((r)) (setq 
r (ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_DECLARE $3 $6)) r)
+    | SEMICOLON ;; empty statement
+    (let ((r)) (setq r nil) r)
+    | T_TRY OPEN_CURLY_BRACKET inner_statement_list CLOSE_CURLY_BRACKET 
catch_list finally_statement (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_TRY $3 $5 $6)) r)
+    | T_GOTO T_STRING SEMICOLON (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_GOTO $2)) r)
+    | T_STRING COLON (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_LABEL $1)) r)
+    ;
+
+catch_list:
+    empty (let ((r)) (setq r (ZEND_AST_CREATE_LIST 0 
'phps-mode-parser--ZEND_AST_CATCH_LIST)) r)
+    | catch_list T_CATCH OPEN_PARENTHESIS catch_name_list optional_variable 
CLOSE_PARENTHESIS OPEN_CURLY_BRACKET inner_statement_list CLOSE_CURLY_BRACKET 
(let ((r)) (setq r (ZEND_AST_LIST_ADD $1 (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_CATCH $4 $5 $8))) r)
+    ;
+
+catch_name_list:
+    class_name (let ((r)) (setq r (ZEND_AST_CREATE_LIST 1 
'phps-mode-parser--ZEND_AST_NAME_LIST $1)) r)
+    | catch_name_list BITWISE_OR class_name (let ((r)) (setq r 
(ZEND_AST_LIST_ADD $1 $3)) r)
+    ;
+
+optional_variable:
+    empty (let ((r)) (setq r nil) r)
+    | T_VARIABLE (let ((r)) (setq r $1) r)
+    ;
+
+finally_statement:
+    empty (let ((r)) (setq r nil) r)
+    | T_FINALLY OPEN_CURLY_BRACKET inner_statement_list CLOSE_CURLY_BRACKET 
(let ((r)) (setq r $3) r)
+    ;
+
+unset_variables:
+    unset_variable (let ((r)) (setq r (ZEND_AST_CREATE_LIST 1 
'phps-mode-parser--ZEND_AST_STMT_LIST $1)) r)
+    | unset_variables COMMA unset_variable (let ((r)) (setq r 
(ZEND_AST_LIST_ADD $1 $3)) r)
+    ;
+
+unset_variable:
+    variable (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_UNSET $1)) r)
+    ;
+
+function_declaration_statement:
+    function returns_ref T_STRING backup_doc_comment OPEN_PARENTHESIS 
parameter_list CLOSE_PARENTHESIS return_type backup_fn_flags OPEN_CURLY_BRACKET 
inner_statement_list CLOSE_CURLY_BRACKET backup_fn_flags (let ((r)) (setq r 
(ZEND_AST_CREATE_DECL 'phps-mode-parser--ZEND_AST_FUNC_DECL (logior $2 $13) $1 
$4 (ZEND_AST_GET_STR $3) $6 nil $11 $8))(CG 'phps-mode-parser--extra_fn_flags 
$9) r)
+    ;
+
+is_reference:
+    empty (let ((r)) (setq r 0) r)
+    | BITWISE_AND (let ((r)) (setq r 'phps-mode-parser--ZEND_PARAM_REF) r)
+    ;
+
+is_variadic:
+    empty (let ((r)) (setq r 0) r)
+    | T_ELLIPSIS (let ((r)) (setq r 'phps-mode-parser--ZEND_PARAM_VARIADIC) r)
+    ;
+
+class_declaration_statement:
+    class_modifiers T_CLASS (let ((r))  r) T_STRING extends_from 
implements_list backup_doc_comment OPEN_CURLY_BRACKET class_statement_list 
CLOSE_CURLY_BRACKET (let ((r)) (setq r (ZEND_AST_CREATE_DECL 
'phps-mode-parser--ZEND_AST_CLASS $1 $3 $7 (ZEND_AST_GET_STR $4) $5 $6 $9 nil)) 
r)
+    | T_CLASS (let ((r))  r) T_STRING extends_from implements_list 
backup_doc_comment OPEN_CURLY_BRACKET class_statement_list CLOSE_CURLY_BRACKET 
(let ((r)) (setq r (ZEND_AST_CREATE_DECL 'phps-mode-parser--ZEND_AST_CLASS 0 $2 
$6 (ZEND_AST_GET_STR $3) $4 $5 $8 nil)) r)
+    ;
+
+class_modifiers:
+    class_modifier (let ((r)) (setq r $1) r)
+    | class_modifiers class_modifier  ($$ = zend_add_class_modifier($1, $2); 
if (!$$)(let ((r)) (setq r 'phps-mode-parser--YYERROR) r)(let ((r))  r)
+    ;
+
+class_modifier:
+    T_ABSTRACT (let ((r)) (setq r 
'phps-mode-parser--ZEND_ACC_EXPLICIT_ABSTRACT_CLASS) r)
+    | T_FINAL (let ((r)) (setq r 'phps-mode-parser--ZEND_ACC_FINAL) r)
+    ;
+
+trait_declaration_statement:
+    T_TRAIT (let ((r))  r) T_STRING backup_doc_comment OPEN_CURLY_BRACKET 
class_statement_list CLOSE_CURLY_BRACKET (let ((r)) (setq r 
(ZEND_AST_CREATE_DECL 'phps-mode-parser--ZEND_AST_CLASS 
'phps-mode-parser--ZEND_ACC_TRAIT $2 $4 (ZEND_AST_GET_STR $3) nil nil $6 nil)) 
r)
+    ;
+
+interface_declaration_statement:
+    T_INTERFACE (let ((r))  r) T_STRING interface_extends_list 
backup_doc_comment OPEN_CURLY_BRACKET class_statement_list CLOSE_CURLY_BRACKET 
(let ((r)) (setq r (ZEND_AST_CREATE_DECL 'phps-mode-parser--ZEND_AST_CLASS 
'phps-mode-parser--ZEND_ACC_INTERFACE $2 $5 (ZEND_AST_GET_STR $3) nil $4 $7 
nil)) r)
+    ;
+
+extends_from:
+    empty (let ((r)) (setq r nil) r)
+    | T_EXTENDS class_name (let ((r)) (setq r $2) r)
+    ;
+
+interface_extends_list:
+    empty (let ((r)) (setq r nil) r)
+    | T_EXTENDS class_name_list (let ((r)) (setq r $2) r)
+    ;
+
+implements_list:
+    empty (let ((r)) (setq r nil) r)
+    | T_IMPLEMENTS class_name_list (let ((r)) (setq r $2) r)
+    ;
+
+foreach_variable:
+    variable (let ((r)) (setq r $1) r)
+    | BITWISE_AND variable (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_REF $2)) r)
+    | T_LIST OPEN_PARENTHESIS array_pair_list CLOSE_PARENTHESIS (let ((r)) 
(setq r $3)(semantic-tag-put-attribute r 'attr 
'phps-mode-parser--ZEND_ARRAY_SYNTAX_LIST) r)
+    | OPEN_SQUARE_BRACKET array_pair_list CLOSE_SQUARE_BRACKET (let ((r)) 
(setq r $2)(semantic-tag-put-attribute r 'attr 
'phps-mode-parser--ZEND_ARRAY_SYNTAX_SHORT) r)
+    ;
+
+for_statement:
+    statement (let ((r)) (setq r $1) r)
+    | COLON inner_statement_list T_ENDFOR SEMICOLON (let ((r)) (setq r $2) r)
+    ;
+
+foreach_statement:
+    statement (let ((r)) (setq r $1) r)
+    | COLON inner_statement_list T_ENDFOREACH SEMICOLON (let ((r)) (setq r $2) 
r)
+    ;
+
+declare_statement:
+    statement (let ((r)) (setq r $1) r)
+    | COLON inner_statement_list T_ENDDECLARE SEMICOLON (let ((r)) (setq r $2) 
r)
+    ;
+
+switch_case_list:
+    OPEN_CURLY_BRACKET case_list CLOSE_CURLY_BRACKET (let ((r)) (setq r $2) r)
+    | OPEN_CURLY_BRACKET SEMICOLON case_list CLOSE_CURLY_BRACKET (let ((r)) 
(setq r $3) r)
+    | COLON case_list T_ENDSWITCH SEMICOLON (let ((r)) (setq r $2) r)
+    | COLON SEMICOLON case_list T_ENDSWITCH SEMICOLON (let ((r)) (setq r $3) r)
+    ;
+
+case_list:
+    empty (let ((r)) (setq r (ZEND_AST_CREATE_LIST 0 
'phps-mode-parser--ZEND_AST_SWITCH_LIST)) r)
+    | case_list T_CASE expr case_separator inner_statement_list (let ((r)) 
(setq r (ZEND_AST_LIST_ADD $1 (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_SWITCH_CASE $3 $5))) r)
+    | case_list T_DEFAULT case_separator inner_statement_list (let ((r)) (setq 
r (ZEND_AST_LIST_ADD $1 (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_SWITCH_CASE nil $4))) r)
+    ;
+
+case_separator:
+    COLON
+    | SEMICOLON
+    ;
+
+while_statement:
+    statement (let ((r)) (setq r $1) r)
+    | COLON inner_statement_list T_ENDWHILE SEMICOLON (let ((r)) (setq r $2) r)
+    ;
+
+if_stmt_without_else:
+    T_IF OPEN_PARENTHESIS expr CLOSE_PARENTHESIS statement (let ((r)) (setq r 
(ZEND_AST_CREATE_LIST 1 'phps-mode-parser--ZEND_AST_IF (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_IF_ELEM $3 $5))) r)
+    | if_stmt_without_else T_ELSEIF OPEN_PARENTHESIS expr CLOSE_PARENTHESIS 
statement (let ((r)) (setq r (ZEND_AST_LIST_ADD $1 (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_IF_ELEM $4 $6))) r)
+    ;
+
+if_stmt:
+    if_stmt_without_else prec T_NOELSE (let ((r)) (setq r $1) r)
+    | if_stmt_without_else T_ELSE statement (let ((r)) (setq r 
(ZEND_AST_LIST_ADD $1 (ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_IF_ELEM nil 
$3))) r)
+    ;
+
+alt_if_stmt_without_else:
+    T_IF OPEN_PARENTHESIS expr CLOSE_PARENTHESIS COLON inner_statement_list 
(let ((r)) (setq r (ZEND_AST_CREATE_LIST 1 'phps-mode-parser--ZEND_AST_IF 
(ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_IF_ELEM $3 $6))) r)
+    | alt_if_stmt_without_else T_ELSEIF OPEN_PARENTHESIS expr 
CLOSE_PARENTHESIS COLON inner_statement_list (let ((r)) (setq r 
(ZEND_AST_LIST_ADD $1 (ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_IF_ELEM $4 
$7))) r)
+    ;
+
+alt_if_stmt:
+    alt_if_stmt_without_else T_ENDIF SEMICOLON (let ((r)) (setq r $1) r)
+    | alt_if_stmt_without_else T_ELSE COLON inner_statement_list T_ENDIF 
SEMICOLON (let ((r)) (setq r (ZEND_AST_LIST_ADD $1 (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_IF_ELEM nil $4))) r)
+    ;
+
+parameter_list:
+    non_empty_parameter_list possible_comma (let ((r)) (setq r $1) r)
+    | empty (let ((r)) (setq r (ZEND_AST_CREATE_LIST 0 
'phps-mode-parser--ZEND_AST_PARAM_LIST)) r)
+    ;
+
+non_empty_parameter_list:
+    parameter (let ((r)) (setq r (ZEND_AST_CREATE_LIST 1 
'phps-mode-parser--ZEND_AST_PARAM_LIST $1)) r)
+    | non_empty_parameter_list COMMA parameter (let ((r)) (setq r 
(ZEND_AST_LIST_ADD $1 $3)) r)
+    ;
+
+parameter:
+    optional_type_without_static is_reference is_variadic T_VARIABLE (let 
((r)) (setq r (ZEND_AST_CREATE_EX 'phps-mode-parser--ZEND_AST_PARAM (logior $2 
$3) $1 $4 nil)) r)
+    | optional_type_without_static is_reference is_variadic T_VARIABLE ASSIGN 
expr (let ((r)) (setq r (ZEND_AST_CREATE_EX 'phps-mode-parser--ZEND_AST_PARAM 
(logior $2 $3) $1 $4 $6)) r)
+    ;
+
+optional_type_without_static:
+    empty (let ((r)) (setq r nil) r)
+    | type_expr_without_static (let ((r)) (setq r $1) r)
+    ;
+
+type_expr:
+    type (let ((r)) (setq r $1) r)
+    | QUESTION_MARK type (let ((r)) (setq r $2)(semantic-tag-put-attribute r 
'attr (logior (semantic-tag-get-attribute r 'attr) 
'phps-mode-parser--ZEND_TYPE_NULLABLE)) r)
+    | union_type (let ((r)) (setq r $1) r)
+    ;
+
+type:
+    type_without_static (let ((r)) (setq r $1) r)
+    | T_STATIC (let ((r)) (setq r (ZEND_AST_CREATE_EX 
'phps-mode-parser--ZEND_AST_TYPE 'phps-mode-parser--IS_STATIC)) r)
+    ;
+
+union_type:
+    type BITWISE_OR type (let ((r)) (setq r (ZEND_AST_CREATE_LIST 2 
'phps-mode-parser--ZEND_AST_TYPE_UNION $1 $3)) r)
+    | union_type BITWISE_OR type (let ((r)) (setq r (ZEND_AST_LIST_ADD $1 $3)) 
r)
+    ;
+
+type_expr_without_static:
+    type_without_static (let ((r)) (setq r $1) r)
+    | QUESTION_MARK type_without_static (let ((r)) (setq r 
$2)(semantic-tag-put-attribute r 'attr (logior (semantic-tag-get-attribute r 
'attr) 'phps-mode-parser--ZEND_TYPE_NULLABLE)) r)
+    | union_type_without_static (let ((r)) (setq r $1) r)
+    ;
+
+type_without_static:
+    T_ARRAY (let ((r)) (setq r (ZEND_AST_CREATE_EX 
'phps-mode-parser--ZEND_AST_TYPE 'phps-mode-parser--IS_ARRAY)) r)
+    | T_CALLABLE (let ((r)) (setq r (ZEND_AST_CREATE_EX 
'phps-mode-parser--ZEND_AST_TYPE 'phps-mode-parser--IS_CALLABLE)) r)
+    | name (let ((r)) (setq r $1) r)
+    ;
+
+union_type_without_static:
+    type_without_static BITWISE_OR type_without_static (let ((r)) (setq r 
(ZEND_AST_CREATE_LIST 2 'phps-mode-parser--ZEND_AST_TYPE_UNION $1 $3)) r)
+    | union_type_without_static BITWISE_OR type_without_static (let ((r)) 
(setq r (ZEND_AST_LIST_ADD $1 $3)) r)
+    ;
+
+return_type:
+    empty (let ((r)) (setq r nil) r)
+    | COLON type_expr (let ((r)) (setq r $2) r)
+    ;
+
+argument_list:
+    OPEN_PARENTHESIS CLOSE_PARENTHESIS (let ((r)) (setq r 
(ZEND_AST_CREATE_LIST 0 'phps-mode-parser--ZEND_AST_ARG_LIST)) r)
+    | OPEN_PARENTHESIS non_empty_argument_list possible_comma 
CLOSE_PARENTHESIS (let ((r)) (setq r $2) r)
+    ;
+
+non_empty_argument_list:
+    argument (let ((r)) (setq r (ZEND_AST_CREATE_LIST 1 
'phps-mode-parser--ZEND_AST_ARG_LIST $1)) r)
+    | non_empty_argument_list COMMA argument (let ((r)) (setq r 
(ZEND_AST_LIST_ADD $1 $3)) r)
+    ;
+
+argument:
+    expr (let ((r)) (setq r $1) r)
+    | T_ELLIPSIS expr (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_UNPACK $2)) r)
+    ;
+
+global_var_list:
+    global_var_list COMMA global_var (let ((r)) (setq r (ZEND_AST_LIST_ADD $1 
$3)) r)
+    | global_var (let ((r)) (setq r (ZEND_AST_CREATE_LIST 1 
'phps-mode-parser--ZEND_AST_STMT_LIST $1)) r)
+    ;
+
+global_var:
+    simple_variable (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_GLOBAL (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_VAR $1))) r)
+    ;
+
+static_var_list:
+    static_var_list COMMA static_var (let ((r)) (setq r (ZEND_AST_LIST_ADD $1 
$3)) r)
+    | static_var (let ((r)) (setq r (ZEND_AST_CREATE_LIST 1 
'phps-mode-parser--ZEND_AST_STMT_LIST $1)) r)
+    ;
+
+static_var:
+    T_VARIABLE (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_STATIC $1 nil)) r)
+    | T_VARIABLE ASSIGN expr (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_STATIC $1 $3)) r)
+    ;
+
+class_statement_list:
+    class_statement_list class_statement (let ((r)) (setq r (ZEND_AST_LIST_ADD 
$1 $2)) r)
+    | empty (let ((r)) (setq r (ZEND_AST_CREATE_LIST 0 
'phps-mode-parser--ZEND_AST_STMT_LIST)) r)
+    ;
+
+class_statement:
+    variable_modifiers optional_type_without_static property_list SEMICOLON 
(let ((r)) (setq r (ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_PROP_GROUP $2 
$3))(semantic-tag-put-attribute r 'attr $1) r)
+    | method_modifiers T_CONST class_const_list SEMICOLON (let ((r)) (setq r 
$3)(semantic-tag-put-attribute r 'attr $1) r)
+    | T_USE class_name_list trait_adaptations (let ((r)) (setq r 
(ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_USE_TRAIT $2 $3)) r)
+    | method_modifiers function returns_ref identifier backup_doc_comment 
OPEN_PARENTHESIS parameter_list CLOSE_PARENTHESIS return_type backup_fn_flags 
method_body backup_fn_flags (let ((r)) (setq r (ZEND_AST_CREATE_DECL 
'phps-mode-parser--ZEND_AST_METHOD (logior $3 (logior $1 $12)) $2 $5 
(ZEND_AST_GET_STR $4) $7 nil $11 $9))(CG 'phps-mode-parser--extra_fn_flags $10) 
r)
+    ;
+
+class_name_list:
+    class_name (let ((r)) (setq r (ZEND_AST_CREATE_LIST 1 
'phps-mode-parser--ZEND_AST_NAME_LIST $1)) r)
+    | class_name_list COMMA class_name (let ((r)) (setq r (ZEND_AST_LIST_ADD 
$1 $3)) r)
+    ;
+
+trait_adaptations:
+    SEMICOLON (let ((r)) (setq r nil) r)
+    | OPEN_CURLY_BRACKET CLOSE_CURLY_BRACKET (let ((r)) (setq r nil) r)
+    | OPEN_CURLY_BRACKET trait_adaptation_list CLOSE_CURLY_BRACKET (let ((r)) 
(setq r $2) r)
+    ;
+
+trait_adaptation_list:
+    trait_adaptation (let ((r)) (setq r (ZEND_AST_CREATE_LIST 1 
'phps-mode-parser--ZEND_AST_TRAIT_ADAPTATIONS $1)) r)
+    | trait_adaptation_list trait_adaptation (let ((r)) (setq r 
(ZEND_AST_LIST_ADD $1 $2)) r)
+    ;
+
+trait_adaptation:
+    trait_precedence SEMICOLON (let ((r)) (setq r $1) r)
+    | trait_alias SEMICOLON (let ((r)) (setq r $1) r)
+    ;
+
+trait_precedence:
+    absolute_trait_method_reference T_INSTEADOF class_name_list (let ((r)) 
(setq r (ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_TRAIT_PRECEDENCE $1 $3)) r)
+    ;
+
+trait_alias:
+    trait_method_reference T_AS T_STRING (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_TRAIT_ALIAS $1 $3)) r)
+    | trait_method_reference T_AS reserved_non_modifiers (let ((r)(zv)) 
(ZEND_LEX_TSTRING (lambda(return) (setq zv return)))(setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_TRAIT_ALIAS $1 (ZEND_AST_CREATE_ZVAL zv))) r)
+    | trait_method_reference T_AS member_modifier identifier (let ((r)) (setq 
r (ZEND_AST_CREATE_EX 'phps-mode-parser--ZEND_AST_TRAIT_ALIAS $3 $1 $4)) r)
+    | trait_method_reference T_AS member_modifier (let ((r)) (setq r 
(ZEND_AST_CREATE_EX 'phps-mode-parser--ZEND_AST_TRAIT_ALIAS $3 $1 nil)) r)
+    ;
+
+trait_method_reference:
+    identifier (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_METHOD_REFERENCE nil $1)) r)
+    | absolute_trait_method_reference (let ((r)) (setq r $1) r)
+    ;
+
+absolute_trait_method_reference:
+    class_name T_PAAMAYIM_NEKUDOTAYIM identifier (let ((r)) (setq r 
(ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_METHOD_REFERENCE $1 $3)) r)
+    ;
+
+method_body:
+    SEMICOLON ;; abstract method
+    (let ((r)) (setq r nil) r)
+    | OPEN_CURLY_BRACKET inner_statement_list CLOSE_CURLY_BRACKET (let ((r)) 
(setq r $2) r)
+    ;
+
+variable_modifiers:
+    non_empty_member_modifiers (let ((r)) (setq r $1) r)
+    | T_VAR (let ((r)) (setq r 'phps-mode-parser--ZEND_ACC_PUBLIC) r)
+    ;
+
+method_modifiers:
+    empty (let ((r)) (setq r 'phps-mode-parser--ZEND_ACC_PUBLIC) r)
+    | non_empty_member_modifiers  ($$ = $1; if (!($$ & ZEND_ACC_PPP_MASK))(let 
((r)) (setq r (logior r 'phps-mode-parser--ZEND_ACC_PUBLIC)) r)(let ((r))  r)
+    ;
+
+non_empty_member_modifiers:
+    member_modifier (let ((r)) (setq r $1) r)
+    | non_empty_member_modifiers member_modifier  ($$ = 
zend_add_member_modifier($1, $2); if (!$$)(let ((r)) (setq r 
'phps-mode-parser--YYERROR) r)(let ((r))  r)
+    ;
+
+member_modifier:
+    T_PUBLIC (let ((r)) (setq r 'phps-mode-parser--ZEND_ACC_PUBLIC) r)
+    | T_PROTECTED (let ((r)) (setq r 'phps-mode-parser--ZEND_ACC_PROTECTED) r)
+    | T_PRIVATE (let ((r)) (setq r 'phps-mode-parser--ZEND_ACC_PRIVATE) r)
+    | T_STATIC (let ((r)) (setq r 'phps-mode-parser--ZEND_ACC_STATIC) r)
+    | T_ABSTRACT (let ((r)) (setq r 'phps-mode-parser--ZEND_ACC_ABSTRACT) r)
+    | T_FINAL (let ((r)) (setq r 'phps-mode-parser--ZEND_ACC_FINAL) r)
+    ;
+
+property_list:
+    property_list COMMA property (let ((r)) (setq r (ZEND_AST_LIST_ADD $1 $3)) 
r)
+    | property (let ((r)) (setq r (ZEND_AST_CREATE_LIST 1 
'phps-mode-parser--ZEND_AST_PROP_DECL $1)) r)
+    ;
+
+property:
+    T_VARIABLE backup_doc_comment (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_PROP_ELEM $1 nil (if $2 
(ZEND_AST_CREATE_ZVAL_FROM_STR $2) nil))) r)
+    | T_VARIABLE ASSIGN expr backup_doc_comment (let ((r)) (setq r 
(ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_PROP_ELEM $1 $3 (if $4 
(ZEND_AST_CREATE_ZVAL_FROM_STR $4) nil))) r)
+    ;
+
+class_const_list:
+    class_const_list COMMA class_const_decl (let ((r)) (setq r 
(ZEND_AST_LIST_ADD $1 $3)) r)
+    | class_const_decl (let ((r)) (setq r (ZEND_AST_CREATE_LIST 1 
'phps-mode-parser--ZEND_AST_CLASS_CONST_DECL $1)) r)
+    ;
+
+class_const_decl:
+    identifier ASSIGN expr backup_doc_comment (let ((r)) (setq r 
(ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_CONST_ELEM $1 $3 (if $4 
(ZEND_AST_CREATE_ZVAL_FROM_STR $4) nil))) r)
+    ;
+
+const_decl:
+    T_STRING ASSIGN expr backup_doc_comment (let ((r)) (setq r 
(ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_CONST_ELEM $1 $3 (if $4 
(ZEND_AST_CREATE_ZVAL_FROM_STR $4) nil))) r)
+    ;
+
+echo_expr_list:
+    echo_expr_list COMMA echo_expr (let ((r)) (setq r (ZEND_AST_LIST_ADD $1 
$3)) r)
+    | echo_expr (let ((r)) (setq r (ZEND_AST_CREATE_LIST 1 
'phps-mode-parser--ZEND_AST_STMT_LIST $1)) r)
+    ;
+
+echo_expr:
+    expr (let ((r)) (setq r (ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_ECHO 
$1)) r)
+    ;
+
+for_exprs:
+    empty (let ((r)) (setq r nil) r)
+    | non_empty_for_exprs (let ((r)) (setq r $1) r)
+    ;
+
+non_empty_for_exprs:
+    non_empty_for_exprs COMMA expr (let ((r)) (setq r (ZEND_AST_LIST_ADD $1 
$3)) r)
+    | expr (let ((r)) (setq r (ZEND_AST_CREATE_LIST 1 
'phps-mode-parser--ZEND_AST_EXPR_LIST $1)) r)
+    ;
+
+anonymous_class:
+    T_CLASS (let ((r))  r) ctor_arguments extends_from implements_list 
backup_doc_comment OPEN_CURLY_BRACKET class_statement_list CLOSE_CURLY_BRACKET 
(let ((r)(decl)) (setq phps-mode-parser--decl (ZEND_AST_CREATE_DECL 
'phps-mode-parser--ZEND_AST_CLASS 'phps-mode-parser--ZEND_ACC_ANON_CLASS $2 $6 
nil $4 $5 $8 nil))(setq r (ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_NEW 
phps-mode-parser--decl $3)) r)
+    ;
+
+new_expr:
+    T_NEW class_name_reference ctor_arguments (let ((r)) (setq r 
(ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_NEW $2 $3)) r)
+    | T_NEW anonymous_class (let ((r)) (setq r $2) r)
+    ;
+
+expr:
+    variable (let ((r)) (setq r $1) r)
+    | T_LIST OPEN_PARENTHESIS array_pair_list CLOSE_PARENTHESIS ASSIGN expr 
(let ((r)) (semantic-tag-put-attribute $3 'attr 
'phps-mode-parser--ZEND_ARRAY_SYNTAX_LIST)(setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_ASSIGN $3 $6)) r)
+    | OPEN_SQUARE_BRACKET array_pair_list CLOSE_SQUARE_BRACKET ASSIGN expr 
(let ((r)) (semantic-tag-put-attribute $2 'attr 
'phps-mode-parser--ZEND_ARRAY_SYNTAX_SHORT)(setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_ASSIGN $2 $5)) r)
+    | variable ASSIGN expr (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_ASSIGN $1 $3)) r)
+    | variable ASSIGN BITWISE_AND variable (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_ASSIGN_REF $1 $4)) r)
+    | T_CLONE expr (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_CLONE $2)) r)
+    | variable T_PLUS_EQUAL expr (let ((r)) (setq r (ZEND_AST_CREATE_ASSIGN_OP 
'phps-mode-parser--ZEND_ADD $1 $3)) r)
+    | variable T_MINUS_EQUAL expr (let ((r)) (setq r 
(ZEND_AST_CREATE_ASSIGN_OP 'phps-mode-parser--ZEND_SUB $1 $3)) r)
+    | variable T_MUL_EQUAL expr (let ((r)) (setq r (ZEND_AST_CREATE_ASSIGN_OP 
'phps-mode-parser--ZEND_MUL $1 $3)) r)
+    | variable T_POW_EQUAL expr (let ((r)) (setq r (ZEND_AST_CREATE_ASSIGN_OP 
'phps-mode-parser--ZEND_POW $1 $3)) r)
+    | variable T_DIV_EQUAL expr (let ((r)) (setq r (ZEND_AST_CREATE_ASSIGN_OP 
'phps-mode-parser--ZEND_DIV $1 $3)) r)
+    | variable T_CONCAT_EQUAL expr (let ((r)) (setq r 
(ZEND_AST_CREATE_ASSIGN_OP 'phps-mode-parser--ZEND_CONCAT $1 $3)) r)
+    | variable T_MOD_EQUAL expr (let ((r)) (setq r (ZEND_AST_CREATE_ASSIGN_OP 
'phps-mode-parser--ZEND_MOD $1 $3)) r)
+    | variable T_AND_EQUAL expr (let ((r)) (setq r (ZEND_AST_CREATE_ASSIGN_OP 
'phps-mode-parser--ZEND_BW_AND $1 $3)) r)
+    | variable T_OR_EQUAL expr (let ((r)) (setq r (ZEND_AST_CREATE_ASSIGN_OP 
'phps-mode-parser--ZEND_BW_OR $1 $3)) r)
+    | variable T_XOR_EQUAL expr (let ((r)) (setq r (ZEND_AST_CREATE_ASSIGN_OP 
'phps-mode-parser--ZEND_BW_XOR $1 $3)) r)
+    | variable T_SL_EQUAL expr (let ((r)) (setq r (ZEND_AST_CREATE_ASSIGN_OP 
'phps-mode-parser--ZEND_SL $1 $3)) r)
+    | variable T_SR_EQUAL expr (let ((r)) (setq r (ZEND_AST_CREATE_ASSIGN_OP 
'phps-mode-parser--ZEND_SR $1 $3)) r)
+    | variable T_COALESCE_EQUAL expr (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_ASSIGN_COALESCE $1 $3)) r)
+    | variable T_INC (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_POST_INC $1)) r)
+    | T_INC variable (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_PRE_INC $2)) r)
+    | variable T_DEC (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_POST_DEC $1)) r)
+    | T_DEC variable (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_PRE_DEC $2)) r)
+    | expr T_BOOLEAN_OR expr (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_OR $1 $3)) r)
+    | expr T_BOOLEAN_AND expr (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_AND $1 $3)) r)
+    | expr T_LOGICAL_OR expr (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_OR $1 $3)) r)
+    | expr T_LOGICAL_AND expr (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_AND $1 $3)) r)
+    | expr T_LOGICAL_XOR expr (let ((r)) (setq r (ZEND_AST_CREATE_BINARY_OP 
'phps-mode-parser--ZEND_BOOL_XOR $1 $3)) r)
+    | expr BITWISE_OR expr (let ((r)) (setq r (ZEND_AST_CREATE_BINARY_OP 
'phps-mode-parser--ZEND_BW_OR $1 $3)) r)
+    | expr BITWISE_AND expr (let ((r)) (setq r (ZEND_AST_CREATE_BINARY_OP 
'phps-mode-parser--ZEND_BW_AND $1 $3)) r)
+    | expr POW expr (let ((r)) (setq r (ZEND_AST_CREATE_BINARY_OP 
'phps-mode-parser--ZEND_BW_XOR $1 $3)) r)
+    | expr DOT expr (let ((r)) (setq r (ZEND_AST_CREATE_BINARY_OP 
'phps-mode-parser--ZEND_CONCAT $1 $3)) r)
+    | expr ADDITION expr (let ((r)) (setq r (ZEND_AST_CREATE_BINARY_OP 
'phps-mode-parser--ZEND_ADD $1 $3)) r)
+    | expr SUBTRACTION expr (let ((r)) (setq r (ZEND_AST_CREATE_BINARY_OP 
'phps-mode-parser--ZEND_SUB $1 $3)) r)
+    | expr MULTIPLICATION expr (let ((r)) (setq r (ZEND_AST_CREATE_BINARY_OP 
'phps-mode-parser--ZEND_MUL $1 $3)) r)
+    | expr T_POW expr (let ((r)) (setq r (ZEND_AST_CREATE_BINARY_OP 
'phps-mode-parser--ZEND_POW $1 $3)) r)
+    | expr DIVISION expr (let ((r)) (setq r (ZEND_AST_CREATE_BINARY_OP 
'phps-mode-parser--ZEND_DIV $1 $3)) r)
+    | expr MODULO expr (let ((r)) (setq r (ZEND_AST_CREATE_BINARY_OP 
'phps-mode-parser--ZEND_MOD $1 $3)) r)
+    | expr T_SL expr (let ((r)) (setq r (ZEND_AST_CREATE_BINARY_OP 
'phps-mode-parser--ZEND_SL $1 $3)) r)
+    | expr T_SR expr (let ((r)) (setq r (ZEND_AST_CREATE_BINARY_OP 
'phps-mode-parser--ZEND_SR $1 $3)) r)
+    | ADDITION expr prec UNARY (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_UNARY_PLUS $2)) r)
+    | SUBTRACTION expr prec UNARY (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_UNARY_MINUS $2)) r)
+    | NEGATION expr (let ((r)) (setq r (ZEND_AST_CREATE_EX 
'phps-mode-parser--ZEND_AST_UNARY_OP 'phps-mode-parser--ZEND_BOOL_NOT $2)) r)
+    | UNARY expr (let ((r)) (setq r (ZEND_AST_CREATE_EX 
'phps-mode-parser--ZEND_AST_UNARY_OP 'phps-mode-parser--ZEND_BW_NOT $2)) r)
+    | expr T_IS_IDENTICAL expr (let ((r)) (setq r (ZEND_AST_CREATE_BINARY_OP 
'phps-mode-parser--ZEND_IS_IDENTICAL $1 $3)) r)
+    | expr T_IS_NOT_IDENTICAL expr (let ((r)) (setq r 
(ZEND_AST_CREATE_BINARY_OP 'phps-mode-parser--ZEND_IS_NOT_IDENTICAL $1 $3)) r)
+    | expr T_IS_EQUAL expr (let ((r)) (setq r (ZEND_AST_CREATE_BINARY_OP 
'phps-mode-parser--ZEND_IS_EQUAL $1 $3)) r)
+    | expr T_IS_NOT_EQUAL expr (let ((r)) (setq r (ZEND_AST_CREATE_BINARY_OP 
'phps-mode-parser--ZEND_IS_NOT_EQUAL $1 $3)) r)
+    | expr LESSER_THAN expr (let ((r)) (setq r (ZEND_AST_CREATE_BINARY_OP 
'phps-mode-parser--ZEND_IS_SMALLER $1 $3)) r)
+    | expr T_IS_SMALLER_OR_EQUAL expr (let ((r)) (setq r 
(ZEND_AST_CREATE_BINARY_OP 'phps-mode-parser--ZEND_IS_SMALLER_OR_EQUAL $1 $3)) 
r)
+    | expr GREATER_THAN expr (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_GREATER $1 $3)) r)
+    | expr T_IS_GREATER_OR_EQUAL expr (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_GREATER_EQUAL $1 $3)) r)
+    | expr T_SPACESHIP expr (let ((r)) (setq r (ZEND_AST_CREATE_BINARY_OP 
'phps-mode-parser--ZEND_SPACESHIP $1 $3)) r)
+    | expr T_INSTANCEOF class_name_reference (let ((r)) (setq r 
(ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_INSTANCEOF $1 $3)) r)
+    | OPEN_PARENTHESIS expr CLOSE_PARENTHESIS (let ((r)) (setq r $2)(if (equal 
(semantic-tag-get-attribute r 'kind) 'phps-mode-parser--ZEND_AST_CONDITIONAL) 
(semantic-tag-put-attribute r 'attr 
'phps-mode-parser--ZEND_PARENTHESIZED_CONDITIONAL)) r)
+    | new_expr (let ((r)) (setq r $1) r)
+    | expr QUESTION_MARK expr COLON expr (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_CONDITIONAL $1 $3 $5)) r)
+    | expr QUESTION_MARK COLON expr (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_CONDITIONAL $1 nil $4)) r)
+    | expr T_COALESCE expr (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_COALESCE $1 $3)) r)
+    | internal_functions_in_yacc (let ((r)) (setq r $1) r)
+    | T_INT_CAST expr (let ((r)) (setq r (ZEND_AST_CREATE_CAST 
'phps-mode-parser--IS_LONG $2)) r)
+    | T_DOUBLE_CAST expr (let ((r)) (setq r (ZEND_AST_CREATE_CAST 
'phps-mode-parser--IS_DOUBLE $2)) r)
+    | T_STRING_CAST expr (let ((r)) (setq r (ZEND_AST_CREATE_CAST 
'phps-mode-parser--IS_STRING $2)) r)
+    | T_ARRAY_CAST expr (let ((r)) (setq r (ZEND_AST_CREATE_CAST 
'phps-mode-parser--IS_ARRAY $2)) r)
+    | T_OBJECT_CAST expr (let ((r)) (setq r (ZEND_AST_CREATE_CAST 
'phps-mode-parser--IS_OBJECT $2)) r)
+    | T_BOOL_CAST expr (let ((r)) (setq r (ZEND_AST_CREATE_CAST 
'phps-mode-parser--_IS_BOOL $2)) r)
+    | T_UNSET_CAST expr (let ((r)) (setq r (ZEND_AST_CREATE_CAST 
'phps-mode-parser--IS_NULL $2)) r)
+    | T_EXIT exit_expr (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_EXIT $2)) r)
+    | AT expr (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_SILENCE $2)) r)
+    | scalar (let ((r)) (setq r $1) r)
+    | BACKTICK backticks_expr BACKTICK (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_SHELL_EXEC $2)) r)
+    | T_PRINT expr (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_PRINT $2)) r)
+    | T_YIELD (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_YIELD nil nil))(CG 
'phps-mode-parser--extra_fn_flags (logior (PHPS-MODE-PARSER--CG 
'phps-mode-parser--extra_fn_flags) 'phps-mode-parser--ZEND_ACC_GENERATOR)) r)
+    | T_YIELD expr (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_YIELD $2 nil))(CG 'phps-mode-parser--extra_fn_flags 
(logior (PHPS-MODE-PARSER--CG 'phps-mode-parser--extra_fn_flags) 
'phps-mode-parser--ZEND_ACC_GENERATOR)) r)
+    | T_YIELD expr T_DOUBLE_ARROW expr (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_YIELD $4 $2))(CG 'phps-mode-parser--extra_fn_flags 
(logior (PHPS-MODE-PARSER--CG 'phps-mode-parser--extra_fn_flags) 
'phps-mode-parser--ZEND_ACC_GENERATOR)) r)
+    | T_YIELD_FROM expr (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_YIELD_FROM $2))(CG 
'phps-mode-parser--extra_fn_flags (logior (PHPS-MODE-PARSER--CG 
'phps-mode-parser--extra_fn_flags) 'phps-mode-parser--ZEND_ACC_GENERATOR)) r)
+    | T_THROW expr (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_THROW $2)) r)
+    | inline_function (let ((r)) (setq r $1) r)
+    | T_STATIC inline_function (let ((r)) (setq r 
$2)(semantic-tag-put-attribute r 'flags (logior (semantic-tag-get-attribute r 
'flags) 'phps-mode-parser--ZEND_ACC_STATIC)) r)
+    ;
+
+inline_function:
+    function returns_ref backup_doc_comment OPEN_PARENTHESIS parameter_list 
CLOSE_PARENTHESIS lexical_vars return_type backup_fn_flags OPEN_CURLY_BRACKET 
inner_statement_list CLOSE_CURLY_BRACKET backup_fn_flags (let ((r)) (setq r 
(ZEND_AST_CREATE_DECL 'phps-mode-parser--ZEND_AST_CLOSURE (logior $2 $13) $1 $3 
(ZEND_STRING_INIT "{closure}" (- (SIZEOF "{closure}") 1) 0) $5 $7 $11 $8))(CG 
'phps-mode-parser--extra_fn_flags $9) r)
+    | fn returns_ref OPEN_PARENTHESIS parameter_list CLOSE_PARENTHESIS 
return_type backup_doc_comment T_DOUBLE_ARROW backup_fn_flags backup_lex_pos 
expr backup_fn_flags (let ((r)) (setq r (ZEND_AST_CREATE_DECL 
'phps-mode-parser--ZEND_AST_ARROW_FUNC (logior $2 $12) $1 $7 (ZEND_STRING_INIT 
"{closure}" (- (SIZEOF "{closure}") 1) 0) $4 nil (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_RETURN $11) $6))(semantic-tag-put-attribute r 
'lex_pos $10)(CG 'phps-mode-parser--extra_fn_flags $9) r)
+    ;
+
+fn:
+    T_FN (let ((r)) (setq r (CG phps-mode-parser--zend_lineno)) r)
+    ;
+
+function:
+    T_FUNCTION (let ((r)) (setq r (CG phps-mode-parser--zend_lineno)) r)
+    ;
+
+backup_doc_comment:
+    empty (let ((r)) (setq r (CG phps-mode-parser--doc_comment))(CG 
'phps-mode-parser--doc_comment nil) r)
+    ;
+
+backup_fn_flags:
+    prec PREC_ARROW_FUNCTION empty (let ((r)) (setq r (CG 
phps-mode-parser--extra_fn_flags))(CG 'phps-mode-parser--extra_fn_flags 0) r)
+    ;
+
+backup_lex_pos:
+    empty (let ((r)) (setq r (LANG_SCNG phps-mode-parser--yy_text)) r)
+    ;
+
+returns_ref:
+    empty (let ((r)) (setq r 0) r)
+    | BITWISE_AND (let ((r)) (setq r 
'phps-mode-parser--ZEND_ACC_RETURN_REFERENCE) r)
+    ;
+
+lexical_vars:
+    empty (let ((r)) (setq r nil) r)
+    | T_USE OPEN_PARENTHESIS lexical_var_list CLOSE_PARENTHESIS (let ((r)) 
(setq r $3) r)
+    ;
+
+lexical_var_list:
+    lexical_var_list COMMA lexical_var (let ((r)) (setq r (ZEND_AST_LIST_ADD 
$1 $3)) r)
+    | lexical_var (let ((r)) (setq r (ZEND_AST_CREATE_LIST 1 
'phps-mode-parser--ZEND_AST_CLOSURE_USES $1)) r)
+    ;
+
+lexical_var:
+    T_VARIABLE (let ((r)) (setq r $1) r)
+    | BITWISE_AND T_VARIABLE (let ((r)) (setq r $2)(semantic-tag-put-attribute 
r 'attr 'phps-mode-parser--ZEND_BIND_REF) r)
+    ;
+
+function_call:
+    name argument_list (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_CALL $1 $2)) r)
+    | class_name T_PAAMAYIM_NEKUDOTAYIM member_name argument_list (let ((r)) 
(setq r (ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_STATIC_CALL $1 $3 $4)) r)
+    | variable_class_name T_PAAMAYIM_NEKUDOTAYIM member_name argument_list 
(let ((r)) (setq r (ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_STATIC_CALL $1 
$3 $4)) r)
+    | callable_expr argument_list (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_CALL $1 $2)) r)
+    ;
+
+class_name:
+    T_STATIC (let ((r)(zv)) (ZVAL_INTERNED_STR (lambda(return) (setq zv 
return)) (ZSTR_KNOWN 'phps-mode-parser--ZEND_STR_STATIC))(setq r 
(ZEND_AST_CREATE_ZVAL_EX zv 'phps-mode-parser--ZEND_NAME_NOT_FQ)) r)
+    | name (let ((r)) (setq r $1) r)
+    ;
+
+class_name_reference:
+    class_name (let ((r)) (setq r $1) r)
+    | new_variable (let ((r)) (setq r $1) r)
+    | OPEN_PARENTHESIS expr CLOSE_PARENTHESIS (let ((r)) (setq r $2) r)
+    ;
+
+exit_expr:
+    empty (let ((r)) (setq r nil) r)
+    | OPEN_PARENTHESIS optional_expr CLOSE_PARENTHESIS (let ((r)) (setq r $2) 
r)
+    ;
+
+backticks_expr:
+    empty (let ((r)) (setq r (ZEND_AST_CREATE_ZVAL_FROM_STR 
(ZSTR_EMPTY_ALLOC))) r)
+    | T_ENCAPSED_AND_WHITESPACE (let ((r)) (setq r $1) r)
+    | encaps_list (let ((r)) (setq r $1) r)
+    ;
+
+ctor_arguments:
+    empty (let ((r)) (setq r (ZEND_AST_CREATE_LIST 0 
'phps-mode-parser--ZEND_AST_ARG_LIST)) r)
+    | argument_list (let ((r)) (setq r $1) r)
+    ;
+
+dereferencable_scalar:
+    T_ARRAY OPEN_PARENTHESIS array_pair_list CLOSE_PARENTHESIS (let ((r)) 
(setq r $3)(semantic-tag-put-attribute r 'attr 
'phps-mode-parser--ZEND_ARRAY_SYNTAX_LONG) r)
+    | OPEN_SQUARE_BRACKET array_pair_list CLOSE_SQUARE_BRACKET (let ((r)) 
(setq r $2)(semantic-tag-put-attribute r 'attr 
'phps-mode-parser--ZEND_ARRAY_SYNTAX_SHORT) r)
+    | T_CONSTANT_ENCAPSED_STRING (let ((r)) (setq r $1) r)
+    | DOUBLE_QUOTE encaps_list DOUBLE_QUOTE (let ((r)) (setq r $2) r)
+    ;
+
+scalar:
+    T_LNUMBER (let ((r)) (setq r $1) r)
+    | T_DNUMBER (let ((r)) (setq r $1) r)
+    | T_START_HEREDOC T_ENCAPSED_AND_WHITESPACE T_END_HEREDOC (let ((r)) (setq 
r $2) r)
+    | T_START_HEREDOC T_END_HEREDOC (let ((r)) (setq r 
(ZEND_AST_CREATE_ZVAL_FROM_STR (ZSTR_EMPTY_ALLOC))) r)
+    | T_START_HEREDOC encaps_list T_END_HEREDOC (let ((r)) (setq r $2) r)
+    | dereferencable_scalar (let ((r)) (setq r $1) r)
+    | constant (let ((r)) (setq r $1) r)
+    | class_constant (let ((r)) (setq r $1) r)
+    ;
+
+constant:
+    name (let ((r)) (setq r (ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_CONST 
$1)) r)
+    | T_LINE (let ((r)) (setq r (ZEND_AST_CREATE_EX 
'phps-mode-parser--ZEND_AST_MAGIC_CONST 'phps-mode-parser--T_LINE)) r)
+    | T_FILE (let ((r)) (setq r (ZEND_AST_CREATE_EX 
'phps-mode-parser--ZEND_AST_MAGIC_CONST 'phps-mode-parser--T_FILE)) r)
+    | T_DIR (let ((r)) (setq r (ZEND_AST_CREATE_EX 
'phps-mode-parser--ZEND_AST_MAGIC_CONST 'phps-mode-parser--T_DIR)) r)
+    | T_TRAIT_C (let ((r)) (setq r (ZEND_AST_CREATE_EX 
'phps-mode-parser--ZEND_AST_MAGIC_CONST 'phps-mode-parser--T_TRAIT_C)) r)
+    | T_METHOD_C (let ((r)) (setq r (ZEND_AST_CREATE_EX 
'phps-mode-parser--ZEND_AST_MAGIC_CONST 'phps-mode-parser--T_METHOD_C)) r)
+    | T_FUNC_C (let ((r)) (setq r (ZEND_AST_CREATE_EX 
'phps-mode-parser--ZEND_AST_MAGIC_CONST 'phps-mode-parser--T_FUNC_C)) r)
+    | T_NS_C (let ((r)) (setq r (ZEND_AST_CREATE_EX 
'phps-mode-parser--ZEND_AST_MAGIC_CONST 'phps-mode-parser--T_NS_C)) r)
+    | T_CLASS_C (let ((r)) (setq r (ZEND_AST_CREATE_EX 
'phps-mode-parser--ZEND_AST_MAGIC_CONST 'phps-mode-parser--T_CLASS_C)) r)
+    ;
+
+class_constant:
+    class_name T_PAAMAYIM_NEKUDOTAYIM identifier (let ((r)) (setq r 
(ZEND_AST_CREATE_CLASS_CONST_OR_NAME $1 $3)) r)
+    | variable_class_name T_PAAMAYIM_NEKUDOTAYIM identifier (let ((r)) (setq r 
(ZEND_AST_CREATE_CLASS_CONST_OR_NAME $1 $3)) r)
+    ;
+
+optional_expr:
+    empty (let ((r)) (setq r nil) r)
+    | expr (let ((r)) (setq r $1) r)
+    ;
+
+variable_class_name:
+    fully_dereferencable (let ((r)) (setq r $1) r)
+    ;
+
+fully_dereferencable:
+    variable (let ((r)) (setq r $1) r)
+    | OPEN_PARENTHESIS expr CLOSE_PARENTHESIS (let ((r)) (setq r $2) r)
+    | dereferencable_scalar (let ((r)) (setq r $1) r)
+    | class_constant (let ((r)) (setq r $1) r)
+    ;
+
+array_object_dereferencable:
+    fully_dereferencable (let ((r)) (setq r $1) r)
+    | constant (let ((r)) (setq r $1) r)
+    ;
+
+callable_expr:
+    callable_variable (let ((r)) (setq r $1) r)
+    | OPEN_PARENTHESIS expr CLOSE_PARENTHESIS (let ((r)) (setq r $2) r)
+    | dereferencable_scalar (let ((r)) (setq r $1) r)
+    ;
+
+callable_variable:
+    simple_variable (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_VAR $1)) r)
+    | array_object_dereferencable OPEN_SQUARE_BRACKET optional_expr 
CLOSE_SQUARE_BRACKET (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_DIM $1 $3)) r)
+    | array_object_dereferencable OPEN_CURLY_BRACKET expr CLOSE_CURLY_BRACKET 
(let ((r)) (setq r (ZEND_AST_CREATE_EX 'phps-mode-parser--ZEND_AST_DIM 
'phps-mode-parser--ZEND_DIM_ALTERNATIVE_SYNTAX $1 $3)) r)
+    | array_object_dereferencable T_OBJECT_OPERATOR property_name 
argument_list (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_METHOD_CALL $1 $3 $4)) r)
+    | function_call (let ((r)) (setq r $1) r)
+    ;
+
+variable:
+    callable_variable (let ((r)) (setq r $1) r)
+    | static_member (let ((r)) (setq r $1) r)
+    | array_object_dereferencable T_OBJECT_OPERATOR property_name (let ((r)) 
(setq r (ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_PROP $1 $3)) r)
+    ;
+
+simple_variable:
+    T_VARIABLE (let ((r)) (setq r $1) r)
+    | DOLLAR_SIGN OPEN_CURLY_BRACKET expr CLOSE_CURLY_BRACKET (let ((r)) (setq 
r $3) r)
+    | DOLLAR_SIGN simple_variable (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_VAR $2)) r)
+    ;
+
+static_member:
+    class_name T_PAAMAYIM_NEKUDOTAYIM simple_variable (let ((r)) (setq r 
(ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_STATIC_PROP $1 $3)) r)
+    | variable_class_name T_PAAMAYIM_NEKUDOTAYIM simple_variable (let ((r)) 
(setq r (ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_STATIC_PROP $1 $3)) r)
+    ;
+
+new_variable:
+    simple_variable (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_VAR $1)) r)
+    | new_variable OPEN_SQUARE_BRACKET optional_expr CLOSE_SQUARE_BRACKET (let 
((r)) (setq r (ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_DIM $1 $3)) r)
+    | new_variable OPEN_CURLY_BRACKET expr CLOSE_CURLY_BRACKET (let ((r)) 
(setq r (ZEND_AST_CREATE_EX 'phps-mode-parser--ZEND_AST_DIM 
'phps-mode-parser--ZEND_DIM_ALTERNATIVE_SYNTAX $1 $3)) r)
+    | new_variable T_OBJECT_OPERATOR property_name (let ((r)) (setq r 
(ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_PROP $1 $3)) r)
+    | class_name T_PAAMAYIM_NEKUDOTAYIM simple_variable (let ((r)) (setq r 
(ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_STATIC_PROP $1 $3)) r)
+    | new_variable T_PAAMAYIM_NEKUDOTAYIM simple_variable (let ((r)) (setq r 
(ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_STATIC_PROP $1 $3)) r)
+    ;
+
+member_name:
+    identifier (let ((r)) (setq r $1) r)
+    | OPEN_CURLY_BRACKET expr CLOSE_CURLY_BRACKET (let ((r)) (setq r $2) r)
+    | simple_variable (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_VAR $1)) r)
+    ;
+
+property_name:
+    T_STRING (let ((r)) (setq r $1) r)
+    | OPEN_CURLY_BRACKET expr CLOSE_CURLY_BRACKET (let ((r)) (setq r $2) r)
+    | simple_variable (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_VAR $1)) r)
+    ;
+
+array_pair_list:
+    non_empty_array_pair_list (let ((r)) ;; allow single trailing comma
+(setq r (ZEND_AST_LIST_RTRIM $1)) r)
+    ;
+
+possible_array_pair:
+    empty (let ((r)) (setq r nil) r)
+    | array_pair (let ((r)) (setq r $1) r)
+    ;
+
+non_empty_array_pair_list:
+    non_empty_array_pair_list COMMA possible_array_pair (let ((r)) (setq r 
(ZEND_AST_LIST_ADD $1 $3)) r)
+    | possible_array_pair (let ((r)) (setq r (ZEND_AST_CREATE_LIST 1 
'phps-mode-parser--ZEND_AST_ARRAY $1)) r)
+    ;
+
+array_pair:
+    expr T_DOUBLE_ARROW expr (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_ARRAY_ELEM $3 $1)) r)
+    | expr (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_ARRAY_ELEM $1 nil)) r)
+    | expr T_DOUBLE_ARROW BITWISE_AND variable (let ((r)) (setq r 
(ZEND_AST_CREATE_EX 'phps-mode-parser--ZEND_AST_ARRAY_ELEM 1 $4 $1)) r)
+    | BITWISE_AND variable (let ((r)) (setq r (ZEND_AST_CREATE_EX 
'phps-mode-parser--ZEND_AST_ARRAY_ELEM 1 $2 nil)) r)
+    | T_ELLIPSIS expr (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_UNPACK $2)) r)
+    | expr T_DOUBLE_ARROW T_LIST OPEN_PARENTHESIS array_pair_list 
CLOSE_PARENTHESIS (let ((r)) (semantic-tag-put-attribute $5 'attr 
'phps-mode-parser--ZEND_ARRAY_SYNTAX_LIST)(setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_ARRAY_ELEM $5 $1)) r)
+    | T_LIST OPEN_PARENTHESIS array_pair_list CLOSE_PARENTHESIS (let ((r)) 
(semantic-tag-put-attribute $3 'attr 
'phps-mode-parser--ZEND_ARRAY_SYNTAX_LIST)(setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_ARRAY_ELEM $3 nil)) r)
+    ;
+
+encaps_list:
+    encaps_list encaps_var (let ((r)) (setq r (ZEND_AST_LIST_ADD $1 $2)) r)
+    | encaps_list T_ENCAPSED_AND_WHITESPACE (let ((r)) (setq r 
(ZEND_AST_LIST_ADD $1 $2)) r)
+    | encaps_var (let ((r)) (setq r (ZEND_AST_CREATE_LIST 1 
'phps-mode-parser--ZEND_AST_ENCAPS_LIST $1)) r)
+    | T_ENCAPSED_AND_WHITESPACE encaps_var (let ((r)) (setq r 
(ZEND_AST_CREATE_LIST 2 'phps-mode-parser--ZEND_AST_ENCAPS_LIST $1 $2)) r)
+    ;
+
+encaps_var:
+    T_VARIABLE (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_VAR $1)) r)
+    | T_VARIABLE OPEN_SQUARE_BRACKET encaps_var_offset CLOSE_SQUARE_BRACKET 
(let ((r)) (setq r (ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_DIM 
(ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_VAR $1) $3)) r)
+    | T_VARIABLE T_OBJECT_OPERATOR T_STRING (let ((r)) (setq r 
(ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_PROP (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_VAR $1) $3)) r)
+    | T_DOLLAR_OPEN_CURLY_BRACES expr CLOSE_CURLY_BRACKET (let ((r)) (setq r 
(ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_VAR $2)) r)
+    | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME CLOSE_CURLY_BRACKET (let 
((r)) (setq r (ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_VAR $2)) r)
+    | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME OPEN_SQUARE_BRACKET expr 
CLOSE_SQUARE_BRACKET CLOSE_CURLY_BRACKET (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_DIM (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_VAR $2) $4)) r)
+    | T_CURLY_OPEN variable CLOSE_CURLY_BRACKET (let ((r)) (setq r $2) r)
+    ;
+
+encaps_var_offset:
+    T_STRING (let ((r)) (setq r $1) r)
+    | T_NUM_STRING (let ((r)) (setq r $1) r)
+    | SUBTRACTION T_NUM_STRING (let ((r)) (setq r (ZEND_NEGATE_NUM_STRING $2)) 
r)
+    | T_VARIABLE (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_VAR $1)) r)
+    ;
+
+internal_functions_in_yacc:
+    T_ISSET OPEN_PARENTHESIS isset_variables possible_comma CLOSE_PARENTHESIS 
(let ((r)) (setq r $3) r)
+    | T_EMPTY OPEN_PARENTHESIS expr CLOSE_PARENTHESIS (let ((r)) (setq r 
(ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_EMPTY $3)) r)
+    | T_INCLUDE expr (let ((r)) (setq r (ZEND_AST_CREATE_EX 
'phps-mode-parser--ZEND_AST_INCLUDE_OR_EVAL 'phps-mode-parser--ZEND_INCLUDE 
$2)) r)
+    | T_INCLUDE_ONCE expr (let ((r)) (setq r (ZEND_AST_CREATE_EX 
'phps-mode-parser--ZEND_AST_INCLUDE_OR_EVAL 
'phps-mode-parser--ZEND_INCLUDE_ONCE $2)) r)
+    | T_EVAL OPEN_PARENTHESIS expr CLOSE_PARENTHESIS (let ((r)) (setq r 
(ZEND_AST_CREATE_EX 'phps-mode-parser--ZEND_AST_INCLUDE_OR_EVAL 
'phps-mode-parser--ZEND_EVAL $3)) r)
+    | T_REQUIRE expr (let ((r)) (setq r (ZEND_AST_CREATE_EX 
'phps-mode-parser--ZEND_AST_INCLUDE_OR_EVAL 'phps-mode-parser--ZEND_REQUIRE 
$2)) r)
+    | T_REQUIRE_ONCE expr (let ((r)) (setq r (ZEND_AST_CREATE_EX 
'phps-mode-parser--ZEND_AST_INCLUDE_OR_EVAL 
'phps-mode-parser--ZEND_REQUIRE_ONCE $2)) r)
+    ;
+
+isset_variables:
+    isset_variable (let ((r)) (setq r $1) r)
+    | isset_variables COMMA isset_variable (let ((r)) (setq r (ZEND_AST_CREATE 
'phps-mode-parser--ZEND_AST_AND $1 $3)) r)
+    ;
+
+isset_variable:
+    expr (let ((r)) (setq r (ZEND_AST_CREATE 'phps-mode-parser--ZEND_AST_ISSET 
$1)) r)
+    ;
+
+
+;; NOTE Generated grammar ends here
\ No newline at end of file
diff --git a/phps-mode-parser-grammar.wy b/phps-mode-parser-grammar.wy
new file mode 100644
index 0000000..9f22e6c
--- /dev/null
+++ b/phps-mode-parser-grammar.wy
@@ -0,0 +1,665 @@
+;;; phps.wy --- Semantic LALR grammar for PHP -*- lexical-binding: t -*-
+
+;; Copyright (C) 2018-2020  Free Software Foundation, Inc.
+
+;; This file is not part of GNU Emacs.
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2, or (at
+;; your option) any later version.
+
+;; This program is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;; General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+
+
+;;; Commentary:
+
+;; Run `(wisent-make-parsers)' or "C-c C-c" to generate grammar-file in Emacs 
Lisp.
+;;
+;; To debug (setq wisent-verbose-flag t) and check buffer *wisent-log*
+;;
+;; Based on the Zend PHP Parser YACC 
https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y
+
+;; Create macros for all macros uses in original YACC, base macro structure on 
semantic-php-wy-macro.el
+
+;; Don't edit phps.wy because it's generated by phps-automation.el and 
phps-automation-header.wy
+
+;; Check semantic/wisent/grammar.el for macro definitions
+
+
+;;; Code:
+
+%package phps-mode
+%provide phps-mode-wy
+
+%languagemode phps-mode
+
+%{
+  (setq max-specpdl-size 160000)
+}
+
+%use-macros phps-mode-parser-grammar-macro
+{
+ ZEND_AST_CREATE
+ ZEND_AST_CREATE_ASSIGN_OP
+ ZEND_AST_CREATE_BINARY_OP
+ ZEND_AST_CREATE_CAST
+ ZEND_AST_CREATE_CLASS_CONST_OR_NAME
+ ZEND_AST_CREATE_EX
+ ZEND_AST_CREATE_LIST
+ ZEND_AST_CREATE_ZVAL
+ ZEND_AST_CREATE_ZVAL_EX
+ ZEND_AST_LIST_ADD
+ ZEND_AST_LIST_RTRIM
+ ZEND_LEX_TSTRING
+ ZEND_NEGATE_NUM_STRING
+ ZVAL_INTERNED_STR
+}
+
+%precedence T_THROW
+%precedence PREC_ARROW_FUNCTION
+%precedence T_INCLUDE T_INCLUDE_ONCE T_REQUIRE T_REQUIRE_ONCE
+%left T_LOGICAL_OR
+%left T_LOGICAL_XOR
+%left T_LOGICAL_AND
+%precedence T_PRINT
+%precedence T_YIELD
+%precedence T_DOUBLE_ARROW
+%precedence T_YIELD_FROM
+%precedence '=' T_PLUS_EQUAL T_MINUS_EQUAL T_MUL_EQUAL T_DIV_EQUAL 
T_CONCAT_EQUAL T_MOD_EQUAL T_AND_EQUAL T_OR_EQUAL T_XOR_EQUAL T_SL_EQUAL 
T_SR_EQUAL T_POW_EQUAL T_COALESCE_EQUAL
+%left '?' ':'
+%right T_COALESCE
+%left T_BOOLEAN_OR
+%left T_BOOLEAN_AND
+%left '|'
+%left '^'
+%left '&'
+%nonassoc T_IS_EQUAL T_IS_NOT_EQUAL T_IS_IDENTICAL T_IS_NOT_IDENTICAL 
T_SPACESHIP
+%nonassoc '<' T_IS_SMALLER_OR_EQUAL '>' T_IS_GREATER_OR_EQUAL
+%left '.'
+%left T_SL T_SR
+%left '+' '-'
+%left '*' '/' '%'
+%precedence '!'
+%precedence T_INSTANCEOF
+%precedence '~' T_INT_CAST T_DOUBLE_CAST T_STRING_CAST T_ARRAY_CAST 
T_OBJECT_CAST T_BOOL_CAST T_UNSET_CAST '@'
+%right T_POW
+%precedence T_CLONE
+
+;; Resolve danging else conflict
+%precedence T_NOELSE
+%precedence T_ELSEIF
+%precedence T_ELSE
+
+%token <ast> T_LNUMBER   "integer number (T_LNUMBER)"
+%token <ast> T_DNUMBER   "floating-point number (T_DNUMBER)"
+%token <ast> T_STRING    "identifier (T_STRING)"
+%token <ast> T_VARIABLE  "variable (T_VARIABLE)"
+%token <ast> T_INLINE_HTML
+%token <ast> T_ENCAPSED_AND_WHITESPACE  "quoted-string and whitespace 
(T_ENCAPSED_AND_WHITESPACE)"
+%token <ast> T_CONSTANT_ENCAPSED_STRING "quoted-string 
(T_CONSTANT_ENCAPSED_STRING)"
+%token <ast> T_STRING_VARNAME "variable name (T_STRING_VARNAME)"
+%token <ast> T_NUM_STRING "number (T_NUM_STRING)"
+
+%type <punctuation>
+%token <punctuation> ADDITION "+"
+%token <punctuation> ASSIGN "="
+%token <punctuation> AT "@"
+%token <punctuation> BACKTICK "`"
+%token <punctuation> BITWISE_AND "&"
+%token <punctuation> BITWISE_OR "|"
+%token <punctuation> CLOSE_CURLY_BRACKET "]"
+%token <punctuation> CLOSE_PARENTHESIS ")"
+%token <punctuation> CLOSE_SQUARE_BRACKET "]"
+%token <punctuation> COLON ":"
+%token <punctuation> COMMA ","
+%token <punctuation> DOLLAR_SIGN "$"
+%token <punctuation> DOUBLE_QUOTE "\""
+%token <punctuation> DIVISION "/"
+%token <punctuation> DOT "."
+%token <punctuation> GREATER_THAN ">"
+%token <punctuation> LESSER_THAN "<"
+%token <punctuation> MODULO "%"
+%token <punctuation> MULTIPLICATION "*"
+%token <punctuation> NEGATION "!"
+%token <punctuation> OPEN_CURLY_BRACKET "{"
+%token <punctuation> OPEN_PARENTHESIS "("
+%token <punctuation> OPEN_SQUARE_BRACKET "["
+%token <punctuation> POW "^"
+%token <punctuation> QUESTION_MARK "?"
+%token <punctuation> SINGLE_QUOTE "'"
+%token <punctuation> SUBTRACTION "-"
+%token <punctuation> UNARY "~"
+
+%token END 0 "end of file"
+%token T_INCLUDE      "include (T_INCLUDE)"
+%token T_INCLUDE_ONCE "include_once (T_INCLUDE_ONCE)"
+%token T_EVAL         "eval (T_EVAL)"
+%token T_REQUIRE      "require (T_REQUIRE)"
+%token T_REQUIRE_ONCE "require_once (T_REQUIRE_ONCE)"
+%token T_LOGICAL_OR   "or (T_LOGICAL_OR)"
+%token T_LOGICAL_XOR  "xor (T_LOGICAL_XOR)"
+%token T_LOGICAL_AND  "and (T_LOGICAL_AND)"
+%token T_PRINT        "print (T_PRINT)"
+%token T_YIELD        "yield (T_YIELD)"
+%token T_YIELD_FROM   "yield from (T_YIELD_FROM)"
+%token T_PLUS_EQUAL   "+= (T_PLUS_EQUAL)"
+%token T_MINUS_EQUAL  "-= (T_MINUS_EQUAL)"
+%token T_MUL_EQUAL    "*= (T_MUL_EQUAL)"
+%token T_DIV_EQUAL    "/= (T_DIV_EQUAL)"
+%token T_CONCAT_EQUAL ".= (T_CONCAT_EQUAL)"
+%token T_MOD_EQUAL    "%= (T_MOD_EQUAL)"
+%token T_AND_EQUAL    "&= (T_AND_EQUAL)"
+%token T_OR_EQUAL     "|= (T_OR_EQUAL)"
+%token T_XOR_EQUAL    "^= (T_XOR_EQUAL)"
+%token T_SL_EQUAL     "<<= (T_SL_EQUAL)"
+%token T_SR_EQUAL     ">>= (T_SR_EQUAL)"
+%token T_COALESCE_EQUAL "??= (T_COALESCE_EQUAL)"
+%token T_BOOLEAN_OR   "|| (T_BOOLEAN_OR)"
+%token T_BOOLEAN_AND  "&& (T_BOOLEAN_AND)"
+%token T_IS_EQUAL     "== (T_IS_EQUAL)"
+%token T_IS_NOT_EQUAL "!= (T_IS_NOT_EQUAL)"
+%token T_IS_IDENTICAL "=== (T_IS_IDENTICAL)"
+%token T_IS_NOT_IDENTICAL "!== (T_IS_NOT_IDENTICAL)"
+%token T_IS_SMALLER_OR_EQUAL "<= (T_IS_SMALLER_OR_EQUAL)"
+%token T_IS_GREATER_OR_EQUAL ">= (T_IS_GREATER_OR_EQUAL)"
+%token T_SPACESHIP "<=> (T_SPACESHIP)"
+%token T_SL "<< (T_SL)"
+%token T_SR ">> (T_SR)"
+%token T_INSTANCEOF  "instanceof (T_INSTANCEOF)"
+%token T_INC "++ (T_INC)"
+%token T_DEC "-- (T_DEC)"
+%token T_INT_CAST    "(int) (T_INT_CAST)"
+%token T_DOUBLE_CAST "(double) (T_DOUBLE_CAST)"
+%token T_STRING_CAST "(string) (T_STRING_CAST)"
+%token T_ARRAY_CAST  "(array) (T_ARRAY_CAST)"
+%token T_OBJECT_CAST "(object) (T_OBJECT_CAST)"
+%token T_BOOL_CAST   "(bool) (T_BOOL_CAST)"
+%token T_UNSET_CAST  "(unset) (T_UNSET_CAST)"
+%token T_NEW       "new (T_NEW)"
+%token T_CLONE     "clone (T_CLONE)"
+%token T_EXIT      "exit (T_EXIT)"
+%token T_IF        "if (T_IF)"
+%token T_ELSEIF    "elseif (T_ELSEIF)"
+%token T_ELSE      "else (T_ELSE)"
+%token T_ENDIF     "endif (T_ENDIF)"
+%token T_ECHO       "echo (T_ECHO)"
+%token T_DO         "do (T_DO)"
+%token T_WHILE      "while (T_WHILE)"
+%token T_ENDWHILE   "endwhile (T_ENDWHILE)"
+%token T_FOR        "for (T_FOR)"
+%token T_ENDFOR     "endfor (T_ENDFOR)"
+%token T_FOREACH    "foreach (T_FOREACH)"
+%token T_ENDFOREACH "endforeach (T_ENDFOREACH)"
+%token T_DECLARE    "declare (T_DECLARE)"
+%token T_ENDDECLARE "enddeclare (T_ENDDECLARE)"
+%token T_AS         "as (T_AS)"
+%token T_SWITCH     "switch (T_SWITCH)"
+%token T_ENDSWITCH  "endswitch (T_ENDSWITCH)"
+%token T_CASE       "case (T_CASE)"
+%token T_DEFAULT    "default (T_DEFAULT)"
+%token T_BREAK      "break (T_BREAK)"
+%token T_CONTINUE   "continue (T_CONTINUE)"
+%token T_GOTO       "goto (T_GOTO)"
+%token T_FUNCTION   "function (T_FUNCTION)"
+%token T_FN         "fn (T_FN)"
+%token T_CONST      "const (T_CONST)"
+%token T_RETURN     "return (T_RETURN)"
+%token T_TRY        "try (T_TRY)"
+%token T_CATCH      "catch (T_CATCH)"
+%token T_FINALLY    "finally (T_FINALLY)"
+%token T_THROW      "throw (T_THROW)"
+%token T_USE        "use (T_USE)"
+%token T_INSTEADOF  "insteadof (T_INSTEADOF)"
+%token T_GLOBAL     "global (T_GLOBAL)"
+%token T_STATIC     "static (T_STATIC)"
+%token T_ABSTRACT   "abstract (T_ABSTRACT)"
+%token T_FINAL      "final (T_FINAL)"
+%token T_PRIVATE    "private (T_PRIVATE)"
+%token T_PROTECTED  "protected (T_PROTECTED)"
+%token T_PUBLIC     "public (T_PUBLIC)"
+%token T_VAR        "var (T_VAR)"
+%token T_UNSET      "unset (T_UNSET)"
+%token T_ISSET      "isset (T_ISSET)"
+%token T_EMPTY      "empty (T_EMPTY)"
+%token T_HALT_COMPILER "__halt_compiler (T_HALT_COMPILER)"
+%token T_CLASS      "class (T_CLASS)"
+%token T_TRAIT      "trait (T_TRAIT)"
+%token T_INTERFACE  "interface (T_INTERFACE)"
+%token T_EXTENDS    "extends (T_EXTENDS)"
+%token T_IMPLEMENTS "implements (T_IMPLEMENTS)"
+%token T_OBJECT_OPERATOR "-> (T_OBJECT_OPERATOR)"
+%token T_DOUBLE_ARROW    "=> (T_DOUBLE_ARROW)"
+%token T_LIST            "list (T_LIST)"
+%token T_ARRAY           "array (T_ARRAY)"
+%token T_CALLABLE        "callable (T_CALLABLE)"
+%token T_LINE            "__LINE__ (T_LINE)"
+%token T_FILE            "__FILE__ (T_FILE)"
+%token T_DIR             "__DIR__ (T_DIR)"
+%token T_CLASS_C         "__CLASS__ (T_CLASS_C)"
+%token T_TRAIT_C         "__TRAIT__ (T_TRAIT_C)"
+%token T_METHOD_C        "__METHOD__ (T_METHOD_C)"
+%token T_FUNC_C          "__FUNCTION__ (T_FUNC_C)"
+%token T_COMMENT         "comment (T_COMMENT)"
+%token T_DOC_COMMENT     "doc comment (T_DOC_COMMENT)"
+%token T_OPEN_TAG        "open tag (T_OPEN_TAG)"
+%token T_OPEN_TAG_WITH_ECHO "open tag with echo (T_OPEN_TAG_WITH_ECHO)"
+%token T_CLOSE_TAG       "close tag (T_CLOSE_TAG)"
+%token T_WHITESPACE      "whitespace (T_WHITESPACE)"
+%token T_START_HEREDOC   "heredoc start (T_START_HEREDOC)"
+%token T_END_HEREDOC     "heredoc end (T_END_HEREDOC)"
+%token T_DOLLAR_OPEN_CURLY_BRACES "${ (T_DOLLAR_OPEN_CURLY_BRACES)"
+%token T_CURLY_OPEN      "{$ (T_CURLY_OPEN)"
+%token T_PAAMAYIM_NEKUDOTAYIM ":: (T_PAAMAYIM_NEKUDOTAYIM)"
+%token T_NAMESPACE       "namespace (T_NAMESPACE)"
+%token T_NS_C            "__NAMESPACE__ (T_NS_C)"
+%token T_NS_SEPARATOR    "\\ (T_NS_SEPARATOR)"
+%token T_ELLIPSIS        "... (T_ELLIPSIS)"
+%token T_COALESCE        "?? (T_COALESCE)"
+%token T_POW             "** (T_POW)"
+%token T_POW_EQUAL       "**= (T_POW_EQUAL)"
+%token T_BAD_CHARACTER   "invalid character (T_BAD_CHARACTER)"
+
+;; Token used to force a parse error from the lexer
+%token T_ERROR
+
+%type <ast> top_statement namespace_name name statement 
function_declaration_statement
+%type <ast> class_declaration_statement trait_declaration_statement
+%type <ast> interface_declaration_statement interface_extends_list
+%type <ast> group_use_declaration inline_use_declarations 
inline_use_declaration
+%type <ast> mixed_group_use_declaration use_declaration 
unprefixed_use_declaration
+%type <ast> unprefixed_use_declarations const_decl inner_statement
+%type <ast> expr optional_expr while_statement for_statement foreach_variable
+%type <ast> foreach_statement declare_statement finally_statement 
unset_variable variable
+%type <ast> extends_from parameter optional_type_without_static argument 
global_var
+%type <ast> static_var class_statement trait_adaptation trait_precedence 
trait_alias
+%type <ast> absolute_trait_method_reference trait_method_reference property 
echo_expr
+%type <ast> new_expr anonymous_class class_name class_name_reference 
simple_variable
+%type <ast> internal_functions_in_yacc
+%type <ast> exit_expr scalar backticks_expr lexical_var function_call 
member_name property_name
+%type <ast> variable_class_name dereferencable_scalar constant class_constant
+%type <ast> fully_dereferencable array_object_dereferencable
+%type <ast> callable_expr callable_variable static_member new_variable
+%type <ast> encaps_var encaps_var_offset isset_variables
+%type <ast> top_statement_list use_declarations const_list 
inner_statement_list if_stmt
+%type <ast> alt_if_stmt for_exprs switch_case_list global_var_list 
static_var_list
+%type <ast> echo_expr_list unset_variables catch_name_list catch_list 
optional_variable parameter_list class_statement_list
+%type <ast> implements_list case_list if_stmt_without_else
+%type <ast> non_empty_parameter_list argument_list non_empty_argument_list 
property_list
+%type <ast> class_const_list class_const_decl class_name_list 
trait_adaptations method_body non_empty_for_exprs
+%type <ast> ctor_arguments alt_if_stmt_without_else trait_adaptation_list 
lexical_vars
+%type <ast> lexical_var_list encaps_list
+%type <ast> array_pair non_empty_array_pair_list array_pair_list 
possible_array_pair
+%type <ast> isset_variable type return_type type_expr type_without_static
+%type <ast> identifier type_expr_without_static union_type_without_static
+%type <ast> inline_function union_type
+
+%type <num> returns_ref function fn is_reference is_variadic variable_modifiers
+%type <num> method_modifiers non_empty_member_modifiers member_modifier
+%type <num> class_modifiers class_modifier use_type backup_fn_flags
+
+%type <ptr> backup_lex_pos
+%type <str> backup_doc_comment
+
+%start isset_variable
+
+%%
+
+reserved_non_modifiers:
+    T_INCLUDE
+    | T_INCLUDE_ONCE
+    | T_EVAL
+    | T_REQUIRE
+    | T_REQUIRE_ONCE
+    | T_LOGICAL_OR
+    | T_LOGICAL_XOR
+    | T_LOGICAL_AND
+    | T_INSTANCEOF
+    | T_NEW
+    | T_CLONE
+    | T_EXIT
+    | T_IF
+    | T_ELSEIF
+    | T_ELSE
+    | T_ENDIF
+    | T_ECHO
+    | T_DO
+    | T_WHILE
+    | T_ENDWHILE
+    | T_FOR
+    | T_ENDFOR
+    | T_FOREACH
+    | T_ENDFOREACH
+    | T_DECLARE
+    | T_ENDDECLARE
+    | T_AS
+    | T_TRY
+    | T_CATCH
+    | T_FINALLY
+    | T_THROW
+    | T_USE
+    | T_INSTEADOF
+    | T_GLOBAL
+    | T_VAR
+    | T_UNSET
+    | T_ISSET
+    | T_EMPTY
+    | T_CONTINUE
+    | T_GOTO
+    | T_FUNCTION
+    | T_CONST
+    | T_RETURN
+    | T_PRINT
+    | T_YIELD
+    | T_LIST
+    | T_SWITCH
+    | T_ENDSWITCH
+    | T_CASE
+    | T_DEFAULT
+    | T_BREAK
+    | T_ARRAY
+    | T_CALLABLE
+    | T_EXTENDS
+    | T_IMPLEMENTS
+    | T_NAMESPACE
+    | T_TRAIT
+    | T_INTERFACE
+    | T_CLASS
+    | T_CLASS_C
+    | T_TRAIT_C
+    | T_FUNC_C
+    | T_METHOD_C
+    | T_LINE
+    | T_FILE
+    | T_DIR
+    | T_NS_C
+    | T_FN
+    ;
+
+semi_reserved:
+    reserved_non_modifiers
+    | T_STATIC
+    | T_ABSTRACT
+    | T_FINAL
+    | T_PRIVATE
+    | T_PROTECTED
+    | T_PUBLIC
+    ;
+
+identifier:
+    T_STRING ($1)
+    | semi_reserved (let ((zv nil))(ZEND_LEX_TSTRING (lambda(ret) (setq zv 
ret)))(ZEND_AST_CREATE_ZVAL zv))
+    ;
+
+namespace_name:
+    T_STRING ($1)
+    | namespace_name T_NS_SEPARATOR T_STRING (ZEND_AST_APPEND_STR $1 $3)
+    ;
+
+name:
+    namespace_name (progn (semantic-tag-put-attribute $1 'attr 
'phps-mode-parser--zend_name_not_fq) $1)
+    | T_NAMESPACE T_NS_SEPARATOR namespace_name (progn 
(semantic-tag-put-attribute $3 'attr 'phps-mode-parser--zend_name_relative) $3)
+    | T_NS_SEPARATOR namespace_name (progn (semantic-tag-put-attribute $2 
'attr 'phps-mode-parser--zend_name_fq) $2)
+    ;
+
+class_name:
+    T_STATIC (let ((zv nil))(ZVAL_INTERNED_STR (lambda(return) (setq zv 
return)) (ZSTR_KNOWN 
'phps-mode-parser--zend_str_static))(ZEND_AST_CREATE_ZVAL_EX zv 
'phps-mode-parser--zend_name_not_fq))
+    | name ($1)
+    ;
+
+constant:
+    name (ZEND_AST_CREATE 'phps-mode-parser--zend_ast_const $1)
+    | T_LINE (ZEND_AST_CREATE_EX 'phps-mode-parser--zend_ast_magic_const 
'phps-mode-parser--t_line)
+    | T_FILE (ZEND_AST_CREATE_EX 'phps-mode-parser--zend_ast_magic_const 
'phps-mode-parser--t_file)
+    | T_DIR (ZEND_AST_CREATE_EX 'phps-mode-parser--zend_ast_magic_const 
'phps-mode-parser--t_dir)
+    | T_TRAIT_C (ZEND_AST_CREATE_EX 'phps-mode-parser--zend_ast_magic_const 
'phps-mode-parser--t_trait_c)
+    | T_METHOD_C (ZEND_AST_CREATE_EX 'phps-mode-parser--zend_ast_magic_const 
'phps-mode-parser--t_method_c)
+    | T_FUNC_C (ZEND_AST_CREATE_EX 'phps-mode-parser--zend_ast_magic_const 
'phps-mode-parser--t_func_c)
+    | T_NS_C (ZEND_AST_CREATE_EX 'phps-mode-parser--zend_ast_magic_const 
'phps-mode-parser--t_ns_c)
+    | T_CLASS_C (ZEND_AST_CREATE_EX 'phps-mode-parser--zend_ast_magic_const 
'phps-mode-parser--t_class_c)
+    ;
+
+class_constant:
+    class_name T_PAAMAYIM_NEKUDOTAYIM identifier 
(ZEND_AST_CREATE_CLASS_CONST_OR_NAME $1 $3)
+    | variable_class_name T_PAAMAYIM_NEKUDOTAYIM identifier 
(ZEND_AST_CREATE_CLASS_CONST_OR_NAME $1 $3)
+    ;
+
+property_name:
+    T_STRING ($1)
+    | OPEN_CURLY_BRACKET expr CLOSE_CURLY_BRACKET ($2)
+    | simple_variable (ZEND_AST_CREATE 'phps-mode-parser--zend_ast_var $1)
+    ;
+
+argument_list:
+    OPEN_PARENTHESIS CLOSE_PARENTHESIS (ZEND_AST_CREATE_LIST 0 
'phps-mode-parser--zend_ast_arg_list)
+    | OPEN_PARENTHESIS non_empty_argument_list possible_comma 
CLOSE_PARENTHESIS ($2)
+    ;
+
+possible_comma:
+    ;; empty
+    | COMMA
+    ;
+
+non_empty_argument_list:
+    argument (ZEND_AST_CREATE_LIST 1 'phps-mode-parser--zend_ast_arg_list $1)
+    | non_empty_argument_list COMMA argument (ZEND_AST_LIST_ADD $1 $3)
+    ;
+
+argument:
+    expr ($1)
+    | T_ELLIPSIS expr (ZEND_AST_CREATE 'phps-mode-parser--zend_ast_unpack $2)
+    ;
+
+function_call:
+    name argument_list (ZEND_AST_CREATE 'phps-mode-parser--zend_ast_call $1 $2)
+    | class_name T_PAAMAYIM_NEKUDOTAYIM member_name argument_list 
(ZEND_AST_CREATE 'phps-mode-parser--zend_ast_static_call $1 $3 $4)
+    | variable_class_name T_PAAMAYIM_NEKUDOTAYIM member_name argument_list 
(ZEND_AST_CREATE 'phps-mode-parser--zend_ast_static_call $1 $3 $4)
+    | callable_expr argument_list (ZEND_AST_CREATE 
'phps-mode-parser--zend_ast_call $1 $2)
+    ;
+
+member_name:
+    identifier ($1)
+    | OPEN_CURLY_BRACKET expr CLOSE_CURLY_BRACKET ($2)
+    | simple_variable (ZEND_AST_CREATE 'phps-mode-parser--zend_ast_var $1)
+    ;
+
+array_pair_list:
+    non_empty_array_pair_list (ZEND_AST_LIST_RTRIM $1)
+  ;
+
+possible_array_pair:
+    (nil)
+    | array_pair ($1)
+    ;
+
+non_empty_array_pair_list:
+    non_empty_array_pair_list COMMA possible_array_pair (ZEND_AST_LIST_ADD $1 
$3)
+    | possible_array_pair (ZEND_AST_CREATE_LIST 1 
'phps-mode-parser--zend_ast_array $1)
+    ;
+
+array_pair:
+    expr T_DOUBLE_ARROW expr (ZEND_AST_CREATE 
'phps-mode-parser--zend_ast_array_elem $3 $1)
+    | expr (ZEND_AST_CREATE 'phps-mode-parser--zend_ast_array_elem $1 nil)
+    | expr T_DOUBLE_ARROW BITWISE_AND variable (ZEND_AST_CREATE_EX 
'phps-mode-parser--zend_ast_array_elem 1 $4 $1)
+    | BITWISE_AND variable (ZEND_AST_CREATE_EX 
'phps-mode-parser--zend_ast_array_elem 1 $2 nil)
+    | T_ELLIPSIS expr (ZEND_AST_CREATE 'phps-mode-parser--zend_ast_unpack $2)
+    | expr T_DOUBLE_ARROW T_LIST OPEN_PARENTHESIS array_pair_list 
CLOSE_PARENTHESIS (progn (semantic-tag-put-attribute $4 'attr 
'phps-mode-parser--zend_array_syntax_list)(ZEND_AST_CREATE 
'phps-mode-parser--zend_ast_array_elem $5 $1))
+    | T_LIST OPEN_PARENTHESIS array_pair_list CLOSE_PARENTHESIS (progn 
(semantic-tag-put-attribute $3 'attr 
'phps-mode-parser--zend_array_syntax_list)(ZEND_AST_CREATE 
'phps-mode-parser--zend_ast_array_elem $3 nil))
+    ;
+
+encaps_list:
+    encaps_list encaps_var (ZEND_AST_LIST_ADD $1 $2)
+    | encaps_list T_ENCAPSED_AND_WHITESPACE (ZEND_AST_LIST_ADD $1 $2)
+    | encaps_var (ZEND_AST_CREATE_LIST 1 
'phps-mode-parser--zend_ast_encaps_list $1)
+    | T_ENCAPSED_AND_WHITESPACE encaps_var (ZEND_AST_CREATE_LIST 2 
'phps-mode-parser--zend_ast_encaps_list $1 $2)
+    ;
+
+encaps_var:
+    T_VARIABLE (ZEND_AST_CREATE 'phps-mode-parser--zend_ast_var $1)
+    | T_VARIABLE OPEN_SQUARE_BRACKET encaps_var_offset CLOSE_SQUARE_BRACKET 
(ZEND_AST_CREATE 'phps-mode-parser--zend_ast_dim (ZEND_AST_CREATE 
'phps-mode-parser--zend_ast_var $1) $3)
+    | T_VARIABLE T_OBJECT_OPERATOR T_STRING (ZEND_AST_CREATE 
'phps-mode-parser--zend_ast_prop (ZEND_AST_CREATE 
'phps-mode-parser--zend_ast_var $1) $3)
+    | T_DOLLAR_OPEN_CURLY_BRACES expr CLOSE_CURLY_BRACKET (ZEND_AST_CREATE 
'phps-mode-parser--zend_ast_var $2)
+    | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME CLOSE_CURLY_BRACKET 
(ZEND_AST_CREATE 'phps-mode-parser--zend_ast_var $2)
+    | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME OPEN_SQUARE_BRACKET expr 
CLOSE_SQUARE_BRACKET CLOSE_CURLY_BRACKET (ZEND_AST_CREATE 
'phps-mode-parser--zend_ast_dim (ZEND_AST_CREATE 
'phps-mode-parser--zend_ast_var $2) $4)
+    | T_CURLY_OPEN variable CLOSE_CURLY_BRACKET ($2)
+    ;
+
+encaps_var_offset:
+    T_STRING ($1)
+    | T_NUM_STRING ($1)
+    | '-' T_NUM_STRING (ZEND_NEGATE_NUM_STRING $2)
+    | T_VARIABLE (ZEND_AST_CREATE 'phps-mode-parser--zend_ast_var $1)
+    ;
+
+dereferencable_scalar:
+    T_ARRAY OPEN_PARENTHESIS array_pair_list CLOSE_PARENTHESIS (progn 
(semantic-tag-put-attribute $3 'attr 'phps-mode-parser--zend_array_syntax_long) 
$3)
+    | OPEN_SQUARE_BRACKET array_pair_list CLOSE_SQUARE_BRACKET (progn 
(semantic-tag-put-attribute $2 'attr 
'phps-mode-parser--zend_array_syntax_short) $2)
+    | T_CONSTANT_ENCAPSED_STRING ($1)
+    | DOUBLE_QUOTE encaps_list DOUBLE_QUOTE ($2)
+    ;
+
+optional_expr:
+    (nil)
+    | expr ($1)
+    ;
+
+variable_class_name:
+    fully_dereferencable ($1)
+    ;
+
+fully_dereferencable:
+    variable ($1)
+    | OPEN_PARENTHESIS expr CLOSE_PARENTHESIS ($2)
+    | dereferencable_scalar ($1)
+    | class_constant ($1)
+    ;
+
+array_object_dereferencable:
+    fully_dereferencable ($1)
+    | constant ($1)
+    ;
+
+callable_expr:
+    callable_variable ($1)
+    | OPEN_PARENTHESIS expr CLOSE_PARENTHESIS ($2)
+    | dereferencable_scalar ($1)
+    ;
+
+callable_variable:
+    simple_variable (ZEND_AST_CREATE 'phps-mode-parser--zend_ast_var $1)
+    | array_object_dereferencable OPEN_SQUARE_BRACKET optional_expr 
CLOSE_SQUARE_BRACKET (ZEND_AST_CREATE 'phps-mode-parser--zend_ast_dim $1 $3)
+    | array_object_dereferencable OPEN_CURLY_BRACKET expr CLOSE_CURLY_BRACKET 
(ZEND_AST_CREATE_EX 'phps-mode-parser--zend_ast_dim 
'phps-mode-parser--zend_dim_alternative_syntax $1 $3)
+    | array_object_dereferencable T_OBJECT_OPERATOR property_name 
argument_list (ZEND_AST_CREATE 'phps-mode-parser--zend_ast_method_call $1 $3 $4)
+    | function_call ($1)
+    ;
+
+variable:
+    callable_variable ($1)
+    | static_member ($1)
+    | array_object_dereferencable T_OBJECT_OPERATOR property_name 
(ZEND_AST_CREATE 'phps-mode-parser--zend_ast_prop $1 $2)
+    ;
+
+simple_variable:
+    T_VARIABLE ($1)
+    | DOLLAR_SIGN OPEN_CURLY_BRACKET expr CLOSE_CURLY_BRACKET ($3)
+    | DOLLAR_SIGN simple_variable (ZEND_AST_CREATE 
'phps-mode-parser--zend_ast_var $2)
+    ;
+
+static_member:
+    class_name T_PAAMAYIM_NEKUDOTAYIM simple_variable (ZEND_AST_CREATE 
'phps-mode-parser--zend_ast_static_prop $1 $3)
+    | variable_class_name T_PAAMAYIM_NEKUDOTAYIM simple_variable 
(ZEND_AST_CREATE 'phps-mode-parser--zend_ast_static_prop $1 $3)
+    ;
+
+expr:
+    variable ($1)
+    | T_LIST OPEN_PARENTHESIS array_pair_list CLOSE_PARENTHESIS ASSIGN expr 
(progn (semantic-tag-put-attribute $3 'attr 
phps-mode-parser--zend_array_syntax_list)(ZEND_AST_CREATE 
'phps-mode-parser--zend_ast_assign $3 $6)
+    | OPEN_SQUARE_BRACKET array_pair_list CLOSE_SQUARE_BRACKET ASSIGN expr 
(progn (semantic-tag-put-attribute $2 'attr 
'phps-mode-parser--zend_array_syntax_short)(ZEND_AST_CREATE 
'phps-mode-parser--zend_ast_assign $2 $5))
+    | variable ASSIGN expr (ZEND_AST_CREATE 'phps-mode-parser--zend_ast_assign 
$1 $3)
+    | variable ASSIGN BITWISE_AND variable (ZEND_AST_CREATE 
'phps-mode-parser--zend_ast_assign_ref $1 $4)
+    | T_CLONE expr (ZEND_AST_CREATE 'phps-mode-parser--zend_ast_clone $2)
+    | variable T_PLUS_EQUAL expr (ZEND_AST_CREATE_ASSIGN_OP 
'phps-mode-parser--zend_add $1 $3)
+    | variable T_MINUS_EQUAL expr (ZEND_AST_CREATE_ASSIGN_OP 
'phps-mode-parser--zend_sub $1 $3)
+    | variable T_MUL_EQUAL expr (ZEND_AST_CREATE_ASSIGN_OP 
'phps-mode-parser--zend_mul $1 $3)
+    | variable T_POW_EQUAL expr (ZEND_AST_CREATE_ASSIGN_OP 
'phps-mode-parser--zend_pow $1 $3)
+    | variable T_DIV_EQUAL expr (ZEND_AST_CREATE_ASSIGN_OP 
'phps-mode-parser--zend_div $1 $3)
+    | variable T_CONCAT_EQUAL expr (ZEND_AST_CREATE_ASSIGN_OP 
'phps-mode-parser--zend_concat $1 $3)
+    | variable T_MOD_EQUAL expr (ZEND_AST_CREATE_ASSIGN_OP 
'phps-mode-parser--zend_mod $1 $3)
+    | variable T_AND_EQUAL expr (ZEND_AST_CREATE_ASSIGN_OP 
'phps-mode-parser--zend_bw_and $1 $3)
+    | variable T_OR_EQUAL expr (ZEND_AST_CREATE_ASSIGN_OP 
'phps-mode-parser--zend_bw_or $1 $3)
+    | variable T_XOR_EQUAL expr (ZEND_AST_CREATE_ASSIGN_OP 
'phps-mode-parser--zend_bw_xor $1 $3)
+    | variable T_SL_EQUAL expr (ZEND_AST_CREATE_ASSIGN_OP 
'phps-mode-parser--zend_sl $1 $3)
+    | variable T_SR_EQUAL expr (ZEND_AST_CREATE_ASSIGN_OP 
'phps-mode-parser--zend_sr $1 $3)
+    | variable T_COALESCE_EQUAL expr (ZEND_AST_CREATE 
'phps-mode-parser--zend_coalesce $1 $3)
+    | variable T_INC (ZEND_AST_CREATE 'phps-mode-parser--zend_post_inc $1)
+    | T_INC variable (ZEND_AST_CREATE 'phps-mode-parser--zend_pre_inc $2)
+    | variable T_DEC (ZEND_AST_CREATE 'phps-mode-parser--zend_post_dec $1)
+    | T_DEC variable (ZEND_AST_CREATE 'phps-mode-parser--zend_pre_inc $2)
+    | expr T_BOOLEAN_OR expr (ZEND_AST_CREATE 'phps-mode-parser--zend_ast_or 
$1 $3)
+    | expr T_BOOLEAN_AND expr (ZEND_AST_CREATE 'phps-mode-parser--zend_ast_and 
$1 $3)
+    | expr T_LOGICAL_OR expr (ZEND_AST_CREATE 'phps-mode-parser--zend_ast_or 
$1 $3)
+    | expr T_LOGICAL_AND expr (ZEND_AST_CREATE 'phps-mode-parser--zend_ast_and 
$1 $3)
+    | expr T_LOGICAL_XOR expr (ZEND_AST_CREATE_BINARY_OP 
'phps-mode-parser--zend_bool_xor $1 $3)
+    | expr BITWISE_OR expr (ZEND_AST_CREATE_BINARY_OP 
'phps-mode-parser--zend_bw_or $1 $3)
+    | expr BITWISE_AND expr (ZEND_AST_CREATE_BINARY_OP 
'phps-mode-parser--zend_bw_and $1 $3)
+    | expr POW expr (ZEND_AST_CREATE_BINARY_OP 'phps-mode-parser--zend_bw_xor 
$1 $3)
+    | expr DOT expr (ZEND_AST_CREATE_BINARY_OP 'phps-mode-parser--zend_concat 
$1 $3)
+    | expr ADDITION expr (ZEND_AST_CREATE_BINARY_OP 
'phps-mode-parser--zend_add $1 $3)
+    | expr SUBTRACTION expr (ZEND_AST_CREATE_BINARY_OP 
'phps-mode-parser--zend_sub $1 $3)
+    | expr MULTIPLICATION expr (ZEND_AST_CREATE_BINARY_OP 
'phps-mode-parser--zend_mul $1 $3)
+    | expr T_POW expr (ZEND_AST_CREATE_BINARY_OP 'phps-mode-parser--zend_pow 
$1 $3)
+    | expr DIVISION expr (ZEND_AST_CREATE_BINARY_OP 
'phps-mode-parser--zend_div $1 $3)
+    | expr MODULO expr (ZEND_AST_CREATE_BINARY_OP 'phps-mode-parser--zend_mod 
$1 $3)
+    | expr T_SL expr (ZEND_AST_CREATE_BINARY_OP 'phps-mode-parser--zend_sl $1 
$3)
+    | expr T_SR expr (ZEND_AST_CREATE_BINARY_OP 'phps-mode-parser--zend_sr $1 
$3)
+    | ADDITION expr prec UNARY (ZEND_AST_CREATE 
'phps-mode-parser--zend_ast_unary_plus $1 $2)
+    | SUBTRACTION expr prec UNARY (ZEND_AST_CREATE 
'phps-mode-parser--zend_ast_unary_minus $1 $2)
+    | NEGATION expr (ZEND_AST_CREATE_EX 'phps-mode-parser--zend_ast_unary_op 
'phps-mode-parser--zend_bool_not $2)
+    | UNARY expr (ZEND_AST_CREATE_EX 'phps-mode-parser--zend_ast_unary_op 
'phps-mode-parser--zend_bw_not $2)
+    | expr T_IS_IDENTICAL expr (ZEND_AST_CREATE_BINARY_OP 
'phps-mode-parser--zend_is_identical $1 $3)
+    | expr T_IS_NOT_IDENTICAL expr (ZEND_AST_CREATE_BINARY_OP 
'phps-mode-parser--zend_is_not_identical $1 $3)
+    | expr T_IS_EQUAL expr (ZEND_AST_CREATE_BINARY_OP 
'phps-mode-parser--zend_is_equal $1 $3)
+    | expr T_IS_NOT_EQUAL expr (ZEND_AST_CREATE_BINARY_OP 
'phps-mode-parser--zend_is_not_equal $1 $3)
+    | expr LESSER_THAN expr (ZEND_AST_CREATE_BINARY_OP 
'phps-mode-parser--zend_is_smaller $1 $3)
+    | expr T_IS_SMALLER_OR_EQUAL expr (ZEND_AST_CREATE_BINARY_OP 
'phps-mode-parser--zend_is_smaller_or_equal $1 $3)
+    | expr GREATER_THAN expr (ZEND_AST_CREATE_BINARY_OP 
'phps-mode-parser--zend_is_greater $1 $3)
+    | expr T_IS_GREATER_OR_EQUAL expr (ZEND_AST_CREATE_BINARY_OP 
'phps-mode-parser--zend_is_greater_or_equal $1 $3)
+    | expr T_SPACESHIP expr (ZEND_AST_CREATE_BINARY_OP 
'phps-mode-parser--zend_spaceship $1 $3)
+    | expr T_INSTANCEOF class_name_reference (ZEND_AST_CREATE 
'phps-mode-parser--zend_instanceof $1 $3)
+    | OPEN_PARENTHESIS expr CLOSE_PARENTHESIS (progn (when (equal 
(semantic-tag-get-attribute $2 'kind) 'phps-mode-parser--zend_ast_conditional) 
(semantic-tag-put-attribute $2 'attr 
'phps-mode-parser--zend_parenthesized_conditional)) $2)
+    | new_expr ($1)
+    | expr QUESTION_MARK expr COLON expr (ZEND_AST_CREATE 
'phps-mode-parser--zend_ast_conditional $1 $3 $5)
+    | expr QUESTION_MARK COLON expr (ZEND_AST_CREATE 
'phps-mode-parser--zend_ast_conditional $1 nil $4)
+    | expr T_COALESCE expr (ZEND_AST_CREATE 
'phps-mode-parser--zend_ast_coalesce $1 $3)
+    | internal_functions_in_yacc ($1))
+    | T_INT_CAST expr (ZEND_AST_CREATE_CAST 'phps-mode-parser--is_long $2)
+    | T_DOUBLE_CAST expr (ZEND_AST_CREATE_CAST 'phps-mode-parser--is_double $2)
+    | T_STRING_CAST expr (ZEND_AST_CREATE_CAST 'phps-mode-parser--is_string $2)
+    | T_ARRAY_CAST expr (ZEND_AST_CREATE_CAST 'phps-mode-parser--is_array $2)
+    | T_OBJECT_CAST expr (ZEND_AST_CREATE_CAST 'phps-mode-parser--is_object $2)
+    | T_BOOL_CAST expr (ZEND_AST_CREATE_CAST 'phps-mode-parser--is_bool $2)
+    | T_UNSET_CAST expr (ZEND_AST_CREATE_CAST 'phps-mode-parser--is_unset $2)
+    | T_EXIT exit_expr (ZEND_AST_CREATE 'phps-mode-parser--zend_ast_exit $2)
+    | AT expr (ZEND_AST_CREATE 'phps-mode-parser--zend_ast_silence $2)
+    | scalar ($1)
+    | BACKTICK backticks_expr BACKTICK (ZEND_AST_CREATE 
'phps-mode-parser--zend_ast_shell $2)
+    | T_PRINT expr (ZEND_AST_CREATE 'phps-mode-parser--zend_ast_print $2)
+    | T_YIELD (progn (phps-mode-parser-grammar-macro-CG 
'phps-mode-parser--extra_fn_flags (logior (phps-mode-parser-grammar-macro-CG 
'phps-mode-parser--extra_fn_flags) 
'phps-mode-parser--zend_acc_generator))(ZEND_AST_CREATE 
'phps-mode-parser--zend_ast_yield nil nil))
+    | T_YIELD expr (progn (phps-mode-parser-grammar-macro-CG 
'phps-mode-parser--extra_fn_flags (logior (phps-mode-parser-grammar-macro-CG 
'phps-mode-parser--extra_fn_flags) 
'phps-mode-parser--zend_acc_generator))(ZEND_AST_CREATE 
'phps-mode-parser--zend_ast_yield $2 nil))
+    | T_YIELD expr T_DOUBLE_ARROW expr (progn 
(phps-mode-parser-grammar-macro-CG 'phps-mode-parser--extra_fn_flags (logior 
(phps-mode-parser-grammar-macro-CG 'phps-mode-parser--extra_fn_flags) 
'phps-mode-parser--zend_acc_generator))(ZEND_AST_CREATE 
'phps-mode-parser--zend_ast_yield $4 $2))
+    | T_YIELD_FROM expr (progn (phps-mode-parser-grammar-macro-CG 
'phps-mode-parser--extra_fn_flags (logior (phps-mode-parser-grammar-macro-CG 
'phps-mode-parser--extra_fn_flags) 
'phps-mode-parser--zend_acc_generator))(ZEND_AST_CREATE 
'phps-mode-parser--zend_ast_yield_from $2))
+    | T_THROW expr (ZEND_AST_CREATE 'phps-mode-parser--zend_ast_throw $2)
+    | inline_function ($1)
+    | T_STATIC inline_function (progn (semantic-tag-put-attribute $2 'flags 
(logior (semantic-tag-get-attribute $2 'flags) 
'phps-mode-parser--zend_acc_static)) $2)
+    ;
+
+isset_variable:
+    expr (ZEND_AST_CREATE 'phps-mode-parser--zend_ast_isset $1)
+    ;
+
+%%
\ No newline at end of file
diff --git a/phps-mode-semantic.el b/phps-mode-semantic.el
deleted file mode 100644
index 0f29500..0000000
--- a/phps-mode-semantic.el
+++ /dev/null
@@ -1,36 +0,0 @@
-;;; phps-mode-semantic.el --- Semantic for PHPs -*- lexical-binding: t -*-
-
-;; Copyright (C) 2018-2019  Free Software Foundation, Inc.
-
-;; This file is not part of GNU Emacs.
-
-;; This program is free software; you can redistribute it and/or
-;; modify it under the terms of the GNU General Public License as
-;; published by the Free Software Foundation; either version 2, or (at
-;; your option) any later version.
-
-;; This program is distributed in the hope that it will be useful, but
-;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-;; General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
-
-
-;;; Commentary:
-
-;; This entire file is WIP / TODO
-
-;;; Code:
-
-(require 'semantic)
-(require 'semantic/ctxt)
-(require 'semantic/doc)
-(require 'semantic/format)
-
-
-
-(provide 'phps-mode-semantic)
-
-;;; phps-mode-semantic.el ends here
diff --git a/phps-mode-tags.el b/phps-mode-tags.el
deleted file mode 100644
index 5ad3eb0..0000000
--- a/phps-mode-tags.el
+++ /dev/null
@@ -1,37 +0,0 @@
-;;; phps-mode-tags.el --- PHP LALR parser for Emacs -*- lexical-binding: t -*-
-
-;; Copyright (C) 2017-2019  Free Software Foundation, Inc.
-
-;; This file is not part of GNU Emacs.
-
-;; GNU Emacs is free software: you can redistribute it and/or modify
-;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation, either version 3 of the License, or
-;; (at your option) any later version.
-
-;; GNU Emacs is distributed in the hope that it will be useful,
-;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-;; GNU General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
-
-
-;;; Commentary:
-
-;; TODO This entire file is WIP / TODO
-
-;; TODO Make similar to 
/Users/christianjohansson/Documents/emacs/nextstep/Emacs.app/Contents/Resources/lisp/cedet/semantic/wisent/java-tags.el.gz
-
-
-;;; Code:
-
-(require 'semantic/wisent)
-
-;;;; Semantic integration of the PHP LALR parser
-
-
-(provide 'phps-mode-tags)
-
-;;; phps-mode-tags.el ends here
diff --git a/phps-mode-wy-macros.el b/phps-mode-wy-macros.el
deleted file mode 100644
index cb93e51..0000000
--- a/phps-mode-wy-macros.el
+++ /dev/null
@@ -1,113 +0,0 @@
-;;; phps-mode-wy-macros.el --- Macros for Wisent grammar -*- lexical-binding: 
t -*-
-
-;; Copyright (C) 2018-2019  Free Software Foundation, Inc.
-
-;; This file is not part of GNU Emacs.
-
-;; This program is free software; you can redistribute it and/or
-;; modify it under the terms of the GNU General Public License as
-;; published by the Free Software Foundation; either version 2, or (at
-;; your option) any later version.
-
-;; This program is distributed in the hope that it will be useful, but
-;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-;; General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
-
-
-;;; Commentary:
-
-;;; Provides functions for the Wisent grammar.
-
-
-;;; Code:
-
-
-(defvar phps-mode-wy-macros--CG-data
-  (make-hash-table :test 'equal)
-  "A hash-table with all settings.")
-
-(defun phps-mode-wy-macros--CG (subject &optional value)
-  "Return and optionally set VALUE of SUBJECT."
-  (if value
-      (puthash subject value phps-mode-wy-macros--CG-data)
-    (gethash subject phps-mode-wy-macros--CG-data)))
-
-(defun phps-mode-wy-macros--zend_add_class_modifier (_class _modifier)
-  "Add CLASS MODIFIER."
-  )
-
-(defun phps-mode-wy-macros--zend_add_member_modifier (_member _modifier)
-  "Add MEMBER MODIFIER."
-  )
-
-(defun phps-mode-wy-macros--zend_ast_create (_a _b _c _d)
-  ;; TODO Understand this
-  )
-
-(defun phps-mode-wy-macros--zend_ast_create_assign_op (_operator _a _b)
-  "Assign A value of B via OPERATOR."
-  ;; TODO Understand this
-  )
-
-(defun phps-mode-wy-macros--zend_ast_create_binary_op (_operator _a _b)
-  "Perform binary OPERATOR on A and B."
-  ;; TODO Understand this
-  )
-
-(defun phps-mode-wy-macros--zend_ast_create_cast (_operator _subject)
-  "Cast SUBJECT with OPERATOR."
-  ;; TODO Understand this
-  )
-
-(defun phps-mode-wy-macros--zend_ast_create_decl (_a _b _c _d _e _f _g _h)
-  ;; TODO Understand this
-  )
-
-(defun phps-mode-wy-macros--zend_ast_create_ex (_a _b _c _d)
-  ;; TODO Understand this
-  )
-
-(defun phps-mode-wy-macros--zend_ast_create_list (_a _b _c)
-  ;; TODO Understand this
-  )
-
-(defun phps-mode-wy-macros--zend_ast_create_zval_from_str (_subject)
-  "Create zval from SUBJECT."
-  ;; TODO Understand this
-  )
-
-(defun phps-mode-wy-macros--zend_ast_get_str (_subject)
-  "Get string from SUBJECT."
-  ;; TODO Understand this
-  )
-
-(defun phps-mode-wy-macros--zend_lex_tstring(_subject)
-  ;; TODO Understand this
-  )
-
-(defun phps-mode-wy-macros--zend_ast_list_add (_list _item)
-  "Add ITEM to LIST."
-  ;; TODO Understand this
-  )
-
-(defun phps-mode-wy-macros--zend_ast_list_rtrim (_subject)
-  "Perform a right trim on SUBJECT."
-  ;; TODO Understand this
-  )
-
-(defun phps-mode-wy-macros--zend_handle_encoding_declaration (_subject)
-  ;; TODO Understand this
-  )
-
-(defun phps-mode-wy-macros--zend_negate_num_string (_subject)
-  "Negate num string on SUBJECT."
-  ;; TODO Understand this
-  )
-
-
-(provide 'phps-mode-wy-macros)
-;;; phps-mode-wy-macros.el ends here
diff --git a/phps-mode-wy.el b/phps-mode-wy.el
new file mode 100644
index 0000000..ec24792
--- /dev/null
+++ b/phps-mode-wy.el
@@ -0,0 +1,1004 @@
+;;; phps-mode-wy.el --- Generated parser support file
+
+;; Copyright (C) 2018-2020  Free Software Foundation, Inc.
+
+;; Author: Christian Johansson 
<christianjohansson@Christians-MacBook-Air.local>
+;; Created: 2020-06-05 09:39:40+0200
+;; Keywords: syntax
+;; X-RCS: $Id$
+
+;; This file is not part of GNU Emacs.
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation, either version 3 of
+;; the License, or (at your option) any later version.
+
+;; This software is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;; General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+;; PLEASE DO NOT MANUALLY EDIT THIS FILE!  It is automatically
+;; generated from the grammar file phps-mode-parser-grammar.wy.
+
+;;; History:
+;;
+
+;;; Code:
+
+(require 'semantic/lex)
+(eval-when-compile (require 'semantic/bovine))
+
+;;; Prologue
+;;
+(setq max-specpdl-size 160000)
+
+;;; Declarations
+;;
+(eval-and-compile (defconst phps-mode--expected-conflicts
+                    nil
+                    "The number of expected shift/reduce conflicts in this 
grammar."))
+
+(defconst phps-mode--keyword-table
+  (semantic-lex-make-keyword-table
+   '(("include (T_INCLUDE)" . T_INCLUDE)
+     ("include_once (T_INCLUDE_ONCE)" . T_INCLUDE_ONCE)
+     ("eval (T_EVAL)" . T_EVAL)
+     ("require (T_REQUIRE)" . T_REQUIRE)
+     ("require_once (T_REQUIRE_ONCE)" . T_REQUIRE_ONCE)
+     ("or (T_LOGICAL_OR)" . T_LOGICAL_OR)
+     ("xor (T_LOGICAL_XOR)" . T_LOGICAL_XOR)
+     ("and (T_LOGICAL_AND)" . T_LOGICAL_AND)
+     ("print (T_PRINT)" . T_PRINT)
+     ("yield (T_YIELD)" . T_YIELD)
+     ("yield from (T_YIELD_FROM)" . T_YIELD_FROM)
+     ("+= (T_PLUS_EQUAL)" . T_PLUS_EQUAL)
+     ("-= (T_MINUS_EQUAL)" . T_MINUS_EQUAL)
+     ("*= (T_MUL_EQUAL)" . T_MUL_EQUAL)
+     ("/= (T_DIV_EQUAL)" . T_DIV_EQUAL)
+     (".= (T_CONCAT_EQUAL)" . T_CONCAT_EQUAL)
+     ("%= (T_MOD_EQUAL)" . T_MOD_EQUAL)
+     ("&= (T_AND_EQUAL)" . T_AND_EQUAL)
+     ("|= (T_OR_EQUAL)" . T_OR_EQUAL)
+     ("^= (T_XOR_EQUAL)" . T_XOR_EQUAL)
+     ("<<= (T_SL_EQUAL)" . T_SL_EQUAL)
+     (">>= (T_SR_EQUAL)" . T_SR_EQUAL)
+     ("??= (T_COALESCE_EQUAL)" . T_COALESCE_EQUAL)
+     ("|| (T_BOOLEAN_OR)" . T_BOOLEAN_OR)
+     ("&& (T_BOOLEAN_AND)" . T_BOOLEAN_AND)
+     ("== (T_IS_EQUAL)" . T_IS_EQUAL)
+     ("!= (T_IS_NOT_EQUAL)" . T_IS_NOT_EQUAL)
+     ("=== (T_IS_IDENTICAL)" . T_IS_IDENTICAL)
+     ("!== (T_IS_NOT_IDENTICAL)" . T_IS_NOT_IDENTICAL)
+     ("<= (T_IS_SMALLER_OR_EQUAL)" . T_IS_SMALLER_OR_EQUAL)
+     (">= (T_IS_GREATER_OR_EQUAL)" . T_IS_GREATER_OR_EQUAL)
+     ("<=> (T_SPACESHIP)" . T_SPACESHIP)
+     ("<< (T_SL)" . T_SL)
+     (">> (T_SR)" . T_SR)
+     ("instanceof (T_INSTANCEOF)" . T_INSTANCEOF)
+     ("++ (T_INC)" . T_INC)
+     ("-- (T_DEC)" . T_DEC)
+     ("(int) (T_INT_CAST)" . T_INT_CAST)
+     ("(double) (T_DOUBLE_CAST)" . T_DOUBLE_CAST)
+     ("(string) (T_STRING_CAST)" . T_STRING_CAST)
+     ("(array) (T_ARRAY_CAST)" . T_ARRAY_CAST)
+     ("(object) (T_OBJECT_CAST)" . T_OBJECT_CAST)
+     ("(bool) (T_BOOL_CAST)" . T_BOOL_CAST)
+     ("(unset) (T_UNSET_CAST)" . T_UNSET_CAST)
+     ("new (T_NEW)" . T_NEW)
+     ("clone (T_CLONE)" . T_CLONE)
+     ("exit (T_EXIT)" . T_EXIT)
+     ("if (T_IF)" . T_IF)
+     ("elseif (T_ELSEIF)" . T_ELSEIF)
+     ("else (T_ELSE)" . T_ELSE)
+     ("endif (T_ENDIF)" . T_ENDIF)
+     ("echo (T_ECHO)" . T_ECHO)
+     ("do (T_DO)" . T_DO)
+     ("while (T_WHILE)" . T_WHILE)
+     ("endwhile (T_ENDWHILE)" . T_ENDWHILE)
+     ("for (T_FOR)" . T_FOR)
+     ("endfor (T_ENDFOR)" . T_ENDFOR)
+     ("foreach (T_FOREACH)" . T_FOREACH)
+     ("endforeach (T_ENDFOREACH)" . T_ENDFOREACH)
+     ("declare (T_DECLARE)" . T_DECLARE)
+     ("enddeclare (T_ENDDECLARE)" . T_ENDDECLARE)
+     ("as (T_AS)" . T_AS)
+     ("switch (T_SWITCH)" . T_SWITCH)
+     ("endswitch (T_ENDSWITCH)" . T_ENDSWITCH)
+     ("case (T_CASE)" . T_CASE)
+     ("default (T_DEFAULT)" . T_DEFAULT)
+     ("break (T_BREAK)" . T_BREAK)
+     ("continue (T_CONTINUE)" . T_CONTINUE)
+     ("goto (T_GOTO)" . T_GOTO)
+     ("function (T_FUNCTION)" . T_FUNCTION)
+     ("fn (T_FN)" . T_FN)
+     ("const (T_CONST)" . T_CONST)
+     ("return (T_RETURN)" . T_RETURN)
+     ("try (T_TRY)" . T_TRY)
+     ("catch (T_CATCH)" . T_CATCH)
+     ("finally (T_FINALLY)" . T_FINALLY)
+     ("throw (T_THROW)" . T_THROW)
+     ("use (T_USE)" . T_USE)
+     ("insteadof (T_INSTEADOF)" . T_INSTEADOF)
+     ("global (T_GLOBAL)" . T_GLOBAL)
+     ("static (T_STATIC)" . T_STATIC)
+     ("abstract (T_ABSTRACT)" . T_ABSTRACT)
+     ("final (T_FINAL)" . T_FINAL)
+     ("private (T_PRIVATE)" . T_PRIVATE)
+     ("protected (T_PROTECTED)" . T_PROTECTED)
+     ("public (T_PUBLIC)" . T_PUBLIC)
+     ("var (T_VAR)" . T_VAR)
+     ("unset (T_UNSET)" . T_UNSET)
+     ("isset (T_ISSET)" . T_ISSET)
+     ("empty (T_EMPTY)" . T_EMPTY)
+     ("__halt_compiler (T_HALT_COMPILER)" . T_HALT_COMPILER)
+     ("class (T_CLASS)" . T_CLASS)
+     ("trait (T_TRAIT)" . T_TRAIT)
+     ("interface (T_INTERFACE)" . T_INTERFACE)
+     ("extends (T_EXTENDS)" . T_EXTENDS)
+     ("implements (T_IMPLEMENTS)" . T_IMPLEMENTS)
+     ("-> (T_OBJECT_OPERATOR)" . T_OBJECT_OPERATOR)
+     ("=> (T_DOUBLE_ARROW)" . T_DOUBLE_ARROW)
+     ("list (T_LIST)" . T_LIST)
+     ("array (T_ARRAY)" . T_ARRAY)
+     ("callable (T_CALLABLE)" . T_CALLABLE)
+     ("__LINE__ (T_LINE)" . T_LINE)
+     ("__FILE__ (T_FILE)" . T_FILE)
+     ("__DIR__ (T_DIR)" . T_DIR)
+     ("__CLASS__ (T_CLASS_C)" . T_CLASS_C)
+     ("__TRAIT__ (T_TRAIT_C)" . T_TRAIT_C)
+     ("__METHOD__ (T_METHOD_C)" . T_METHOD_C)
+     ("__FUNCTION__ (T_FUNC_C)" . T_FUNC_C)
+     ("comment (T_COMMENT)" . T_COMMENT)
+     ("doc comment (T_DOC_COMMENT)" . T_DOC_COMMENT)
+     ("open tag (T_OPEN_TAG)" . T_OPEN_TAG)
+     ("open tag with echo (T_OPEN_TAG_WITH_ECHO)" . T_OPEN_TAG_WITH_ECHO)
+     ("close tag (T_CLOSE_TAG)" . T_CLOSE_TAG)
+     ("whitespace (T_WHITESPACE)" . T_WHITESPACE)
+     ("heredoc start (T_START_HEREDOC)" . T_START_HEREDOC)
+     ("heredoc end (T_END_HEREDOC)" . T_END_HEREDOC)
+     ("${ (T_DOLLAR_OPEN_CURLY_BRACES)" . T_DOLLAR_OPEN_CURLY_BRACES)
+     ("{$ (T_CURLY_OPEN)" . T_CURLY_OPEN)
+     (":: (T_PAAMAYIM_NEKUDOTAYIM)" . T_PAAMAYIM_NEKUDOTAYIM)
+     ("namespace (T_NAMESPACE)" . T_NAMESPACE)
+     ("__NAMESPACE__ (T_NS_C)" . T_NS_C)
+     ("\\ (T_NS_SEPARATOR)" . T_NS_SEPARATOR)
+     ("... (T_ELLIPSIS)" . T_ELLIPSIS)
+     ("?? (T_COALESCE)" . T_COALESCE)
+     ("** (T_POW)" . T_POW)
+     ("**= (T_POW_EQUAL)" . T_POW_EQUAL)
+     ("invalid character (T_BAD_CHARACTER)" . T_BAD_CHARACTER))
+   'nil)
+  "Table of language keywords.")
+
+(defconst phps-mode--token-table
+  (semantic-lex-make-type-table
+   '(("<no-type>"
+      (T_ERROR)
+      (\0)
+      (END))
+     ("punctuation"
+      (UNARY . "~")
+      (SUBTRACTION . "-")
+      (SINGLE_QUOTE . "'")
+      (QUESTION_MARK . "?")
+      (POW . "^")
+      (OPEN_SQUARE_BRACKET . "[")
+      (OPEN_PARENTHESIS . "(")
+      (OPEN_CURLY_BRACKET . "{")
+      (NEGATION . "!")
+      (MULTIPLICATION . "*")
+      (MODULO . "%")
+      (LESSER_THAN . "<")
+      (GREATER_THAN . ">")
+      (DOT . ".")
+      (DIVISION . "/")
+      (DOUBLE_QUOTE . "\"")
+      (DOLLAR_SIGN . "$")
+      (COMMA . ",")
+      (COLON . ":")
+      (CLOSE_SQUARE_BRACKET . "]")
+      (CLOSE_PARENTHESIS . ")")
+      (CLOSE_CURLY_BRACKET . "]")
+      (BITWISE_OR . "|")
+      (BITWISE_AND . "&")
+      (BACKTICK . "`")
+      (AT . "@")
+      (ASSIGN . "=")
+      (ADDITION . "+"))
+     ("ast"
+      (T_NUM_STRING . "number (T_NUM_STRING)")
+      (T_STRING_VARNAME . "variable name (T_STRING_VARNAME)")
+      (T_CONSTANT_ENCAPSED_STRING . "quoted-string 
(T_CONSTANT_ENCAPSED_STRING)")
+      (T_ENCAPSED_AND_WHITESPACE . "quoted-string and whitespace 
(T_ENCAPSED_AND_WHITESPACE)")
+      (T_INLINE_HTML)
+      (T_VARIABLE . "variable (T_VARIABLE)")
+      (T_STRING . "identifier (T_STRING)")
+      (T_DNUMBER . "floating-point number (T_DNUMBER)")
+      (T_LNUMBER . "integer number (T_LNUMBER)")))
+   '(("num" class_modifiers class_modifier)
+     ("num" use_type backup_fn_flags)
+     ("num" :declared t)
+     ("num" returns_ref function)
+     ("num" fn is_reference)
+     ("num" is_variadic variable_modifiers)
+     ("num" :declared t)
+     ("ast" inline_function union_type)
+     ("ast" :declared t)
+     ("ast" array_pair non_empty_array_pair_list)
+     ("ast" array_pair_list possible_array_pair)
+     ("ast" :declared t)
+     ("ast" lexical_var_list encaps_list)
+     ("ast" :declared t)
+     ("ast" ctor_arguments alt_if_stmt_without_else)
+     ("ast" trait_adaptation_list lexical_vars)
+     ("ast" :declared t)
+     ("ast" class_const_list class_const_decl)
+     ("ast" class_name_list trait_adaptations)
+     ("ast" method_body non_empty_for_exprs)
+     ("ast" :declared t)
+     ("ast" non_empty_parameter_list argument_list)
+     ("ast" non_empty_argument_list property_list)
+     ("ast" :declared t)
+     ("ast" callable_expr callable_variable)
+     ("ast" static_member new_variable)
+     ("ast" :declared t)
+     ("ast" fully_dereferencable array_object_dereferencable)
+     ("ast" :declared t)
+     ("ast" variable_class_name dereferencable_scalar)
+     ("ast" constant class_constant)
+     ("ast" :declared t)
+     ("ast" absolute_trait_method_reference trait_method_reference)
+     ("ast" property echo_expr)
+     ("ast" :declared t)
+     ("ast" interface_declaration_statement interface_extends_list)
+     ("ast" :declared t)
+     ("ast" class_declaration_statement trait_declaration_statement)
+     ("ast" :declared t)
+     ("punctuation" :declared t)))
+  "Table of lexical tokens.")
+
+(defconst phps-mode--parse-table
+  (progn
+    (eval-when-compile
+      (require 'semantic/wisent/comp))
+    (wisent-compile-grammar
+     '((T_LNUMBER T_DNUMBER T_STRING T_VARIABLE T_INLINE_HTML 
T_ENCAPSED_AND_WHITESPACE T_CONSTANT_ENCAPSED_STRING T_STRING_VARNAME 
T_NUM_STRING ADDITION ASSIGN AT BACKTICK BITWISE_AND BITWISE_OR 
CLOSE_CURLY_BRACKET CLOSE_PARENTHESIS CLOSE_SQUARE_BRACKET COLON COMMA 
DOLLAR_SIGN DOUBLE_QUOTE DIVISION DOT GREATER_THAN LESSER_THAN MODULO 
MULTIPLICATION NEGATION OPEN_CURLY_BRACKET OPEN_PARENTHESIS OPEN_SQUARE_BRACKET 
POW QUESTION_MARK SINGLE_QUOTE SUBTRACTION UNARY END \0 T_INCLUDE T_INCLUDE 
[...]
+       ((left T_LOGICAL_OR)
+        (left T_LOGICAL_XOR)
+        (left T_LOGICAL_AND %precedence T_PRINT %precedence T_YIELD 
%precedence T_DOUBLE_ARROW %precedence T_YIELD_FROM %precedence 61 T_PLUS_EQUAL 
T_MINUS_EQUAL T_MUL_EQUAL T_DIV_EQUAL T_CONCAT_EQUAL T_MOD_EQUAL T_AND_EQUAL 
T_OR_EQUAL T_XOR_EQUAL T_SL_EQUAL T_SR_EQUAL T_POW_EQUAL T_COALESCE_EQUAL)
+        (left 63 58)
+        (right T_COALESCE)
+        (left T_BOOLEAN_OR)
+        (left T_BOOLEAN_AND)
+        (left 124)
+        (left 94)
+        (left 38)
+        (nonassoc T_IS_EQUAL T_IS_NOT_EQUAL T_IS_IDENTICAL T_IS_NOT_IDENTICAL 
T_SPACESHIP)
+        (nonassoc 60 T_IS_SMALLER_OR_EQUAL 62 T_IS_GREATER_OR_EQUAL)
+        (left 46)
+        (left T_SL T_SR)
+        (left 43 45)
+        (left 42 47 37 %precedence 33 %precedence T_INSTANCEOF %precedence 126 
T_INT_CAST T_DOUBLE_CAST T_STRING_CAST T_ARRAY_CAST T_OBJECT_CAST T_BOOL_CAST 
T_UNSET_CAST 64)
+        (right T_POW %precedence T_CLONE %precedence T_NOELSE %precedence 
T_ELSEIF %precedence T_ELSE))
+       (reserved_non_modifiers
+        ((T_INCLUDE))
+        ((T_INCLUDE_ONCE))
+        ((T_EVAL))
+        ((T_REQUIRE))
+        ((T_REQUIRE_ONCE))
+        ((T_LOGICAL_OR))
+        ((T_LOGICAL_XOR))
+        ((T_LOGICAL_AND))
+        ((T_INSTANCEOF))
+        ((T_NEW))
+        ((T_CLONE))
+        ((T_EXIT))
+        ((T_IF))
+        ((T_ELSEIF))
+        ((T_ELSE))
+        ((T_ENDIF))
+        ((T_ECHO))
+        ((T_DO))
+        ((T_WHILE))
+        ((T_ENDWHILE))
+        ((T_FOR))
+        ((T_ENDFOR))
+        ((T_FOREACH))
+        ((T_ENDFOREACH))
+        ((T_DECLARE))
+        ((T_ENDDECLARE))
+        ((T_AS))
+        ((T_TRY))
+        ((T_CATCH))
+        ((T_FINALLY))
+        ((T_THROW))
+        ((T_USE))
+        ((T_INSTEADOF))
+        ((T_GLOBAL))
+        ((T_VAR))
+        ((T_UNSET))
+        ((T_ISSET))
+        ((T_EMPTY))
+        ((T_CONTINUE))
+        ((T_GOTO))
+        ((T_FUNCTION))
+        ((T_CONST))
+        ((T_RETURN))
+        ((T_PRINT))
+        ((T_YIELD))
+        ((T_LIST))
+        ((T_SWITCH))
+        ((T_ENDSWITCH))
+        ((T_CASE))
+        ((T_DEFAULT))
+        ((T_BREAK))
+        ((T_ARRAY))
+        ((T_CALLABLE))
+        ((T_EXTENDS))
+        ((T_IMPLEMENTS))
+        ((T_NAMESPACE))
+        ((T_TRAIT))
+        ((T_INTERFACE))
+        ((T_CLASS))
+        ((T_CLASS_C))
+        ((T_TRAIT_C))
+        ((T_FUNC_C))
+        ((T_METHOD_C))
+        ((T_LINE))
+        ((T_FILE))
+        ((T_DIR))
+        ((T_NS_C))
+        ((T_FN)))
+       (semi_reserved
+        ((reserved_non_modifiers))
+        ((T_STATIC))
+        ((T_ABSTRACT))
+        ((T_FINAL))
+        ((T_PRIVATE))
+        ((T_PROTECTED))
+        ((T_PUBLIC)))
+       (identifier
+        ((T_STRING)
+         ($1))
+        ((semi_reserved)
+         (let
+             ((zv nil))
+           ((SYMBOL 22104 . 22108)
+            (COLON 22108 . 22109))
+           (wisent-raw-tag
+            (semantic-tag zv 'ZEND_AST_ZVAL :attr 0)))))
+       (namespace_name
+        ((T_STRING)
+         ($1))
+        ((namespace_name T_NS_SEPARATOR T_STRING)
+         (ZEND_AST_APPEND_STR $1 $3)))
+       (name
+        ((namespace_name)
+         (progn
+           (semantic-tag-put-attribute $1 'attr 
'phps-mode-parser--zend_name_not_fq)
+           $1))
+        ((T_NAMESPACE T_NS_SEPARATOR namespace_name)
+         (progn
+           (semantic-tag-put-attribute $3 'attr 
'phps-mode-parser--zend_name_relative)
+           $3))
+        ((T_NS_SEPARATOR namespace_name)
+         (progn
+           (semantic-tag-put-attribute $2 'attr 
'phps-mode-parser--zend_name_fq)
+           $2)))
+       (class_name
+        ((T_STATIC)
+         (let
+             ((zv nil))
+           (let
+               ((symbol
+                 '(ZSTR_KNOWN 'phps-mode-parser--zend_str_static)))
+             (funcall callback symbol))
+           (wisent-raw-tag
+            (semantic-tag zv 'phps-mode-parser--zend_name_not_fq))))
+        ((name)
+         ($1)))
+       (constant
+        ((name)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_const $1)))
+        ((T_LINE)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_magic_const 'ZEND_AST_EX 
:operator 'phps-mode-parser--t_line)))
+        ((T_FILE)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_magic_const 'ZEND_AST_EX 
:operator 'phps-mode-parser--t_file)))
+        ((T_DIR)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_magic_const 'ZEND_AST_EX 
:operator 'phps-mode-parser--t_dir)))
+        ((T_TRAIT_C)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_magic_const 'ZEND_AST_EX 
:operator 'phps-mode-parser--t_trait_c)))
+        ((T_METHOD_C)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_magic_const 'ZEND_AST_EX 
:operator 'phps-mode-parser--t_method_c)))
+        ((T_FUNC_C)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_magic_const 'ZEND_AST_EX 
:operator 'phps-mode-parser--t_func_c)))
+        ((T_NS_C)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_magic_const 'ZEND_AST_EX 
:operator 'phps-mode-parser--t_ns_c)))
+        ((T_CLASS_C)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_magic_const 'ZEND_AST_EX 
:operator 'phps-mode-parser--t_class_c))))
+       (class_constant
+        ((class_name T_PAAMAYIM_NEKUDOTAYIM identifier)
+         (wisent-raw-tag
+          (semantic-tag $1 'ZEND_AST_CLASS_CONST_OR_NAME :member $3)))
+        ((variable_class_name T_PAAMAYIM_NEKUDOTAYIM identifier)
+         (wisent-raw-tag
+          (semantic-tag $1 'ZEND_AST_CLASS_CONST_OR_NAME :member $3))))
+       (property_name
+        ((T_STRING)
+         ($1))
+        ((OPEN_CURLY_BRACKET expr CLOSE_CURLY_BRACKET)
+         ($2))
+        ((simple_variable)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_var $1))))
+       (argument_list
+        ((OPEN_PARENTHESIS CLOSE_PARENTHESIS)
+         (wisent-raw-tag
+          (semantic-tag "" 'phps-mode-parser--zend_ast_arg_list :elements 
@elements :size 0)))
+        ((OPEN_PARENTHESIS non_empty_argument_list possible_comma 
CLOSE_PARENTHESIS)
+         ($2)))
+       (possible_comma
+        (nil)
+        ((COMMA)))
+       (non_empty_argument_list
+        ((argument)
+         (wisent-raw-tag
+          (semantic-tag "" 'phps-mode-parser--zend_ast_arg_list :elements 
@elements :size 1)))
+        ((non_empty_argument_list COMMA argument)
+         (wisent-raw-tag
+          (semantic-tag $1 'ZEND_AST_LIST_ADD :new-element $3))))
+       (argument
+        ((expr)
+         ($1))
+        ((T_ELLIPSIS expr)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_unpack $2))))
+       (function_call
+        ((name argument_list)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_call $1 $2)))
+        ((class_name T_PAAMAYIM_NEKUDOTAYIM member_name argument_list)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_static_call $1 $3 $4)))
+        ((variable_class_name T_PAAMAYIM_NEKUDOTAYIM member_name argument_list)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_static_call $1 $3 $4)))
+        ((callable_expr argument_list)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_call $1 $2))))
+       (member_name
+        ((identifier)
+         ($1))
+        ((OPEN_CURLY_BRACKET expr CLOSE_CURLY_BRACKET)
+         ($2))
+        ((simple_variable)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_var $1))))
+       (array_pair_list
+        ((non_empty_array_pair_list)
+         (wisent-raw-tag
+          (semantic-tag $1 'ZEND_AST_LIST_RTRIM))))
+       (possible_array_pair
+        (nil
+         (nil))
+        ((array_pair)
+         ($1)))
+       (non_empty_array_pair_list
+        ((non_empty_array_pair_list COMMA possible_array_pair)
+         (wisent-raw-tag
+          (semantic-tag $1 'ZEND_AST_LIST_ADD :new-element $3)))
+        ((possible_array_pair)
+         (wisent-raw-tag
+          (semantic-tag "" 'phps-mode-parser--zend_ast_array :elements 
@elements :size 1))))
+       (array_pair
+        ((expr T_DOUBLE_ARROW expr)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_array_elem $3 $1)))
+        ((expr)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_array_elem $1 nil)))
+        ((expr T_DOUBLE_ARROW BITWISE_AND variable)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_array_elem 'ZEND_AST_EX 
:operator 1 :subject $4 :subject2 $1)))
+        ((BITWISE_AND variable)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_array_elem 'ZEND_AST_EX 
:operator 1 :subject $2)))
+        ((T_ELLIPSIS expr)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_unpack $2)))
+        ((expr T_DOUBLE_ARROW T_LIST OPEN_PARENTHESIS array_pair_list 
CLOSE_PARENTHESIS)
+         (progn
+           (semantic-tag-put-attribute $4 'attr 
'phps-mode-parser--zend_array_syntax_list)
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_ast_array_elem $5 $1))))
+        ((T_LIST OPEN_PARENTHESIS array_pair_list CLOSE_PARENTHESIS)
+         (progn
+           (semantic-tag-put-attribute $3 'attr 
'phps-mode-parser--zend_array_syntax_list)
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_ast_array_elem $3 nil)))))
+       (encaps_list
+        ((encaps_list encaps_var)
+         (wisent-raw-tag
+          (semantic-tag $1 'ZEND_AST_LIST_ADD :new-element $2)))
+        ((encaps_list T_ENCAPSED_AND_WHITESPACE)
+         (wisent-raw-tag
+          (semantic-tag $1 'ZEND_AST_LIST_ADD :new-element $2)))
+        ((encaps_var)
+         (wisent-raw-tag
+          (semantic-tag "" 'phps-mode-parser--zend_ast_encaps_list :elements 
@elements :size 1)))
+        ((T_ENCAPSED_AND_WHITESPACE encaps_var)
+         (wisent-raw-tag
+          (semantic-tag "" 'phps-mode-parser--zend_ast_encaps_list :elements 
@elements :size 2))))
+       (encaps_var
+        ((T_VARIABLE)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_var $1)))
+        ((T_VARIABLE OPEN_SQUARE_BRACKET encaps_var_offset 
CLOSE_SQUARE_BRACKET)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_dim
+                        (wisent-raw-tag
+                         (semantic-tag 'phps-mode-parser--zend_ast_var $1))
+                        $3)))
+        ((T_VARIABLE T_OBJECT_OPERATOR T_STRING)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_prop
+                        (wisent-raw-tag
+                         (semantic-tag 'phps-mode-parser--zend_ast_var $1))
+                        $3)))
+        ((T_DOLLAR_OPEN_CURLY_BRACES expr CLOSE_CURLY_BRACKET)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_var $2)))
+        ((T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME CLOSE_CURLY_BRACKET)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_var $2)))
+        ((T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME OPEN_SQUARE_BRACKET expr 
CLOSE_SQUARE_BRACKET CLOSE_CURLY_BRACKET)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_dim
+                        (wisent-raw-tag
+                         (semantic-tag 'phps-mode-parser--zend_ast_var $2))
+                        $4)))
+        ((T_CURLY_OPEN variable CLOSE_CURLY_BRACKET)
+         ($2)))
+       (encaps_var_offset
+        ((T_STRING)
+         ($1))
+        ((T_NUM_STRING)
+         ($1))
+        ((45 T_NUM_STRING)
+         (*
+          (string-to-number $2)
+          -1))
+        ((T_VARIABLE)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_var $1))))
+       (dereferencable_scalar
+        ((T_ARRAY OPEN_PARENTHESIS array_pair_list CLOSE_PARENTHESIS)
+         (progn
+           (semantic-tag-put-attribute $3 'attr 
'phps-mode-parser--zend_array_syntax_long)
+           $3))
+        ((OPEN_SQUARE_BRACKET array_pair_list CLOSE_SQUARE_BRACKET)
+         (progn
+           (semantic-tag-put-attribute $2 'attr 
'phps-mode-parser--zend_array_syntax_short)
+           $2))
+        ((T_CONSTANT_ENCAPSED_STRING)
+         ($1))
+        ((DOUBLE_QUOTE encaps_list DOUBLE_QUOTE)
+         ($2)))
+       (optional_expr
+        (nil
+         (nil))
+        ((expr)
+         ($1)))
+       (variable_class_name
+        ((fully_dereferencable)
+         ($1)))
+       (fully_dereferencable
+        ((variable)
+         ($1))
+        ((OPEN_PARENTHESIS expr CLOSE_PARENTHESIS)
+         ($2))
+        ((dereferencable_scalar)
+         ($1))
+        ((class_constant)
+         ($1)))
+       (array_object_dereferencable
+        ((fully_dereferencable)
+         ($1))
+        ((constant)
+         ($1)))
+       (callable_expr
+        ((callable_variable)
+         ($1))
+        ((OPEN_PARENTHESIS expr CLOSE_PARENTHESIS)
+         ($2))
+        ((dereferencable_scalar)
+         ($1)))
+       (callable_variable
+        ((simple_variable)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_var $1)))
+        ((array_object_dereferencable OPEN_SQUARE_BRACKET optional_expr 
CLOSE_SQUARE_BRACKET)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_dim $1 $3)))
+        ((array_object_dereferencable OPEN_CURLY_BRACKET expr 
CLOSE_CURLY_BRACKET)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_dim 'ZEND_AST_EX :operator 
'phps-mode-parser--zend_dim_alternative_syntax :subject $1 :subject2 $3)))
+        ((array_object_dereferencable T_OBJECT_OPERATOR property_name 
argument_list)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_method_call $1 $3 $4)))
+        ((function_call)
+         ($1)))
+       (variable
+        ((callable_variable)
+         ($1))
+        ((static_member)
+         ($1))
+        ((array_object_dereferencable T_OBJECT_OPERATOR property_name)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_prop $1 $2))))
+       (simple_variable
+        ((T_VARIABLE)
+         ($1))
+        ((DOLLAR_SIGN OPEN_CURLY_BRACKET expr CLOSE_CURLY_BRACKET)
+         ($3))
+        ((DOLLAR_SIGN simple_variable)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_var $2))))
+       (static_member
+        ((class_name T_PAAMAYIM_NEKUDOTAYIM simple_variable)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_static_prop $1 $3)))
+        ((variable_class_name T_PAAMAYIM_NEKUDOTAYIM simple_variable)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_static_prop $1 $3))))
+       (expr
+        ((variable)
+         ($1))
+        ((T_LIST OPEN_PARENTHESIS array_pair_list CLOSE_PARENTHESIS ASSIGN 
expr)
+         (progn
+           (semantic-tag-put-attribute $3 'attr 
phps-mode-parser--zend_array_syntax_list)
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_ast_assign $3 $6))
+           | OPEN_SQUARE_BRACKET array_pair_list CLOSE_SQUARE_BRACKET ASSIGN 
expr
+           (progn
+             (semantic-tag-put-attribute $2 'attr 
'phps-mode-parser--zend_array_syntax_short)
+             (wisent-raw-tag
+              (semantic-tag 'phps-mode-parser--zend_ast_assign $2 $5)))
+           | variable ASSIGN expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_ast_assign $1 $3))
+           | variable ASSIGN BITWISE_AND variable
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_ast_assign_ref $1 $4))
+           | T_CLONE expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_ast_clone $2))
+           | variable T_PLUS_EQUAL expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_add 'ZEND_AST_ASSIGN_OP 
:object $3 :subject $1))
+           | variable T_MINUS_EQUAL expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_sub 'ZEND_AST_ASSIGN_OP 
:object $3 :subject $1))
+           | variable T_MUL_EQUAL expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_mul 'ZEND_AST_ASSIGN_OP 
:object $3 :subject $1))
+           | variable T_POW_EQUAL expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_pow 'ZEND_AST_ASSIGN_OP 
:object $3 :subject $1))
+           | variable T_DIV_EQUAL expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_div 'ZEND_AST_ASSIGN_OP 
:object $3 :subject $1))
+           | variable T_CONCAT_EQUAL expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_concat 'ZEND_AST_ASSIGN_OP 
:object $3 :subject $1))
+           | variable T_MOD_EQUAL expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_mod 'ZEND_AST_ASSIGN_OP 
:object $3 :subject $1))
+           | variable T_AND_EQUAL expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_bw_and 'ZEND_AST_ASSIGN_OP 
:object $3 :subject $1))
+           | variable T_OR_EQUAL expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_bw_or 'ZEND_AST_ASSIGN_OP 
:object $3 :subject $1))
+           | variable T_XOR_EQUAL expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_bw_xor 'ZEND_AST_ASSIGN_OP 
:object $3 :subject $1))
+           | variable T_SL_EQUAL expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_sl 'ZEND_AST_ASSIGN_OP 
:object $3 :subject $1))
+           | variable T_SR_EQUAL expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_sr 'ZEND_AST_ASSIGN_OP 
:object $3 :subject $1))
+           | variable T_COALESCE_EQUAL expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_coalesce $1 $3))
+           | variable T_INC
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_post_inc $1))
+           | T_INC variable
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_pre_inc $2))
+           | variable T_DEC
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_post_dec $1))
+           | T_DEC variable
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_pre_inc $2))
+           | expr T_BOOLEAN_OR expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_ast_or $1 $3))
+           | expr T_BOOLEAN_AND expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_ast_and $1 $3))
+           | expr T_LOGICAL_OR expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_ast_or $1 $3))
+           | expr T_LOGICAL_AND expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_ast_and $1 $3))
+           | expr T_LOGICAL_XOR expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_bool_xor 'ZEND_AST_BINARY_OP 
:object $3 :subject $1))
+           | expr BITWISE_OR expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_bw_or 'ZEND_AST_BINARY_OP 
:object $3 :subject $1))
+           | expr BITWISE_AND expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_bw_and 'ZEND_AST_BINARY_OP 
:object $3 :subject $1))
+           | expr POW expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_bw_xor 'ZEND_AST_BINARY_OP 
:object $3 :subject $1))
+           | expr DOT expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_concat 'ZEND_AST_BINARY_OP 
:object $3 :subject $1))
+           | expr ADDITION expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_add 'ZEND_AST_BINARY_OP 
:object $3 :subject $1))
+           | expr SUBTRACTION expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_sub 'ZEND_AST_BINARY_OP 
:object $3 :subject $1))
+           | expr MULTIPLICATION expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_mul 'ZEND_AST_BINARY_OP 
:object $3 :subject $1))
+           | expr T_POW expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_pow 'ZEND_AST_BINARY_OP 
:object $3 :subject $1))
+           | expr DIVISION expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_div 'ZEND_AST_BINARY_OP 
:object $3 :subject $1))
+           | expr MODULO expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_mod 'ZEND_AST_BINARY_OP 
:object $3 :subject $1))
+           | expr T_SL expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_sl 'ZEND_AST_BINARY_OP 
:object $3 :subject $1))
+           | expr T_SR expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_sr 'ZEND_AST_BINARY_OP 
:object $3 :subject $1))
+           | ADDITION expr prec UNARY
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_ast_unary_plus $1 $2))
+           | SUBTRACTION expr prec UNARY
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_ast_unary_minus $1 $2))
+           | NEGATION expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_ast_unary_op 'ZEND_AST_EX 
:operator 'phps-mode-parser--zend_bool_not :subject $2))
+           | UNARY expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_ast_unary_op 'ZEND_AST_EX 
:operator 'phps-mode-parser--zend_bw_not :subject $2))
+           | expr T_IS_IDENTICAL expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_is_identical 
'ZEND_AST_BINARY_OP :object $3 :subject $1))
+           | expr T_IS_NOT_IDENTICAL expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_is_not_identical 
'ZEND_AST_BINARY_OP :object $3 :subject $1))
+           | expr T_IS_EQUAL expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_is_equal 'ZEND_AST_BINARY_OP 
:object $3 :subject $1))
+           | expr T_IS_NOT_EQUAL expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_is_not_equal 
'ZEND_AST_BINARY_OP :object $3 :subject $1))
+           | expr LESSER_THAN expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_is_smaller 
'ZEND_AST_BINARY_OP :object $3 :subject $1))
+           | expr T_IS_SMALLER_OR_EQUAL expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_is_smaller_or_equal 
'ZEND_AST_BINARY_OP :object $3 :subject $1))
+           | expr GREATER_THAN expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_is_greater 
'ZEND_AST_BINARY_OP :object $3 :subject $1))
+           | expr T_IS_GREATER_OR_EQUAL expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_is_greater_or_equal 
'ZEND_AST_BINARY_OP :object $3 :subject $1))
+           | expr T_SPACESHIP expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_spaceship 
'ZEND_AST_BINARY_OP :object $3 :subject $1))
+           | expr T_INSTANCEOF class_name_reference
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_instanceof $1 $3))
+           | OPEN_PARENTHESIS expr CLOSE_PARENTHESIS
+           (progn
+             (when
+                 (equal
+                  (semantic-tag-get-attribute $2 'kind)
+                  'phps-mode-parser--zend_ast_conditional)
+               (semantic-tag-put-attribute $2 'attr 
'phps-mode-parser--zend_parenthesized_conditional))
+             $2)
+           | new_expr
+           ($1)
+           | expr QUESTION_MARK expr COLON expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_ast_conditional $1 $3 $5))
+           | expr QUESTION_MARK COLON expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_ast_conditional $1 nil $4))
+           | expr T_COALESCE expr
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_ast_coalesce $1 $3))
+           | internal_functions_in_yacc
+           ($1)))
+        ((T_INT_CAST expr)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--is_long 'ZEND_AST_CAST :subject 
$2)))
+        ((T_DOUBLE_CAST expr)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--is_double 'ZEND_AST_CAST :subject 
$2)))
+        ((T_STRING_CAST expr)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--is_string 'ZEND_AST_CAST :subject 
$2)))
+        ((T_ARRAY_CAST expr)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--is_array 'ZEND_AST_CAST :subject 
$2)))
+        ((T_OBJECT_CAST expr)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--is_object 'ZEND_AST_CAST :subject 
$2)))
+        ((T_BOOL_CAST expr)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--is_bool 'ZEND_AST_CAST :subject 
$2)))
+        ((T_UNSET_CAST expr)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--is_unset 'ZEND_AST_CAST :subject 
$2)))
+        ((T_EXIT exit_expr)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_exit $2)))
+        ((AT expr)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_silence $2)))
+        ((scalar)
+         ($1))
+        ((BACKTICK backticks_expr BACKTICK)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_shell $2)))
+        ((T_PRINT expr)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_print $2)))
+        ((T_YIELD)
+         (progn
+           (phps-mode-parser-grammar-macro-CG 'phps-mode-parser--extra_fn_flags
+                                              (logior
+                                               
(phps-mode-parser-grammar-macro-CG 'phps-mode-parser--extra_fn_flags)
+                                               
'phps-mode-parser--zend_acc_generator))
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_ast_yield nil nil))))
+        ((T_YIELD expr)
+         (progn
+           (phps-mode-parser-grammar-macro-CG 'phps-mode-parser--extra_fn_flags
+                                              (logior
+                                               
(phps-mode-parser-grammar-macro-CG 'phps-mode-parser--extra_fn_flags)
+                                               
'phps-mode-parser--zend_acc_generator))
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_ast_yield $2 nil))))
+        ((T_YIELD expr T_DOUBLE_ARROW expr)
+         (progn
+           (phps-mode-parser-grammar-macro-CG 'phps-mode-parser--extra_fn_flags
+                                              (logior
+                                               
(phps-mode-parser-grammar-macro-CG 'phps-mode-parser--extra_fn_flags)
+                                               
'phps-mode-parser--zend_acc_generator))
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_ast_yield $4 $2))))
+        ((T_YIELD_FROM expr)
+         (progn
+           (phps-mode-parser-grammar-macro-CG 'phps-mode-parser--extra_fn_flags
+                                              (logior
+                                               
(phps-mode-parser-grammar-macro-CG 'phps-mode-parser--extra_fn_flags)
+                                               
'phps-mode-parser--zend_acc_generator))
+           (wisent-raw-tag
+            (semantic-tag 'phps-mode-parser--zend_ast_yield_from $2))))
+        ((T_THROW expr)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_throw $2)))
+        ((inline_function)
+         ($1))
+        ((T_STATIC inline_function)
+         (progn
+           (semantic-tag-put-attribute $2 'flags
+                                       (logior
+                                        (semantic-tag-get-attribute $2 'flags)
+                                        'phps-mode-parser--zend_acc_static))
+           $2)))
+       (isset_variable
+        ((expr)
+         (wisent-raw-tag
+          (semantic-tag 'phps-mode-parser--zend_ast_isset $1)))))
+     '(isset_variable)))
+  "Parser table.")
+
+(defun phps-mode--install-parser ()
+  "Setup the Semantic Parser."
+  (semantic-install-function-overrides
+   '((semantic-parse-stream . wisent-parse-stream)))
+  (setq semantic-parser-name "LALR"
+        semantic--parse-table phps-mode--parse-table
+        semantic-debug-parser-source "phps-mode-parser-grammar.wy"
+        semantic-flex-keywords-obarray phps-mode--keyword-table
+        semantic-lex-types-obarray phps-mode--token-table)
+  ;; Collect unmatched syntax lexical tokens
+  (add-hook 'wisent-discarding-token-functions
+            'wisent-collect-unmatched-syntax nil t))
+
+
+;;; Analyzers
+;;
+(define-lex-string-type-analyzer phps-mode--<punctuation>-string-analyzer
+  "string analyzer for <punctuation> tokens."
+  "\\(\\s.\\|\\s$\\|\\s'\\)+"
+  '((UNARY . "~")
+    (SUBTRACTION . "-")
+    (SINGLE_QUOTE . "'")
+    (QUESTION_MARK . "?")
+    (POW . "^")
+    (OPEN_SQUARE_BRACKET . "[")
+    (OPEN_PARENTHESIS . "(")
+    (OPEN_CURLY_BRACKET . "{")
+    (NEGATION . "!")
+    (MULTIPLICATION . "*")
+    (MODULO . "%")
+    (LESSER_THAN . "<")
+    (GREATER_THAN . ">")
+    (DOT . ".")
+    (DIVISION . "/")
+    (DOUBLE_QUOTE . "\"")
+    (DOLLAR_SIGN . "$")
+    (COMMA . ",")
+    (COLON . ":")
+    (CLOSE_SQUARE_BRACKET . "]")
+    (CLOSE_PARENTHESIS . ")")
+    (CLOSE_CURLY_BRACKET . "]")
+    (BITWISE_OR . "|")
+    (BITWISE_AND . "&")
+    (BACKTICK . "`")
+    (AT . "@")
+    (ASSIGN . "=")
+    (ADDITION . "+"))
+  'punctuation)
+
+
+;;; Epilogue
+;;
+
+
+(provide 'phps-mode-wy)
+
+;; Local Variables:
+;; version-control: never
+;; no-update-autoloads: t
+;; End:
+
+;;; phps-mode-wy.el ends here
diff --git a/phps-mode-wy.wy b/phps-mode-wy.wy
deleted file mode 100644
index 22fce56..0000000
--- a/phps-mode-wy.wy
+++ /dev/null
@@ -1,981 +0,0 @@
-;;; phps.wy -- Semantic LALR grammar for PHP
-
-;; Copyright (C) 2018-2019  Free Software Foundation, Inc.
-
-;; This file is not part of GNU Emacs.
-
-;; This program is free software; you can redistribute it and/or
-;; modify it under the terms of the GNU General Public License as
-;; published by the Free Software Foundation; either version 2, or (at
-;; your option) any later version.
-
-;; This program is distributed in the hope that it will be useful, but
-;; WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-;; General Public License for more details.
-
-;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
-
-
-;;; Commentary:
-
-;; Run `(wisent-make-parsers)' or "C-c C-c" to generate grammar-file in Emacs 
Lisp.
-;;
-;; Based on the Zend PHP Parser YACC 
https://github.com/php/php-src/blob/master/Zend/zend_language_parser.y
-
-;; Create macros for all macros uses in original YACC, base macro structure on 
semantic-php-wy-macro.el
-
-;; Don't edit phps.wy because it's generated by phps-automation.el and 
phps-automation-header.wy
-
-
-;;; Code:
-
-%package phps-mode
-%provide phps-mode-wy
-
-%languagemode phps-mode
-
-%use-macros phps-mode-wy-macros {
-             zend_add_class_modifier
-             zend_add_member_modifier
-             zend_ast_create
-             zend_ast_create_assign_op
-             zend_ast_create_binary_op
-             zend_ast_create_cast
-             zend_ast_create_decl
-             zend_ast_create_ex
-             zend_ast_create_list
-             zend_ast_create_zval_from_str
-             zend_ast_get_str
-             zend_ast_list_add
-             zend_ast_list_rtrim
-             zend_handle_encoding_declaration
-             zend_negate_num_string
-}
-
-
-;; NOTE Generated grammar starts here
-
-
-start:
-    top_statement_list ((CG ast $1))
-    ;
-
-reserved_non_modifiers:
-    T_INCLUDE
-    | T_INCLUDE_ONCE
-    | T_EVAL
-    | T_REQUIRE
-    | T_REQUIRE_ONCE
-    | T_LOGICAL_OR
-    | T_LOGICAL_XOR
-    | T_LOGICAL_AND
-    | T_INSTANCEOF
-    | T_NEW
-    | T_CLONE
-    | T_EXIT
-    | T_IF
-    | T_ELSEIF
-    | T_ELSE
-    | T_ENDIF
-    | T_ECHO
-    | T_DO
-    | T_WHILE
-    | T_ENDWHILE
-    | T_FOR
-    | T_ENDFOR
-    | T_FOREACH
-    | T_ENDFOREACH
-    | T_DECLARE
-    | T_ENDDECLARE
-    | T_AS
-    | T_TRY
-    | T_CATCH
-    | T_FINALLY
-    | T_THROW
-    | T_USE
-    | T_INSTEADOF
-    | T_GLOBAL
-    | T_VAR
-    | T_UNSET
-    | T_ISSET
-    | T_EMPTY
-    | T_CONTINUE
-    | T_GOTO
-    | T_FUNCTION
-    | T_CONST
-    | T_RETURN
-    | T_PRINT
-    | T_YIELD
-    | T_LIST
-    | T_SWITCH
-    | T_ENDSWITCH
-    | T_CASE
-    | T_DEFAULT
-    | T_BREAK
-    | T_ARRAY
-    | T_CALLABLE
-    | T_EXTENDS
-    | T_IMPLEMENTS
-    | T_NAMESPACE
-    | T_TRAIT
-    | T_INTERFACE
-    | T_CLASS
-    | T_CLASS_C
-    | T_TRAIT_C
-    | T_FUNC_C
-    | T_METHOD_C
-    | T_LINE
-    | T_FILE
-    | T_DIR
-    | T_NS_C
-    | T_FN
-    ;
-
-semi_reserved:
-    reserved_non_modifiers
-    | T_STATIC
-    | T_ABSTRACT
-    | T_FINAL
-    | T_PRIVATE
-    | T_PROTECTED
-    | T_PUBLIC
-    ;
-
-identifier:
-    T_STRING ($1)
-    | semi_reserved (zval zv (zend_lex_tstring &zv) (zend_ast_create_zval &zv))
-    ;
-
-top_statement_list:
-    top_statement_list top_statement ((zend_ast_list_add $1 $2))
-    | ;; empty
-    ((zend_ast_create_list 0 ZEND_AST_STMT_LIST))
-    ;
-
-namespace_name:
-    T_STRING ($1)
-    | namespace_name T_NS_SEPARATOR T_STRING ((zend_ast_append_str $1 $3))
-    ;
-
-name:
-    namespace_name ($1 (put $$ 'attr 'ZEND_NAME_NOT_FQ))
-    | T_NAMESPACE T_NS_SEPARATOR namespace_name ($3 (put $$ 'attr 
'ZEND_NAME_RELATIVE))
-    | T_NS_SEPARATOR namespace_name ($2 (put $$ 'attr 'ZEND_NAME_FQ))
-    ;
-
-top_statement:
-    statement ($1)
-    | function_declaration_statement ($1)
-    | class_declaration_statement ($1)
-    | trait_declaration_statement ($1)
-    | interface_declaration_statement ($1)
-    | T_HALT_COMPILER '(' ')' ';' ((zend_ast_create ZEND_AST_HALT_COMPILER 
(zend_ast_create_zval_from_long (zend_get_scanned_file_offset))) 
(zend_stop_lexing))
-    | T_NAMESPACE namespace_name ';' ((zend_ast_create ZEND_AST_NAMESPACE $2 
nil (RESET_DOC_COMMENT))
-    | T_NAMESPACE namespace_name ((RESET_DOC_COMMENT)) '{' top_statement_list 
'}' ((zend_ast_create ZEND_AST_NAMESPACE $2 $5))
-    | T_NAMESPACE ((RESET_DOC_COMMENT)) '{' top_statement_list '}' 
((zend_ast_create ZEND_AST_NAMESPACE nil$4))
-    | T_USE mixed_group_use_declaration ';' ($2)
-    | T_USE use_type group_use_declaration ';' ($3 (put $$ 'attr '$2))
-    | T_USE use_declarations ';' ($2 (put $$ 'attr 'ZEND_SYMBOL_CLASS))
-    | T_USE use_type use_declarations ';' ($3 (put $$ 'attr '$2))
-    | T_CONST const_list ';' ($2)
-    ;
-
-use_type:
-    T_FUNCTION ($$ = ZEND_SYMBOL_FUNCTION)
-    | T_CONST ($$ = ZEND_SYMBOL_CONST)
-    ;
-
-group_use_declaration:
-    namespace_name T_NS_SEPARATOR '{' unprefixed_use_declarations 
possible_comma '}' ((zend_ast_create ZEND_AST_GROUP_USE $1 $4))
-    | T_NS_SEPARATOR namespace_name T_NS_SEPARATOR '{' 
unprefixed_use_declarations possible_comma '}' ((zend_ast_create 
ZEND_AST_GROUP_USE $2 $5))
-    ;
-
-mixed_group_use_declaration:
-    namespace_name T_NS_SEPARATOR '{' inline_use_declarations possible_comma 
'}' ((zend_ast_create ZEND_AST_GROUP_USE $1 $4))
-    | T_NS_SEPARATOR namespace_name T_NS_SEPARATOR '{' inline_use_declarations 
possible_comma '}' ((zend_ast_create ZEND_AST_GROUP_USE $2 $5))
-    ;
-
-possible_comma:
-    ;; empty
-    | ','
-    ;
-
-inline_use_declarations:
-    inline_use_declarations ',' inline_use_declaration ((zend_ast_list_add $1 
$3))
-    | inline_use_declaration ((zend_ast_create_list 1 ZEND_AST_USE $1))
-    ;
-
-unprefixed_use_declarations:
-    unprefixed_use_declarations ',' unprefixed_use_declaration 
((zend_ast_list_add $1 $3))
-    | unprefixed_use_declaration ((zend_ast_create_list 1 ZEND_AST_USE $1))
-    ;
-
-use_declarations:
-    use_declarations ',' use_declaration ((zend_ast_list_add $1 $3))
-    | use_declaration ((zend_ast_create_list 1 ZEND_AST_USE $1))
-    ;
-
-inline_use_declaration:
-    unprefixed_use_declaration ($1 (put $$ 'attr 'ZEND_SYMBOL_CLASS))
-    | use_type unprefixed_use_declaration ($2 (put $$ 'attr '$1))
-    ;
-
-unprefixed_use_declaration:
-    namespace_name ((zend_ast_create ZEND_AST_USE_ELEM $1 nil)
-    | namespace_name T_AS T_STRING ((zend_ast_create ZEND_AST_USE_ELEM $1 $3))
-    ;
-
-use_declaration:
-    unprefixed_use_declaration ($1)
-    | T_NS_SEPARATOR unprefixed_use_declaration ($2)
-    ;
-
-const_list:
-    const_list ',' const_decl ((zend_ast_list_add $1 $3))
-    | const_decl ((zend_ast_create_list 1 ZEND_AST_CONST_DECL $1))
-    ;
-
-inner_statement_list:
-    inner_statement_list inner_statement ((zend_ast_list_add $1 $2))
-    | ;; empty
-    ((zend_ast_create_list 0 ZEND_AST_STMT_LIST))
-    ;
-
-inner_statement:
-    statement ($1)
-    | function_declaration_statement ($1)
-    | class_declaration_statement ($1)
-    | trait_declaration_statement ($1)
-    | interface_declaration_statement ($1)
-    | T_HALT_COMPILER '(' ')' ';' ($$ = nil(zend_throw_exception 
zend_ce_compile_error "(__HALT_COMPILER) can only be used from the outermost 
scope" 0) YYERROR)
-    ;
-
-statement:
-    '{' inner_statement_list '}' ($2)
-    | if_stmt ($1)
-    | alt_if_stmt ($1)
-    | T_WHILE '(' expr ')' while_statement ((zend_ast_create ZEND_AST_WHILE $3 
$5))
-    | T_DO statement T_WHILE '(' expr ')' ';' ((zend_ast_create 
ZEND_AST_DO_WHILE $2 $5))
-    | T_FOR '(' for_exprs ';' for_exprs ';' for_exprs ')' for_statement 
((zend_ast_create ZEND_AST_FOR $3 $5 $7 $9))
-    | T_SWITCH '(' expr ')' switch_case_list ((zend_ast_create ZEND_AST_SWITCH 
$3 $5))
-    | T_BREAK optional_expr ';' ((zend_ast_create ZEND_AST_BREAK $2))
-    | T_CONTINUE optional_expr ';' ((zend_ast_create ZEND_AST_CONTINUE $2))
-    | T_RETURN optional_expr ';' ((zend_ast_create ZEND_AST_RETURN $2))
-    | T_GLOBAL global_var_list ';' ($2)
-    | T_STATIC static_var_list ';' ($2)
-    | T_ECHO echo_expr_list ';' ($2)
-    | T_INLINE_HTML ((zend_ast_create ZEND_AST_ECHO $1))
-    | expr ';' ($1)
-    | T_UNSET '(' unset_variables possible_comma ')' ';' ($3)
-    | T_FOREACH '(' expr T_AS foreach_variable ')' foreach_statement 
((zend_ast_create ZEND_AST_FOREACH $3 $5 nil$7))
-    | T_FOREACH '(' expr T_AS foreach_variable T_DOUBLE_ARROW foreach_variable 
')' foreach_statement ((zend_ast_create ZEND_AST_FOREACH $3 $7 $5 $9))
-    | T_DECLARE '(' const_list ')' ( (if 
(!zend_handle_encoding_declaration($3))YYERROR)) declare_statement 
((zend_ast_create ZEND_AST_DECLARE $3 $6))
-    | ';' ;; empty statement
-    ($$ = NULL)
-    | T_TRY '{' inner_statement_list '}' catch_list finally_statement 
((zend_ast_create ZEND_AST_TRY $3 $5 $6))
-    | T_THROW expr ';' ((zend_ast_create ZEND_AST_THROW $2))
-    | T_GOTO T_STRING ';' ((zend_ast_create ZEND_AST_GOTO $2))
-    | T_STRING ':' ((zend_ast_create ZEND_AST_LABEL $1))
-    ;
-
-catch_list:
-    ;; empty
-    ((zend_ast_create_list 0 ZEND_AST_CATCH_LIST))
-    | catch_list T_CATCH '(' catch_name_list T_VARIABLE ')' '{' 
inner_statement_list '}' ((zend_ast_list_add $1 (zend_ast_create ZEND_AST_CATCH 
$4 $5 $8)))
-    ;
-
-catch_name_list:
-    name ((zend_ast_create_list 1 ZEND_AST_NAME_LIST $1))
-    | catch_name_list '|' name ((zend_ast_list_add $1 $3))
-    ;
-
-finally_statement:
-    ;; empty
-    ($$ = NULL)
-    | T_FINALLY '{' inner_statement_list '}' ($3)
-    ;
-
-unset_variables:
-    unset_variable ((zend_ast_create_list 1 ZEND_AST_STMT_LIST $1))
-    | unset_variables ',' unset_variable ((zend_ast_list_add $1 $3))
-    ;
-
-unset_variable:
-    variable ((zend_ast_create ZEND_AST_UNSET $1))
-    ;
-
-function_declaration_statement:
-    function returns_ref T_STRING backup_doc_comment '(' parameter_list ')' 
return_type backup_fn_flags '{' inner_statement_list '}' backup_fn_flags 
((zend_ast_create_decl ZEND_AST_FUNC_DECL (logior $2 $13) $1 $4 
(zend_ast_get_str $3) $6 nil$11 $8) (CG extra_fn_flags) = $9)
-    ;
-
-is_reference:
-    ;; empty
-    ($$ = 0)
-    | '&' ($$ = ZEND_PARAM_REF)
-    ;
-
-is_variadic:
-    ;; empty
-    ($$ = 0)
-    | T_ELLIPSIS ($$ = ZEND_PARAM_VARIADIC)
-    ;
-
-class_declaration_statement:
-    class_modifiers T_CLASS ($<num>$ = (CG zend_lineno)) T_STRING extends_from 
implements_list backup_doc_comment '{' class_statement_list '}' 
((zend_ast_create_decl ZEND_AST_CLASS $1 $<num>3 $7 (zend_ast_get_str $4) $5 $6 
$9 nil)
-    | T_CLASS ($<num>$ = (CG zend_lineno)) T_STRING extends_from 
implements_list backup_doc_comment '{' class_statement_list '}' 
((zend_ast_create_decl ZEND_AST_CLASS 0 $<num>2 $6 (zend_ast_get_str $3) $4 $5 
$8 nil)
-    ;
-
-class_modifiers:
-    class_modifier ($1)
-    | class_modifiers class_modifier ( ($$ = zend_add_class_modifier($1, $2); 
if (!$$)YYERROR))
-    ;
-
-class_modifier:
-    T_ABSTRACT ($$ = ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)
-    | T_FINAL ($$ = ZEND_ACC_FINAL)
-    ;
-
-trait_declaration_statement:
-    T_TRAIT ($<num>$ = (CG zend_lineno)) T_STRING backup_doc_comment '{' 
class_statement_list '}' ((zend_ast_create_decl ZEND_AST_CLASS ZEND_ACC_TRAIT 
$<num>2 $4 (zend_ast_get_str $3) nilnil$6 nil)
-    ;
-
-interface_declaration_statement:
-    T_INTERFACE ($<num>$ = (CG zend_lineno)) T_STRING interface_extends_list 
backup_doc_comment '{' class_statement_list '}' ((zend_ast_create_decl 
ZEND_AST_CLASS ZEND_ACC_INTERFACE $<num>2 $5 (zend_ast_get_str $3) nil$4 $7 nil)
-    ;
-
-extends_from:
-    ;; empty
-    ($$ = NULL)
-    | T_EXTENDS name ($2)
-    ;
-
-interface_extends_list:
-    ;; empty
-    ($$ = NULL)
-    | T_EXTENDS name_list ($2)
-    ;
-
-implements_list:
-    ;; empty
-    ($$ = NULL)
-    | T_IMPLEMENTS name_list ($2)
-    ;
-
-foreach_variable:
-    variable ($1)
-    | '&' variable ((zend_ast_create ZEND_AST_REF $2))
-    | T_LIST '(' array_pair_list ')' ($3 (put $$ 'attr 
'ZEND_ARRAY_SYNTAX_LIST))
-    | '[' array_pair_list ']' ($2 (put $$ 'attr 'ZEND_ARRAY_SYNTAX_SHORT))
-    ;
-
-for_statement:
-    statement ($1)
-    | ':' inner_statement_list T_ENDFOR ';' ($2)
-    ;
-
-foreach_statement:
-    statement ($1)
-    | ':' inner_statement_list T_ENDFOREACH ';' ($2)
-    ;
-
-declare_statement:
-    statement ($1)
-    | ':' inner_statement_list T_ENDDECLARE ';' ($2)
-    ;
-
-switch_case_list:
-    '{' case_list '}' ($2)
-    | '{' ';' case_list '}' ($3)
-    | ':' case_list T_ENDSWITCH ';' ($2)
-    | ':' ';' case_list T_ENDSWITCH ';' ($3)
-    ;
-
-case_list:
-    ;; empty
-    ((zend_ast_create_list 0 ZEND_AST_SWITCH_LIST))
-    | case_list T_CASE expr case_separator inner_statement_list 
((zend_ast_list_add $1 (zend_ast_create ZEND_AST_SWITCH_CASE $3 $5)))
-    | case_list T_DEFAULT case_separator inner_statement_list 
((zend_ast_list_add $1 (zend_ast_create ZEND_AST_SWITCH_CASE nil$4)))
-    ;
-
-case_separator:
-    ':'
-    | ';'
-    ;
-
-while_statement:
-    statement ($1)
-    | ':' inner_statement_list T_ENDWHILE ';' ($2)
-    ;
-
-if_stmt_without_else:
-    T_IF '(' expr ')' statement ((zend_ast_create_list 1 ZEND_AST_IF 
(zend_ast_create ZEND_AST_IF_ELEM $3 $5)))
-    | if_stmt_without_else T_ELSEIF '(' expr ')' statement ((zend_ast_list_add 
$1 (zend_ast_create ZEND_AST_IF_ELEM $4 $6)))
-    ;
-
-if_stmt:
-    if_stmt_without_else prec T_NOELSE ($1)
-    | if_stmt_without_else T_ELSE statement ((zend_ast_list_add $1 
(zend_ast_create ZEND_AST_IF_ELEM nil$3)))
-    ;
-
-alt_if_stmt_without_else:
-    T_IF '(' expr ')' ':' inner_statement_list ((zend_ast_create_list 1 
ZEND_AST_IF (zend_ast_create ZEND_AST_IF_ELEM $3 $6)))
-    | alt_if_stmt_without_else T_ELSEIF '(' expr ')' ':' inner_statement_list 
((zend_ast_list_add $1 (zend_ast_create ZEND_AST_IF_ELEM $4 $7)))
-    ;
-
-alt_if_stmt:
-    alt_if_stmt_without_else T_ENDIF ';' ($1)
-    | alt_if_stmt_without_else T_ELSE ':' inner_statement_list T_ENDIF ';' 
((zend_ast_list_add $1 (zend_ast_create ZEND_AST_IF_ELEM nil$4)))
-    ;
-
-parameter_list:
-    non_empty_parameter_list ($1)
-    | ;; empty
-    ((zend_ast_create_list 0 ZEND_AST_PARAM_LIST))
-    ;
-
-non_empty_parameter_list:
-    parameter ((zend_ast_create_list 1 ZEND_AST_PARAM_LIST $1))
-    | non_empty_parameter_list ',' parameter ((zend_ast_list_add $1 $3))
-    ;
-
-parameter:
-    optional_type is_reference is_variadic T_VARIABLE ((zend_ast_create_ex 
ZEND_AST_PARAM (logior $2 $3) $1 $4 nil)
-    | optional_type is_reference is_variadic T_VARIABLE '=' expr 
((zend_ast_create_ex ZEND_AST_PARAM (logior $2 $3) $1 $4 $6))
-    ;
-
-optional_type:
-    ;; empty
-    ($$ = NULL)
-    | type_expr ($1)
-    ;
-
-type_expr:
-    type ($1)
-    | '?' type ($2 $$->attr |= ZEND_TYPE_NULLABLE)
-    ;
-
-type:
-    T_ARRAY ((zend_ast_create_ex ZEND_AST_TYPE IS_ARRAY))
-    | T_CALLABLE ((zend_ast_create_ex ZEND_AST_TYPE IS_CALLABLE))
-    | name ($1)
-    ;
-
-return_type:
-    ;; empty
-    ($$ = NULL)
-    | ':' type_expr ($2)
-    ;
-
-argument_list:
-    '(' ')' ((zend_ast_create_list 0 ZEND_AST_ARG_LIST))
-    | '(' non_empty_argument_list possible_comma ')' ($2)
-    ;
-
-non_empty_argument_list:
-    argument ((zend_ast_create_list 1 ZEND_AST_ARG_LIST $1))
-    | non_empty_argument_list ',' argument ((zend_ast_list_add $1 $3))
-    ;
-
-argument:
-    expr ($1)
-    | T_ELLIPSIS expr ((zend_ast_create ZEND_AST_UNPACK $2))
-    ;
-
-global_var_list:
-    global_var_list ',' global_var ((zend_ast_list_add $1 $3))
-    | global_var ((zend_ast_create_list 1 ZEND_AST_STMT_LIST $1))
-    ;
-
-global_var:
-    simple_variable ((zend_ast_create ZEND_AST_GLOBAL (zend_ast_create 
ZEND_AST_VAR $1)))
-    ;
-
-static_var_list:
-    static_var_list ',' static_var ((zend_ast_list_add $1 $3))
-    | static_var ((zend_ast_create_list 1 ZEND_AST_STMT_LIST $1))
-    ;
-
-static_var:
-    T_VARIABLE ((zend_ast_create ZEND_AST_STATIC $1 nil)
-    | T_VARIABLE '=' expr ((zend_ast_create ZEND_AST_STATIC $1 $3))
-    ;
-
-class_statement_list:
-    class_statement_list class_statement ((zend_ast_list_add $1 $2))
-    | ;; empty
-    ((zend_ast_create_list 0 ZEND_AST_STMT_LIST))
-    ;
-
-class_statement:
-    variable_modifiers optional_type property_list ';' ((zend_ast_create 
ZEND_AST_PROP_GROUP $2 $3) (put $$ 'attr '$1))
-    | method_modifiers T_CONST class_const_list ';' ($3 (put $$ 'attr '$1))
-    | T_USE name_list trait_adaptations ((zend_ast_create ZEND_AST_USE_TRAIT 
$2 $3))
-    | method_modifiers function returns_ref identifier backup_doc_comment '(' 
parameter_list ')' return_type backup_fn_flags method_body backup_fn_flags 
((zend_ast_create_decl ZEND_AST_METHOD (logior $3 $1) | $12 $2 $5 
(zend_ast_get_str $4) $7 nil$11 $9) (CG extra_fn_flags) = $10)
-    ;
-
-name_list:
-    name ((zend_ast_create_list 1 ZEND_AST_NAME_LIST $1))
-    | name_list ',' name ((zend_ast_list_add $1 $3))
-    ;
-
-trait_adaptations:
-    ';' ($$ = NULL)
-    | '{' '}' ($$ = NULL)
-    | '{' trait_adaptation_list '}' ($2)
-    ;
-
-trait_adaptation_list:
-    trait_adaptation ((zend_ast_create_list 1 ZEND_AST_TRAIT_ADAPTATIONS $1))
-    | trait_adaptation_list trait_adaptation ((zend_ast_list_add $1 $2))
-    ;
-
-trait_adaptation:
-    trait_precedence ';' ($1)
-    | trait_alias ';' ($1)
-    ;
-
-trait_precedence:
-    absolute_trait_method_reference T_INSTEADOF name_list ((zend_ast_create 
ZEND_AST_TRAIT_PRECEDENCE $1 $3))
-    ;
-
-trait_alias:
-    trait_method_reference T_AS T_STRING ((zend_ast_create 
ZEND_AST_TRAIT_ALIAS $1 $3))
-    | trait_method_reference T_AS reserved_non_modifiers (zval zv 
(zend_lex_tstring &zv) (zend_ast_create ZEND_AST_TRAIT_ALIAS $1 
(zend_ast_create_zval &zv)))
-    | trait_method_reference T_AS member_modifier identifier 
((zend_ast_create_ex ZEND_AST_TRAIT_ALIAS $3 $1 $4))
-    | trait_method_reference T_AS member_modifier ((zend_ast_create_ex 
ZEND_AST_TRAIT_ALIAS $3 $1 nil)
-    ;
-
-trait_method_reference:
-    identifier ((zend_ast_create ZEND_AST_METHOD_REFERENCE nil$1))
-    | absolute_trait_method_reference ($1)
-    ;
-
-absolute_trait_method_reference:
-    name T_PAAMAYIM_NEKUDOTAYIM identifier ((zend_ast_create 
ZEND_AST_METHOD_REFERENCE $1 $3))
-    ;
-
-method_body:
-    ';' ;; abstract method
-    ($$ = NULL)
-    | '{' inner_statement_list '}' ($2)
-    ;
-
-variable_modifiers:
-    non_empty_member_modifiers ($1)
-    | T_VAR ($$ = ZEND_ACC_PUBLIC)
-    ;
-
-method_modifiers:
-    ;; empty
-    ($$ = ZEND_ACC_PUBLIC)
-    | non_empty_member_modifiers ( ($$ = $1; if (!($$ & ZEND_ACC_PPP_MASK))$$ 
|= ZEND_ACC_PUBLIC))
-    ;
-
-non_empty_member_modifiers:
-    member_modifier ($1)
-    | non_empty_member_modifiers member_modifier ( ($$ = 
zend_add_member_modifier($1, $2); if (!$$)YYERROR))
-    ;
-
-member_modifier:
-    T_PUBLIC ($$ = ZEND_ACC_PUBLIC)
-    | T_PROTECTED ($$ = ZEND_ACC_PROTECTED)
-    | T_PRIVATE ($$ = ZEND_ACC_PRIVATE)
-    | T_STATIC ($$ = ZEND_ACC_STATIC)
-    | T_ABSTRACT ($$ = ZEND_ACC_ABSTRACT)
-    | T_FINAL ($$ = ZEND_ACC_FINAL)
-    ;
-
-property_list:
-    property_list ',' property ((zend_ast_list_add $1 $3))
-    | property ((zend_ast_create_list 1 ZEND_AST_PROP_DECL $1))
-    ;
-
-property:
-    T_VARIABLE backup_doc_comment ((zend_ast_create ZEND_AST_PROP_ELEM $1 
nil($2 ? (zend_ast_create_zval_from_str $2) : nil))
-    | T_VARIABLE '=' expr backup_doc_comment ((zend_ast_create 
ZEND_AST_PROP_ELEM $1 $3 ($4 ? (zend_ast_create_zval_from_str $4) : nil))
-    ;
-
-class_const_list:
-    class_const_list ',' class_const_decl ((zend_ast_list_add $1 $3))
-    | class_const_decl ((zend_ast_create_list 1 ZEND_AST_CLASS_CONST_DECL $1))
-    ;
-
-class_const_decl:
-    identifier '=' expr backup_doc_comment ((zend_ast_create 
ZEND_AST_CONST_ELEM $1 $3 ($4 ? (zend_ast_create_zval_from_str $4) : nil))
-    ;
-
-const_decl:
-    T_STRING '=' expr backup_doc_comment ((zend_ast_create ZEND_AST_CONST_ELEM 
$1 $3 ($4 ? (zend_ast_create_zval_from_str $4) : nil))
-    ;
-
-echo_expr_list:
-    echo_expr_list ',' echo_expr ((zend_ast_list_add $1 $3))
-    | echo_expr ((zend_ast_create_list 1 ZEND_AST_STMT_LIST $1))
-    ;
-
-echo_expr:
-    expr ((zend_ast_create ZEND_AST_ECHO $1))
-    ;
-
-for_exprs:
-    ;; empty
-    ($$ = NULL)
-    | non_empty_for_exprs ($1)
-    ;
-
-non_empty_for_exprs:
-    non_empty_for_exprs ',' expr ((zend_ast_list_add $1 $3))
-    | expr ((zend_ast_create_list 1 ZEND_AST_EXPR_LIST $1))
-    ;
-
-anonymous_class:
-    T_CLASS ($<num>$ = (CG zend_lineno)) ctor_arguments extends_from 
implements_list backup_doc_comment '{' class_statement_list '}' (zend_ast *decl 
= (zend_ast_create_decl  ZEND_AST_CLASS ZEND_ACC_ANON_CLASS $<num>2 $6 nil$4 $5 
$8 nil (zend_ast_create ZEND_AST_NEW decl $3))
-    ;
-
-new_expr:
-    T_NEW class_name_reference ctor_arguments ((zend_ast_create ZEND_AST_NEW 
$2 $3))
-    | T_NEW anonymous_class ($2)
-    ;
-
-expr:
-    variable ($1)
-    | T_LIST '(' array_pair_list ')' '=' expr ((put $3 'attr 
'ZEND_ARRAY_SYNTAX_LIST) (zend_ast_create ZEND_AST_ASSIGN $3 $6))
-    | '[' array_pair_list ']' '=' expr ((put $2 'attr 
'ZEND_ARRAY_SYNTAX_SHORT) (zend_ast_create ZEND_AST_ASSIGN $2 $5))
-    | variable '=' expr ((zend_ast_create ZEND_AST_ASSIGN $1 $3))
-    | variable '=' '&' variable ((zend_ast_create ZEND_AST_ASSIGN_REF $1 $4))
-    | T_CLONE expr ((zend_ast_create ZEND_AST_CLONE $2))
-    | variable T_PLUS_EQUAL expr ((zend_ast_create_assign_op ZEND_ADD $1 $3))
-    | variable T_MINUS_EQUAL expr ((zend_ast_create_assign_op ZEND_SUB $1 $3))
-    | variable T_MUL_EQUAL expr ((zend_ast_create_assign_op ZEND_MUL $1 $3))
-    | variable T_POW_EQUAL expr ((zend_ast_create_assign_op ZEND_POW $1 $3))
-    | variable T_DIV_EQUAL expr ((zend_ast_create_assign_op ZEND_DIV $1 $3))
-    | variable T_CONCAT_EQUAL expr ((zend_ast_create_assign_op ZEND_CONCAT $1 
$3))
-    | variable T_MOD_EQUAL expr ((zend_ast_create_assign_op ZEND_MOD $1 $3))
-    | variable T_AND_EQUAL expr ((zend_ast_create_assign_op ZEND_BW_AND $1 $3))
-    | variable T_OR_EQUAL expr ((zend_ast_create_assign_op ZEND_BW_OR $1 $3))
-    | variable T_XOR_EQUAL expr ((zend_ast_create_assign_op ZEND_BW_XOR $1 $3))
-    | variable T_SL_EQUAL expr ((zend_ast_create_assign_op ZEND_SL $1 $3))
-    | variable T_SR_EQUAL expr ((zend_ast_create_assign_op ZEND_SR $1 $3))
-    | variable T_COALESCE_EQUAL expr ((zend_ast_create 
ZEND_AST_ASSIGN_COALESCE $1 $3))
-    | variable T_INC ((zend_ast_create ZEND_AST_POST_INC $1))
-    | T_INC variable ((zend_ast_create ZEND_AST_PRE_INC $2))
-    | variable T_DEC ((zend_ast_create ZEND_AST_POST_DEC $1))
-    | T_DEC variable ((zend_ast_create ZEND_AST_PRE_DEC $2))
-    | expr T_BOOLEAN_OR expr ((zend_ast_create ZEND_AST_OR $1 $3))
-    | expr T_BOOLEAN_AND expr ((zend_ast_create ZEND_AST_AND $1 $3))
-    | expr T_LOGICAL_OR expr ((zend_ast_create ZEND_AST_OR $1 $3))
-    | expr T_LOGICAL_AND expr ((zend_ast_create ZEND_AST_AND $1 $3))
-    | expr T_LOGICAL_XOR expr ((zend_ast_create_binary_op ZEND_BOOL_XOR $1 $3))
-    | expr '|' expr ((zend_ast_create_binary_op ZEND_BW_OR $1 $3))
-    | expr '&' expr ((zend_ast_create_binary_op ZEND_BW_AND $1 $3))
-    | expr '^' expr ((zend_ast_create_binary_op ZEND_BW_XOR $1 $3))
-    | expr '.' expr ((zend_ast_create_binary_op ZEND_CONCAT $1 $3))
-    | expr '+' expr ((zend_ast_create_binary_op ZEND_ADD $1 $3))
-    | expr '-' expr ((zend_ast_create_binary_op ZEND_SUB $1 $3))
-    | expr '*' expr ((zend_ast_create_binary_op ZEND_MUL $1 $3))
-    | expr T_POW expr ((zend_ast_create_binary_op ZEND_POW $1 $3))
-    | expr '/' expr ((zend_ast_create_binary_op ZEND_DIV $1 $3))
-    | expr '%' expr ((zend_ast_create_binary_op ZEND_MOD $1 $3))
-    | expr T_SL expr ((zend_ast_create_binary_op ZEND_SL $1 $3))
-    | expr T_SR expr ((zend_ast_create_binary_op ZEND_SR $1 $3))
-    | '+' expr prec '~' ((zend_ast_create ZEND_AST_UNARY_PLUS $2))
-    | '-' expr prec '~' ((zend_ast_create ZEND_AST_UNARY_MINUS $2))
-    | '!' expr ((zend_ast_create_ex ZEND_AST_UNARY_OP ZEND_BOOL_NOT $2))
-    | '~' expr ((zend_ast_create_ex ZEND_AST_UNARY_OP ZEND_BW_NOT $2))
-    | expr T_IS_IDENTICAL expr ((zend_ast_create_binary_op ZEND_IS_IDENTICAL 
$1 $3))
-    | expr T_IS_NOT_IDENTICAL expr ((zend_ast_create_binary_op 
ZEND_IS_NOT_IDENTICAL $1 $3))
-    | expr T_IS_EQUAL expr ((zend_ast_create_binary_op ZEND_IS_EQUAL $1 $3))
-    | expr T_IS_NOT_EQUAL expr ((zend_ast_create_binary_op ZEND_IS_NOT_EQUAL 
$1 $3))
-    | expr '<' expr ((zend_ast_create_binary_op ZEND_IS_SMALLER $1 $3))
-    | expr T_IS_SMALLER_OR_EQUAL expr ((zend_ast_create_binary_op 
ZEND_IS_SMALLER_OR_EQUAL $1 $3))
-    | expr '>' expr ((zend_ast_create ZEND_AST_GREATER $1 $3))
-    | expr T_IS_GREATER_OR_EQUAL expr ((zend_ast_create ZEND_AST_GREATER_EQUAL 
$1 $3))
-    | expr T_SPACESHIP expr ((zend_ast_create_binary_op ZEND_SPACESHIP $1 $3))
-    | expr T_INSTANCEOF class_name_reference ((zend_ast_create 
ZEND_AST_INSTANCEOF $1 $3))
-    | '(' expr ')' ($2 if ((put $$ 'kind '= ZEND_AST_CONDITIONAL) $$->attr = 
ZEND_PARENTHESIZED_CONDITIONAL))
-    | new_expr ($1)
-    | expr '?' expr ':' expr ((zend_ast_create ZEND_AST_CONDITIONAL $1 $3 $5))
-    | expr '?' ':' expr ((zend_ast_create ZEND_AST_CONDITIONAL $1 nil$4))
-    | expr T_COALESCE expr ((zend_ast_create ZEND_AST_COALESCE $1 $3))
-    | internal_functions_in_yacc ($1)
-    | T_INT_CAST expr ((zend_ast_create_cast IS_LONG $2))
-    | T_DOUBLE_CAST expr ((zend_ast_create_cast IS_DOUBLE $2))
-    | T_STRING_CAST expr ((zend_ast_create_cast IS_STRING $2))
-    | T_ARRAY_CAST expr ((zend_ast_create_cast IS_ARRAY $2))
-    | T_OBJECT_CAST expr ((zend_ast_create_cast IS_OBJECT $2))
-    | T_BOOL_CAST expr ((zend_ast_create_cast _IS_BOOL $2))
-    | T_UNSET_CAST expr ((zend_ast_create_cast IS_nil$2))
-    | T_EXIT exit_expr ((zend_ast_create ZEND_AST_EXIT $2))
-    | '@' expr ((zend_ast_create ZEND_AST_SILENCE $2))
-    | scalar ($1)
-    | '`' backticks_expr '`' ((zend_ast_create ZEND_AST_SHELL_EXEC $2))
-    | T_PRINT expr ((zend_ast_create ZEND_AST_PRINT $2))
-    | T_YIELD ((zend_ast_create ZEND_AST_YIELD nilnil (CG extra_fn_flags) |= 
ZEND_ACC_GENERATOR)
-    | T_YIELD expr ((zend_ast_create ZEND_AST_YIELD $2 nil (CG extra_fn_flags) 
|= ZEND_ACC_GENERATOR)
-    | T_YIELD expr T_DOUBLE_ARROW expr ((zend_ast_create ZEND_AST_YIELD $4 $2) 
(CG extra_fn_flags) |= ZEND_ACC_GENERATOR)
-    | T_YIELD_FROM expr ((zend_ast_create ZEND_AST_YIELD_FROM $2) (CG 
extra_fn_flags) |= ZEND_ACC_GENERATOR)
-    | inline_function ($1)
-    | T_STATIC inline_function ($2 ((zend_ast_decl *) $$)->flags |= 
ZEND_ACC_STATIC)
-    ;
-
-inline_function:
-    function returns_ref backup_doc_comment '(' parameter_list ')' 
lexical_vars return_type backup_fn_flags '{' inner_statement_list '}' 
backup_fn_flags ( ($$ = zend_ast_create_decl(ZEND_AST_CLOSURE, $2 | $13, $1, $3,
-zend_string_init("closure) (", sizeof("closure)") - 1 0) $5 $7 $11 $8) (CG 
extra_fn_flags) = $9)
-    | fn returns_ref '(' parameter_list ')' return_type backup_doc_comment 
T_DOUBLE_ARROW backup_fn_flags backup_lex_pos expr backup_fn_flags ( ($$ = 
zend_ast_create_decl(ZEND_AST_ARROW_FUNC, $2 | $12, $1, $7,
-zend_string_init("closure) (", sizeof("closure)") - 1 0) $4 
nil(zend_ast_create ZEND_AST_RETURN $11) $6) ((zend_ast_decl *) $$)->lex_pos = 
$10 (CG extra_fn_flags) = $9)
-    ;
-
-fn:
-    T_FN ((CG zend_lineno))
-    ;
-
-function:
-    T_FUNCTION ((CG zend_lineno))
-    ;
-
-backup_doc_comment:
-    ;; empty
-    ((CG doc_comment) (CG doc_comment) = NULL)
-    ;
-
-backup_fn_flags:
-    prec PREC_ARROW_FUNCTION ;; empty
-    ((CG extra_fn_flags) (CG extra_fn_flags) = 0)
-    ;
-
-backup_lex_pos:
-    ;; empty
-    ((LANG_SCNG yy_text))
-    ;
-
-returns_ref:
-    ;; empty
-    ($$ = 0)
-    | '&' ($$ = ZEND_ACC_RETURN_REFERENCE)
-    ;
-
-lexical_vars:
-    ;; empty
-    ($$ = NULL)
-    | T_USE '(' lexical_var_list ')' ($3)
-    ;
-
-lexical_var_list:
-    lexical_var_list ',' lexical_var ((zend_ast_list_add $1 $3))
-    | lexical_var ((zend_ast_create_list 1 ZEND_AST_CLOSURE_USES $1))
-    ;
-
-lexical_var:
-    T_VARIABLE ($1)
-    | '&' T_VARIABLE ($2 (put $$ 'attr 'ZEND_BIND_REF))
-    ;
-
-function_call:
-    name argument_list ((zend_ast_create ZEND_AST_CALL $1 $2))
-    | class_name T_PAAMAYIM_NEKUDOTAYIM member_name argument_list 
((zend_ast_create ZEND_AST_STATIC_CALL $1 $3 $4))
-    | variable_class_name T_PAAMAYIM_NEKUDOTAYIM member_name argument_list 
((zend_ast_create ZEND_AST_STATIC_CALL $1 $3 $4))
-    | callable_expr argument_list ((zend_ast_create ZEND_AST_CALL $1 $2))
-    ;
-
-class_name:
-    T_STATIC (zval zv (ZVAL_INTERNED_STR &zv (ZSTR_KNOWN ZEND_STR_STATIC)) 
(zend_ast_create_zval_ex &zv ZEND_NAME_NOT_FQ))
-    | name ($1)
-    ;
-
-class_name_reference:
-    class_name ($1)
-    | new_variable ($1)
-    ;
-
-exit_expr:
-    ;; empty
-    ($$ = NULL)
-    | '(' optional_expr ')' ($2)
-    ;
-
-backticks_expr:
-    ;; empty
-    ((zend_ast_create_zval_from_str (ZSTR_EMPTY_ALLOC)))
-    | T_ENCAPSED_AND_WHITESPACE ($1)
-    | encaps_list ($1)
-    ;
-
-ctor_arguments:
-    ;; empty
-    ((zend_ast_create_list 0 ZEND_AST_ARG_LIST))
-    | argument_list ($1)
-    ;
-
-dereferencable_scalar:
-    T_ARRAY '(' array_pair_list ')' ($3 (put $$ 'attr 'ZEND_ARRAY_SYNTAX_LONG))
-    | '[' array_pair_list ']' ($2 (put $$ 'attr 'ZEND_ARRAY_SYNTAX_SHORT))
-    | T_CONSTANT_ENCAPSED_STRING ($1)
-    ;
-
-scalar:
-    T_LNUMBER ($1)
-    | T_DNUMBER ($1)
-    | T_LINE ((zend_ast_create_ex ZEND_AST_MAGIC_CONST T_LINE))
-    | T_FILE ((zend_ast_create_ex ZEND_AST_MAGIC_CONST T_FILE))
-    | T_DIR ((zend_ast_create_ex ZEND_AST_MAGIC_CONST T_DIR))
-    | T_TRAIT_C ((zend_ast_create_ex ZEND_AST_MAGIC_CONST T_TRAIT_C))
-    | T_METHOD_C ((zend_ast_create_ex ZEND_AST_MAGIC_CONST T_METHOD_C))
-    | T_FUNC_C ((zend_ast_create_ex ZEND_AST_MAGIC_CONST T_FUNC_C))
-    | T_NS_C ((zend_ast_create_ex ZEND_AST_MAGIC_CONST T_NS_C))
-    | T_CLASS_C ((zend_ast_create_ex ZEND_AST_MAGIC_CONST T_CLASS_C))
-    | T_START_HEREDOC T_ENCAPSED_AND_WHITESPACE T_END_HEREDOC ($2)
-    | T_START_HEREDOC T_END_HEREDOC ((zend_ast_create_zval_from_str 
(ZSTR_EMPTY_ALLOC)))
-    | '"' encaps_list '"' ($2)
-    | T_START_HEREDOC encaps_list T_END_HEREDOC ($2)
-    | dereferencable_scalar ($1)
-    | constant ($1)
-    ;
-
-constant:
-    name ((zend_ast_create ZEND_AST_CONST $1))
-    | class_name T_PAAMAYIM_NEKUDOTAYIM identifier 
((zend_ast_create_class_const_or_name $1 $3))
-    | variable_class_name T_PAAMAYIM_NEKUDOTAYIM identifier 
((zend_ast_create_class_const_or_name $1 $3))
-    ;
-
-optional_expr:
-    ;; empty
-    ($$ = NULL)
-    | expr ($1)
-    ;
-
-variable_class_name:
-    dereferencable ($1)
-    ;
-
-dereferencable:
-    variable ($1)
-    | '(' expr ')' ($2)
-    | dereferencable_scalar ($1)
-    ;
-
-callable_expr:
-    callable_variable ($1)
-    | '(' expr ')' ($2)
-    | dereferencable_scalar ($1)
-    ;
-
-callable_variable:
-    simple_variable ((zend_ast_create ZEND_AST_VAR $1))
-    | dereferencable '[' optional_expr ']' ((zend_ast_create ZEND_AST_DIM $1 
$3))
-    | constant '[' optional_expr ']' ((zend_ast_create ZEND_AST_DIM $1 $3))
-    | dereferencable '{' expr '}' ((zend_ast_create_ex ZEND_AST_DIM 
ZEND_DIM_ALTERNATIVE_SYNTAX $1 $3))
-    | dereferencable T_OBJECT_OPERATOR property_name argument_list 
((zend_ast_create ZEND_AST_METHOD_CALL $1 $3 $4))
-    | function_call ($1)
-    ;
-
-variable:
-    callable_variable ($1)
-    | static_member ($1)
-    | dereferencable T_OBJECT_OPERATOR property_name ((zend_ast_create 
ZEND_AST_PROP $1 $3))
-    ;
-
-simple_variable:
-    T_VARIABLE ($1)
-    | '$' '{' expr '}' ($3)
-    | '$' simple_variable ((zend_ast_create ZEND_AST_VAR $2))
-    ;
-
-static_member:
-    class_name T_PAAMAYIM_NEKUDOTAYIM simple_variable ((zend_ast_create 
ZEND_AST_STATIC_PROP $1 $3))
-    | variable_class_name T_PAAMAYIM_NEKUDOTAYIM simple_variable 
((zend_ast_create ZEND_AST_STATIC_PROP $1 $3))
-    ;
-
-new_variable:
-    simple_variable ((zend_ast_create ZEND_AST_VAR $1))
-    | new_variable '[' optional_expr ']' ((zend_ast_create ZEND_AST_DIM $1 $3))
-    | new_variable '{' expr '}' ((zend_ast_create_ex ZEND_AST_DIM 
ZEND_DIM_ALTERNATIVE_SYNTAX $1 $3))
-    | new_variable T_OBJECT_OPERATOR property_name ((zend_ast_create 
ZEND_AST_PROP $1 $3))
-    | class_name T_PAAMAYIM_NEKUDOTAYIM simple_variable ((zend_ast_create 
ZEND_AST_STATIC_PROP $1 $3))
-    | new_variable T_PAAMAYIM_NEKUDOTAYIM simple_variable ((zend_ast_create 
ZEND_AST_STATIC_PROP $1 $3))
-    ;
-
-member_name:
-    identifier ($1)
-    | '{' expr '}' ($2)
-    | simple_variable ((zend_ast_create ZEND_AST_VAR $1))
-    ;
-
-property_name:
-    T_STRING ($1)
-    | '{' expr '}' ($2)
-    | simple_variable ((zend_ast_create ZEND_AST_VAR $1))
-    ;
-
-array_pair_list:
-    non_empty_array_pair_list (;; allow single trailing comma
-(zend_ast_list_rtrim $1))
-    ;
-
-possible_array_pair:
-    ;; empty
-    ($$ = NULL)
-    | array_pair ($1)
-    ;
-
-non_empty_array_pair_list:
-    non_empty_array_pair_list ',' possible_array_pair ((zend_ast_list_add $1 
$3))
-    | possible_array_pair ((zend_ast_create_list 1 ZEND_AST_ARRAY $1))
-    ;
-
-array_pair:
-    expr T_DOUBLE_ARROW expr ((zend_ast_create ZEND_AST_ARRAY_ELEM $3 $1))
-    | expr ((zend_ast_create ZEND_AST_ARRAY_ELEM $1 nil)
-    | expr T_DOUBLE_ARROW '&' variable ((zend_ast_create_ex 
ZEND_AST_ARRAY_ELEM 1 $4 $1))
-    | '&' variable ((zend_ast_create_ex ZEND_AST_ARRAY_ELEM 1 $2 nil)
-    | T_ELLIPSIS expr ((zend_ast_create ZEND_AST_UNPACK $2))
-    | expr T_DOUBLE_ARROW T_LIST '(' array_pair_list ')' ((put $5 'attr 
'ZEND_ARRAY_SYNTAX_LIST) (zend_ast_create ZEND_AST_ARRAY_ELEM $5 $1))
-    | T_LIST '(' array_pair_list ')' ((put $3 'attr 'ZEND_ARRAY_SYNTAX_LIST) 
(zend_ast_create ZEND_AST_ARRAY_ELEM $3 nil)
-    ;
-
-encaps_list:
-    encaps_list encaps_var ((zend_ast_list_add $1 $2))
-    | encaps_list T_ENCAPSED_AND_WHITESPACE ((zend_ast_list_add $1 $2))
-    | encaps_var ((zend_ast_create_list 1 ZEND_AST_ENCAPS_LIST $1))
-    | T_ENCAPSED_AND_WHITESPACE encaps_var ((zend_ast_create_list 2 
ZEND_AST_ENCAPS_LIST $1 $2))
-    ;
-
-encaps_var:
-    T_VARIABLE ((zend_ast_create ZEND_AST_VAR $1))
-    | T_VARIABLE '[' encaps_var_offset ']' ((zend_ast_create ZEND_AST_DIM 
(zend_ast_create ZEND_AST_VAR $1) $3))
-    | T_VARIABLE T_OBJECT_OPERATOR T_STRING ((zend_ast_create ZEND_AST_PROP 
(zend_ast_create ZEND_AST_VAR $1) $3))
-    | T_DOLLAR_OPEN_CURLY_BRACES expr '}' ((zend_ast_create ZEND_AST_VAR $2))
-    | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '}' ((zend_ast_create 
ZEND_AST_VAR $2))
-    | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '[' expr ']' '}' 
((zend_ast_create ZEND_AST_DIM (zend_ast_create ZEND_AST_VAR $2) $4))
-    | T_CURLY_OPEN variable '}' ($2)
-    ;
-
-encaps_var_offset:
-    T_STRING ($1)
-    | T_NUM_STRING ($1)
-    | '-' T_NUM_STRING ((zend_negate_num_string $2))
-    | T_VARIABLE ((zend_ast_create ZEND_AST_VAR $1))
-    ;
-
-internal_functions_in_yacc:
-    T_ISSET '(' isset_variables possible_comma ')' ($3)
-    | T_EMPTY '(' expr ')' ((zend_ast_create ZEND_AST_EMPTY $3))
-    | T_INCLUDE expr ((zend_ast_create_ex ZEND_AST_INCLUDE_OR_EVAL 
ZEND_INCLUDE $2))
-    | T_INCLUDE_ONCE expr ((zend_ast_create_ex ZEND_AST_INCLUDE_OR_EVAL 
ZEND_INCLUDE_ONCE $2))
-    | T_EVAL '(' expr ')' ((zend_ast_create_ex ZEND_AST_INCLUDE_OR_EVAL 
ZEND_EVAL $3))
-    | T_REQUIRE expr ((zend_ast_create_ex ZEND_AST_INCLUDE_OR_EVAL 
ZEND_REQUIRE $2))
-    | T_REQUIRE_ONCE expr ((zend_ast_create_ex ZEND_AST_INCLUDE_OR_EVAL 
ZEND_REQUIRE_ONCE $2))
-    ;
-
-isset_variables:
-    isset_variable ($1)
-    | isset_variables ',' isset_variable ((zend_ast_create ZEND_AST_AND $1 $3))
-    ;
-
-isset_variable:
-    expr ((zend_ast_create ZEND_AST_ISSET $1))
-    ;
-
-
-;; NOTE Generated grammar ends here
\ No newline at end of file
diff --git a/phps-mode.el b/phps-mode.el
index 7e1c941..c589dba 100644
--- a/phps-mode.el
+++ b/phps-mode.el
@@ -5,8 +5,8 @@
 ;; Author: Christian Johansson <christian@cvj.se>
 ;; Maintainer: Christian Johansson <christian@cvj.se>
 ;; Created: 3 Mar 2018
-;; Modified: 25 May 2020
-;; Version: 0.3.51
+;; Modified: 7 Jul 2020
+;; Version: 0.3.52
 ;; Keywords: tools, convenience
 ;; URL: https://github.com/cjohansson/emacs-phps-mode
 
@@ -52,7 +52,6 @@
 
 (require 'phps-mode-flymake)
 (require 'phps-mode-lex-analyzer)
-(require 'phps-mode-semantic)
 (require 'phps-mode-syntax-table)
 
 (require 'semantic)
diff --git a/test/phps-mode-test-lex-analyzer.el 
b/test/phps-mode-test-lex-analyzer.el
index 7faabbe..c604ffb 100644
--- a/test/phps-mode-test-lex-analyzer.el
+++ b/test/phps-mode-test-lex-analyzer.el
@@ -1124,6 +1124,13 @@
               buffer-contents
               "<?php\nif ($here) {\n    $var = \"abc $b[abc] def\";\n    // 
Was here\n}\n\n"))))
 
+  (phps-mode-test--with-buffer
+   "<?php\n\n// Adjust days to delivery accorind to document\nswitch 
($dayOfWeek)\n{\n    case 1: // Monday\n    case 2: // Tuesday\n    case 3: // 
Wednesday\n    case 7: // Sunday\n        $daysToDelivery = 3;\n        
break;\n    case 4: // Thursday\n    case 5: // Friday\n        $daysToDelivery 
= 5;\n        break;\n    case 6: // Saturday\n        $daysToDelivery = 4;\n   
     break;\n    default:\n        throw new \Exception(sprintf(\n            
'day of week above interval (1-7): [...]
+   "Switch case with default case and trailing comments"
+   (indent-region (point-min) (point-max))
+   (let ((buffer-contents (buffer-substring-no-properties (point-min) 
(point-max))))
+     (should (equal buffer-contents  "<?php\n\n// Adjust days to delivery 
accorind to document\nswitch ($dayOfWeek)\n{\n    case 1: // Monday\n    case 
2: // Tuesday\n    case 3: // Wednesday\n    case 7: // Sunday\n        
$daysToDelivery = 3;\n        break;\n    case 4: // Thursday\n    case 5: // 
Friday\n        $daysToDelivery = 5;\n        break;\n    case 6: // Saturday\n 
       $daysToDelivery = 4;\n        break;\n    default:\n        throw new 
\Exception(sprintf(\n             [...]
+
   )
 
 (defun phps-mode-test-lex-analyzer--imenu ()
diff --git a/phps-mode-test.el b/test/phps-mode-test.el
similarity index 100%
rename from phps-mode-test.el
rename to test/phps-mode-test.el



reply via email to

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