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