[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/phps-mode 9748853 267/405: Merged all lexer analysis in
From: |
Stefan Monnier |
Subject: |
[elpa] externals/phps-mode 9748853 267/405: Merged all lexer analysis into one to better match re2c lexer |
Date: |
Sat, 13 Jul 2019 10:00:29 -0400 (EDT) |
branch: externals/phps-mode
commit 974885311f7ca661bbcdffc649e71fbdcaec1e44
Author: Christian Johansson <address@hidden>
Commit: Christian Johansson <address@hidden>
Merged all lexer analysis into one to better match re2c lexer
---
phps-mode-lexer.el | 1598 +++++++++++++++++++++++++---------------------------
1 file changed, 773 insertions(+), 825 deletions(-)
diff --git a/phps-mode-lexer.el b/phps-mode-lexer.el
index e8a03d2..f4b8923 100644
--- a/phps-mode-lexer.el
+++ b/phps-mode-lexer.el
@@ -407,663 +407,622 @@
;; LEXERS
-(define-lex-analyzer phps-mode-lexer-lex--INITIAL
- "<?=,<?php,<?,end|inline_char_handler"
- (= phps-mode-lexer-STATE phps-mode-lexer-ST_INITIAL)
+(define-lex-analyzer phps-mode-lexer-lex-analyzer
+ "Elisp port of original Zend re2c lexer."
+ t
(cond
- ((looking-at "<\\?=")
- (let ((start (match-beginning 0))
- (end (match-end 0)))
- (phps-mode-lexer-BEGIN phps-mode-lexer-ST_IN_SCRIPTING)
- ;; (message "Starting scripting after <?=")
- (when phps-mode-lexer-PARSER_MODE
- (phps-mode-lexer-RETURN_TOKEN 'T_ECHO start end))
- (phps-mode-lexer-RETURN_TOKEN 'T_OPEN_TAG_WITH_ECHO start end)))
-
- ((looking-at "<\\?php\\([ \t]\\|\n\\)")
- (let ((start (match-beginning 0))
- (end (match-end 0)))
- (phps-mode-lexer-BEGIN phps-mode-lexer-ST_IN_SCRIPTING)
- ;; (message "Starting scripting after <?php")
- (when phps-mode-lexer-EXPECTED
- (phps-mode-lexer-SKIP_TOKEN 'T_OPEN_TAG start end))
- (phps-mode-lexer-RETURN_TOKEN 'T_OPEN_TAG start end)))
-
- ((looking-at "<\\?")
- (when phps-mode-lexer-SHORT_TAGS
- (let ((start (match-beginning 0))
- (end (match-end 0)))
- (phps-mode-lexer-BEGIN phps-mode-lexer-ST_IN_SCRIPTING)
- (when phps-mode-lexer-EXPECTED
- (phps-mode-lexer-SKIP_TOKEN 'T_OPEN_TAG start end))
- ;; (message "Starting scripting after <?")
- (phps-mode-lexer-RETURN_TOKEN 'T_OPEN_TAG start end))))
-
- ;; NOTE: mimics inline_char_handler
- ((looking-at phps-mode-lexer-ANY_CHAR)
- (let ((start (match-beginning 0)))
- (let ((string-start (search-forward "<?" nil t)))
- (if string-start
- (phps-mode-lexer-RETURN_TOKEN 'T_INLINE_HTML start (- string-start
2))
- (phps-mode-lexer-RETURN_TOKEN 'T_INLINE_HTML start (point-max))))))
-
- ))
-
-(defun phps-mode-lexer-get-tokens ()
- "Get tokens."
- phps-mode-lexer-tokens)
-
-(defun phps-mode-lexer--get-next-unescaped (character)
- "Find where next un-escaped CHARACTER comes, if none is found return nil."
- ;; (message "phps-mode-lexer--get-next-unescaped(%s)" character)
- (let ((escaped nil)
- (pos nil))
- (while (and (not pos)
- (< (point) (point-max)))
- (progn
- ;; (message "Setting forward one %s vs %s" (point) (point-max))
- (forward-char)
- (if (and (not escaped)
- (looking-at-p character))
- (setq pos (1+ (point)))
- (if (looking-at-p "\\\\")
- (setq escaped (not escaped))
- (setq escaped nil)))))
- pos))
+ ;; ST_INITIAL
+ ((= phps-mode-lexer-STATE phps-mode-lexer-ST_INITIAL)
+ (cond
-(define-lex-analyzer phps-mode-lexer-lex--ST_IN_SCRIPTING
- "<ST_IN_SCRIPTING>"
- (= phps-mode-lexer-STATE phps-mode-lexer-ST_IN_SCRIPTING)
- (cond
-
- ((looking-at (concat "exit" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_EXIT (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "die" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_DIE (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "function" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_FUNCTION (match-beginning 0) (1-
(match-end 0))))
- ((looking-at (concat "const" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_CONST (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "return" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_RETURN (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "yield" phps-mode-lexer-WHITESPACE "from"
"[^a-zA-Z0-9_\x80-\xff]"))
- (phps-mode-lexer-RETURN_TOKEN 'T_YIELD_FROM (match-beginning 0) (match-end
0)))
- ((looking-at (concat "yield" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_YIELD (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "try" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_TRY (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "catch" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_CATCH (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "finally" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_FINALLY (match-beginning 0) (1-
(match-end 0))))
- ((looking-at (concat "throw" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_THROW (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "if" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_IF (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "elseif" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_ELSEIF (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "endif" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_ENDIF (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "else" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_ELSE (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "while" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_WHILE (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "endwhile" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_ENDWHILE (match-beginning 0) (1-
(match-end 0))))
- ((looking-at (concat "do" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_DO (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "foreach" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_FOREACH (match-beginning 0) (1-
(match-end 0))))
- ((looking-at (concat "endforeach" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_ENDFOREACH (match-beginning 0) (1-
(match-end 0))))
- ((looking-at (concat "for" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_FOR (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "endfor" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_ENDFOR (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "declare" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_DECLARE (match-beginning 0) (1-
(match-end 0))))
- ((looking-at (concat "enddeclare" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_ENDDECLARE (match-beginning 0) (1-
(match-end 0))))
- ((looking-at (concat "instanceof" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_INSTANCEOF (match-beginning 0) (1-
(match-end 0))))
- ((looking-at (concat "as" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_AS (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "switch" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_SWITCH (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "endswitch" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_ENDSWITCH (match-beginning 0) (1-
(match-end 0))))
- ((looking-at (concat "case" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_CASE (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "default" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_DEFAULT (match-beginning 0) (1-
(match-end 0))))
- ((looking-at (concat "break" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_BREAK (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "continue" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_CONTINUE (match-beginning 0) (1-
(match-end 0))))
- ((looking-at (concat "goto" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_GOTO (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "echo" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_ECHO (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "print" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_PRINT (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "class" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_CLASS (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "interface" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_INTERFACE (match-beginning 0) (1-
(match-end 0))))
- ((looking-at (concat "trait" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_TRAIT (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "extends" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_EXTENDS (match-beginning 0) (1-
(match-end 0))))
- ((looking-at (concat "implements" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_IMPLEMENTS (match-beginning 0) (1-
(match-end 0))))
-
- ((looking-at "->")
- (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_LOOKING_FOR_PROPERTY)
- (phps-mode-lexer-RETURN_TOKEN 'T_OBJECT_OPERATOR (match-beginning 0)
(match-end 0)))
-
- ((looking-at "\\?>\n?")
- (let ((start (match-beginning 0))
- (end (match-end 0)))
- (when (= (- end start) 3)
- (setq end (1- end)))
- (phps-mode-lexer-BEGIN phps-mode-lexer-ST_INITIAL)
- (when phps-mode-lexer-PARSER_MODE
- (phps-mode-lexer-RETURN_TOKEN ";" start end))
- (phps-mode-lexer-RETURN_TOKEN 'T_CLOSE_TAG start end)))
-
- ;; HEREDOC and NOWDOC
- ((looking-at (concat "<<<" phps-mode-lexer-TABS_AND_SPACES "\\("
phps-mode-lexer-LABEL "\\|'" phps-mode-lexer-LABEL "'\\|\""
phps-mode-lexer-LABEL "\"\\)" phps-mode-lexer-NEWLINE))
- (let* ((start (match-beginning 0))
- (end (match-end 0))
- (data (buffer-substring-no-properties (match-beginning 1)
(match-end 1)))
- (heredoc_label))
-
- ;; Determine if it's HEREDOC or NOWDOC and extract label here
- (if (string= (substring data 0 1) "'")
- (progn
- (setq heredoc_label (substring data 1 (- (length data) 1)))
- (phps-mode-lexer-BEGIN phps-mode-lexer-ST_NOWDOC))
- (progn
- (if (string= (substring data 0 1) "\"")
- (setq heredoc_label (substring data 1 (- (length data) 1)))
- (setq heredoc_label data))
- (phps-mode-lexer-BEGIN phps-mode-lexer-ST_HEREDOC)))
-
- ;; Check for ending label on the next line
- (when (string= (buffer-substring-no-properties end (+ end (length
heredoc_label))) heredoc_label)
- (phps-mode-lexer-BEGIN phps-mode-lexer-ST_END_HEREDOC))
-
- (push heredoc_label phps-mode-lexer-heredoc_label_stack)
- ;; (message "Found heredoc or nowdoc at %s with label %s" data
heredoc_label)
-
- (phps-mode-lexer-RETURN_TOKEN 'T_START_HEREDOC start end)))
-
- ((looking-at "::")
- (phps-mode-lexer-RETURN_TOKEN 'T_PAAMAYIM_NEKUDOTAYIM (match-beginning 0)
(match-end 0)))
- ((looking-at "\\\\")
- (phps-mode-lexer-RETURN_TOKEN 'T_NS_SEPARATOR (match-beginning 0)
(match-end 0)))
- ((looking-at "\\.\\.\\.")
- (phps-mode-lexer-RETURN_TOKEN 'T_ELLIPSIS (match-beginning 0) (match-end
0)))
- ((looking-at "\\?\\?")
- (phps-mode-lexer-RETURN_TOKEN 'T_COALESCE (match-beginning 0) (match-end
0)))
- ((looking-at (concat "new" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_NEW (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "clone" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_CLONE (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "var" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_VAR (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES
"\\(integer\\|int\\)" phps-mode-lexer-TABS_AND_SPACES ")"))
- (phps-mode-lexer-RETURN_TOKEN 'T_INT_CAST (match-beginning 0) (match-end
0)))
- ((looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES
"\\(real\\|double\\|float\\)" phps-mode-lexer-TABS_AND_SPACES ")"))
- (phps-mode-lexer-RETURN_TOKEN 'T_DOUBLE_CAST (match-beginning 0)
(match-end 0)))
- ((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 (match-beginning 0)
(match-end 0)))
- ((looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES "array"
phps-mode-lexer-TABS_AND_SPACES ")"))
- (phps-mode-lexer-RETURN_TOKEN 'T_ARRAY_CAST (match-beginning 0) (match-end
0)))
- ((looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES "object"
phps-mode-lexer-TABS_AND_SPACES ")"))
- (phps-mode-lexer-RETURN_TOKEN 'T_OBJECT_CAST (match-beginning 0)
(match-end 0)))
- ((looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES
"\\(boolean\\|bool\\)" phps-mode-lexer-TABS_AND_SPACES ")"))
- (phps-mode-lexer-RETURN_TOKEN 'T_BOOL_CAST (match-beginning 0) (match-end
0)))
- ((looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES "unset"
phps-mode-lexer-TABS_AND_SPACES ")"))
- (phps-mode-lexer-RETURN_TOKEN 'T_UNSET_CAST (match-beginning 0) (match-end
0)))
- ((looking-at (concat "eval" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_EVAL (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "include_once" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_INCLUDE_ONCE (match-beginning 0) (1-
(match-end 0))))
- ((looking-at (concat "include" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_INCLUDE (match-beginning 0) (1-
(match-end 0))))
- ((looking-at (concat "require_once" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_REQUIRE_ONCE (match-beginning 0) (1-
(match-end 0))))
- ((looking-at (concat "require" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_REQUIRE (match-beginning 0) (1-
(match-end 0))))
- ((looking-at (concat "namespace" phps-mode-lexer-NOT-LABEL))
- (setq phps-mode-lexer-declaring_namespace t)
- (phps-mode-lexer-RETURN_TOKEN 'T_NAMESPACE (match-beginning 0) (1-
(match-end 0))))
- ((looking-at (concat "use" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_USE (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "insteadof" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_INSTEADOF (match-beginning 0) (1-
(match-end 0))))
- ((looking-at (concat "global" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_GLOBAL (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "isset" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_ISSET (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "empty" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_EMPTY (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "__halt_compiler" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_HALT_COMPILER (match-beginning 0) (1-
(match-end 0))))
- ((looking-at (concat "static" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_STATIC (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "abstract" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_ABSTRACT (match-beginning 0) (1-
(match-end 0))))
- ((looking-at (concat "final" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_FINAL (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "private" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_PRIVATE (match-beginning 0) (1-
(match-end 0))))
- ((looking-at (concat "protected" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_PROTECTED (match-beginning 0) (1-
(match-end 0))))
- ((looking-at (concat "public" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_PUBLIC (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "unset" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_UNSET (match-beginning 0) (1- (match-end
0))))
- ((looking-at "=>")
- (phps-mode-lexer-RETURN_TOKEN 'T_DOUBLE_ARROW (match-beginning 0)
(match-end 0)))
- ((looking-at (concat "list" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_LIST (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "array" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_ARRAY (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "callable" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_CALLABLE (match-beginning 0) (1-
(match-end 0))))
- ((looking-at "\\+\\+")
- (phps-mode-lexer-RETURN_TOKEN 'T_INC (match-beginning 0) (match-end 0)))
- ((looking-at "--")
- (phps-mode-lexer-RETURN_TOKEN 'T_DEC (match-beginning 0) (match-end 0)))
- ((looking-at "===")
- (phps-mode-lexer-RETURN_TOKEN 'T_IS_IDENTICAL (match-beginning 0)
(match-end 0)))
- ((looking-at "!==")
- (phps-mode-lexer-RETURN_TOKEN 'T_IS_NOT_IDENTICAL (match-beginning 0)
(match-end 0)))
- ((looking-at "==")
- (phps-mode-lexer-RETURN_TOKEN 'T_IS_EQUAL (match-beginning 0) (match-end
0)))
- ((looking-at "\\(!=\\|<>\\)")
- (phps-mode-lexer-RETURN_TOKEN 'T_IS_NOT_EQUAL (match-beginning 0)
(match-end 0)))
- ((looking-at "<=>")
- (phps-mode-lexer-RETURN_TOKEN 'T_SPACESHIP (match-beginning 0) (match-end
0)))
- ((looking-at "<=")
- (phps-mode-lexer-RETURN_TOKEN 'T_IS_SMALLER_OR_EQUAL (match-beginning 0)
(match-end 0)))
- ((looking-at ">=")
- (phps-mode-lexer-RETURN_TOKEN 'T_IS_GREATER_OR_EQUAL (match-beginning 0)
(match-end 0)))
- ((looking-at "\\+=")
- (phps-mode-lexer-RETURN_TOKEN 'T_PLUS_EQUAL (match-beginning 0) (match-end
0)))
- ((looking-at "-=")
- (phps-mode-lexer-RETURN_TOKEN 'T_MINUS_EQUAL (match-beginning 0)
(match-end 0)))
- ((looking-at "\\*=")
- (phps-mode-lexer-RETURN_TOKEN 'T_MUL_EQUAL (match-beginning 0) (match-end
0)))
- ((looking-at "\\*\\\\\\*=")
- (phps-mode-lexer-RETURN_TOKEN 'T_POW_EQUAL (match-beginning 0) (match-end
0)))
- ((looking-at "\\*\\\\\\*")
- (phps-mode-lexer-RETURN_TOKEN 'T_POW (match-beginning 0) (match-end 0)))
- ((looking-at "/=")
- (phps-mode-lexer-RETURN_TOKEN 'T_DIV_EQUAL (match-beginning 0) (match-end
0)))
- ((looking-at "\\.=")
- (phps-mode-lexer-RETURN_TOKEN 'T_CONCAT_EQUAL (match-beginning 0)
(match-end 0)))
- ((looking-at "%=")
- (phps-mode-lexer-RETURN_TOKEN 'T_MOD_EQUAL (match-beginning 0) (match-end
0)))
- ((looking-at "<<=")
- (phps-mode-lexer-RETURN_TOKEN 'T_SL_EQUAL (match-beginning 0) (match-end
0)))
- ((looking-at ">>=")
- (phps-mode-lexer-RETURN_TOKEN 'T_SR_EQUAL (match-beginning 0) (match-end
0)))
- ((looking-at "&=")
- (phps-mode-lexer-RETURN_TOKEN 'T_AND_EQUAL (match-beginning 0) (match-end
0)))
- ((looking-at "|=")
- (phps-mode-lexer-RETURN_TOKEN 'T_OR_EQUAL (match-beginning 0) (match-end
0)))
- ((looking-at "\\^=")
- (phps-mode-lexer-RETURN_TOKEN 'T_XOR_EQUAL (match-beginning 0) (match-end
0)))
- ((looking-at "||")
- (phps-mode-lexer-RETURN_TOKEN 'T_BOOLEAN_OR (match-beginning 0) (match-end
0)))
- ((looking-at "&&")
- (phps-mode-lexer-RETURN_TOKEN 'T_BOOLEAN_AND (match-beginning 0)
(match-end 0)))
- ((looking-at (concat "XOR" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_XOR (match-beginning 0) (1-
(match-end 0))))
- ((looking-at (concat "OR" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_OR (match-beginning 0) (1-
(match-end 0))))
- ((looking-at (concat "AND" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_AND (match-beginning 0) (1-
(match-end 0))))
- ((looking-at "<<")
- (phps-mode-lexer-RETURN_TOKEN 'T_SL (match-beginning 0) (match-end 0)))
- ((looking-at ">>")
- (phps-mode-lexer-RETURN_TOKEN 'T_SR (match-beginning 0) (match-end 0)))
-
- ((looking-at "{")
- (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_IN_SCRIPTING)
- (when phps-mode-lexer-declaring_namespace
- (setq phps-mode-lexer-declaring_namespace nil))
- (phps-mode-lexer-RETURN_TOKEN "{" (match-beginning 0) (match-end 0)))
-
- ((looking-at "}")
- (when phps-mode-lexer-state_stack
- ;; (message "State stack %s" phps-mode-lexer-state_stack)
- ;; (message "popping state from } %s at %s-%s" (length
phps-mode-lexer-state_stack) (match-beginning 0) (match-end 0))
- (phps-mode-lexer-yy_pop_state)
- ;; (message "New state: %s" phps-mode-lexer-STATE)
- )
- (phps-mode-lexer-RETURN_TOKEN "}" (match-beginning 0) (match-end 0)))
-
- ((looking-at phps-mode-lexer-BNUM)
- (let* ((start (match-beginning 0))
- (end (match-end 0))
- (data (buffer-substring-no-properties (+ start 2) end))
- (long-number (string-to-number data 2)))
- ;; (message "Binary number %s from %s" long-number data)
- (if (> long-number phps-mode-lexer-long-limit)
- (phps-mode-lexer-RETURN_TOKEN 'T_DNUMBER start end)
- (phps-mode-lexer-RETURN_TOKEN 'T_LNUMBER start end))))
-
- ((looking-at phps-mode-lexer-HNUM)
- (let* ((start (match-beginning 0))
- (end (match-end 0))
- (data (buffer-substring-no-properties (+ start 2) end))
- (long-number (string-to-number data 16)))
- ;; (message "Hexadecimal number %s from %s" long-number data)
- (if (> long-number phps-mode-lexer-long-limit)
- (phps-mode-lexer-RETURN_TOKEN 'T_DNUMBER start end)
- (phps-mode-lexer-RETURN_TOKEN 'T_LNUMBER start end))))
-
- ((or (looking-at phps-mode-lexer-EXPONENT_DNUM)
- (looking-at phps-mode-lexer-DNUM))
- (let* ((start (match-beginning 0))
- (end (match-end 0))
- (_data (buffer-substring-no-properties start end)))
- ;; (message "Exponent/double at: %s" _data)
- (phps-mode-lexer-RETURN_TOKEN 'T_DNUMBER start end)))
-
- ((looking-at phps-mode-lexer-LNUM)
- (let* ((start (match-beginning 0))
- (end (match-end 0))
- (data (string-to-number (buffer-substring-no-properties start
end))))
- ;; (message "Long number: %d" data)
- (if (> data phps-mode-lexer-long-limit)
- (phps-mode-lexer-RETURN_TOKEN 'T_DNUMBER start end)
- (phps-mode-lexer-RETURN_TOKEN 'T_LNUMBER start end))))
-
- ((looking-at (concat "__CLASS__" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_CLASS_C (match-beginning 0) (1-
(match-end 0))))
- ((looking-at (concat "__TRAIT__" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_TRAIT_C (match-beginning 0) (1-
(match-end 0))))
- ((looking-at (concat "__FUNCTION__" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_FUNC_C (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "__METHOD__" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_METHOD_C (match-beginning 0) (1-
(match-end 0))))
- ((looking-at (concat "__LINE__" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_LINE (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "__FILE__" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_FILE (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "__DIR__" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_DIR (match-beginning 0) (1- (match-end
0))))
- ((looking-at (concat "__NAMESPACE__" phps-mode-lexer-NOT-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_NS_C (match-beginning 0) (1- (match-end
0))))
-
- ((looking-at "\\(//\\|#\\)")
- (let* ((start (match-beginning 0))
- (end (match-end 0))
- (_data (buffer-substring-no-properties start end))
- (line (buffer-substring-no-properties end (line-end-position))))
- (if (string-match "\\?>" line)
- (progn
- ;; (message "Found comment 1 from %s to %s %s in %s" end (+ end
(match-beginning 0)) (match-beginning 0) line)
- (phps-mode-lexer-RETURN_TOKEN 'T_COMMENT start (+ end
(match-beginning 0)))
- )
- (progn
- ;; TODO Handle expecting values here
- ;; (message "Found comment 2 from %s to %s" start
(line-end-position))
- (phps-mode-lexer-RETURN_TOKEN 'T_COMMENT start (line-end-position))
- ))))
-
- ((looking-at (concat "/\\*\\*" phps-mode-lexer-WHITESPACE))
- (let* ((start (match-beginning 0))
- (end (match-end 0))
- (_data (buffer-substring-no-properties start end)))
- (let ((string-start (search-forward "*/" nil t))
- position)
- (if string-start
- (setq position string-start)
- (progn
- (setq position (point-max))
- (phps-mode-lexer-MOVE_FORWARD (point-max))))
- (phps-mode-lexer-RETURN_TOKEN 'T_DOC_COMMENT start position)
- )))
-
- ((looking-at "/\\*")
- (let* ((start (match-beginning 0))
- (end (match-end 0))
- (_data (buffer-substring-no-properties start end)))
- (let ((string-start (search-forward "*/" nil t))
- position)
- (if string-start
- (setq position string-start)
- (progn
- (setq position (point-max))
- (phps-mode-lexer-MOVE_FORWARD (point-max))))
- (phps-mode-lexer-RETURN_TOKEN 'T_COMMENT start position)
- )))
-
- ((looking-at (concat "\\$" phps-mode-lexer-LABEL))
- (let ((start (match-beginning 0))
- (end (match-end 0)))
- (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE start end)))
-
- ((looking-at phps-mode-lexer-TOKENS)
- (let* ((start (match-beginning 0))
- (end (match-end 0))
- (data (buffer-substring-no-properties start end))
- (use-brace nil))
- ;; (message "Found token '%s'" data)
- (when phps-mode-lexer-declaring_namespace
- (when (string= data ";")
- (setq phps-mode-lexer-prepend_trailing_brace t)
- ;; (message "Set flag prepend trailing brace")
- ;; (setq use-brace t)
+ ((looking-at "<\\?=")
+ (let ((start (match-beginning 0))
+ (end (match-end 0)))
+ (phps-mode-lexer-BEGIN phps-mode-lexer-ST_IN_SCRIPTING)
+ ;; (message "Starting scripting after <?=")
+ (when phps-mode-lexer-PARSER_MODE
+ (phps-mode-lexer-RETURN_TOKEN 'T_ECHO start end))
+ (phps-mode-lexer-RETURN_TOKEN 'T_OPEN_TAG_WITH_ECHO start end)))
+
+ ((looking-at "<\\?php\\([ \t]\\|\n\\)")
+ (let ((start (match-beginning 0))
+ (end (match-end 0)))
+ (phps-mode-lexer-BEGIN phps-mode-lexer-ST_IN_SCRIPTING)
+ ;; (message "Starting scripting after <?php")
+ (when phps-mode-lexer-EXPECTED
+ (phps-mode-lexer-SKIP_TOKEN 'T_OPEN_TAG start end))
+ (phps-mode-lexer-RETURN_TOKEN 'T_OPEN_TAG start end)))
+
+ ((looking-at "<\\?")
+ (when phps-mode-lexer-SHORT_TAGS
+ (let ((start (match-beginning 0))
+ (end (match-end 0)))
+ (phps-mode-lexer-BEGIN phps-mode-lexer-ST_IN_SCRIPTING)
+ (when phps-mode-lexer-EXPECTED
+ (phps-mode-lexer-SKIP_TOKEN 'T_OPEN_TAG start end))
+ ;; (message "Starting scripting after <?")
+ (phps-mode-lexer-RETURN_TOKEN 'T_OPEN_TAG start end))))
+
+ ;; NOTE: mimics inline_char_handler
+ ((looking-at phps-mode-lexer-ANY_CHAR)
+ (let ((start (match-beginning 0)))
+ (let ((string-start (search-forward "<?" nil t)))
+ (if string-start
+ (phps-mode-lexer-RETURN_TOKEN 'T_INLINE_HTML start (-
string-start 2))
+ (phps-mode-lexer-RETURN_TOKEN 'T_INLINE_HTML start
(point-max))))))
+
+ ))
+
+ ;; ST_IN_SCRIPTING
+ ((= phps-mode-lexer-STATE phps-mode-lexer-ST_IN_SCRIPTING)
+ (cond
+
+ ((looking-at (concat "exit" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_EXIT (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "die" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_DIE (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "function" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_FUNCTION (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "const" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_CONST (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "return" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_RETURN (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "yield" phps-mode-lexer-WHITESPACE "from"
"[^a-zA-Z0-9_\x80-\xff]"))
+ (phps-mode-lexer-RETURN_TOKEN 'T_YIELD_FROM (match-beginning 0)
(match-end 0)))
+ ((looking-at (concat "yield" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_YIELD (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "try" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_TRY (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "catch" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_CATCH (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "finally" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_FINALLY (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "throw" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_THROW (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "if" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_IF (match-beginning 0) (1- (match-end
0))))
+ ((looking-at (concat "elseif" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_ELSEIF (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "endif" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_ENDIF (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "else" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_ELSE (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "while" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_WHILE (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "endwhile" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_ENDWHILE (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "do" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_DO (match-beginning 0) (1- (match-end
0))))
+ ((looking-at (concat "foreach" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_FOREACH (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "endforeach" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_ENDFOREACH (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "for" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_FOR (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "endfor" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_ENDFOR (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "declare" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_DECLARE (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "enddeclare" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_ENDDECLARE (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "instanceof" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_INSTANCEOF (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "as" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_AS (match-beginning 0) (1- (match-end
0))))
+ ((looking-at (concat "switch" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_SWITCH (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "endswitch" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_ENDSWITCH (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "case" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_CASE (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "default" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_DEFAULT (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "break" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_BREAK (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "continue" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_CONTINUE (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "goto" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_GOTO (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "echo" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_ECHO (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "print" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_PRINT (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "class" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_CLASS (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "interface" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_INTERFACE (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "trait" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_TRAIT (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "extends" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_EXTENDS (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "implements" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_IMPLEMENTS (match-beginning 0) (1-
(match-end 0))))
+
+ ((looking-at "->")
+ (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_LOOKING_FOR_PROPERTY)
+ (phps-mode-lexer-RETURN_TOKEN 'T_OBJECT_OPERATOR (match-beginning 0)
(match-end 0)))
+
+ ((looking-at "\\?>\n?")
+ (let ((start (match-beginning 0))
+ (end (match-end 0)))
+ (when (= (- end start) 3)
+ (setq end (1- end)))
+ (phps-mode-lexer-BEGIN phps-mode-lexer-ST_INITIAL)
+ (when phps-mode-lexer-PARSER_MODE
+ (phps-mode-lexer-RETURN_TOKEN ";" start end))
+ (phps-mode-lexer-RETURN_TOKEN 'T_CLOSE_TAG start end)))
+
+ ;; HEREDOC and NOWDOC
+ ((looking-at (concat "<<<" phps-mode-lexer-TABS_AND_SPACES "\\("
phps-mode-lexer-LABEL "\\|'" phps-mode-lexer-LABEL "'\\|\""
phps-mode-lexer-LABEL "\"\\)" phps-mode-lexer-NEWLINE))
+ (let* ((start (match-beginning 0))
+ (end (match-end 0))
+ (data (buffer-substring-no-properties (match-beginning 1)
(match-end 1)))
+ (heredoc_label))
+
+ ;; Determine if it's HEREDOC or NOWDOC and extract label here
+ (if (string= (substring data 0 1) "'")
+ (progn
+ (setq heredoc_label (substring data 1 (- (length data) 1)))
+ (phps-mode-lexer-BEGIN phps-mode-lexer-ST_NOWDOC))
+ (progn
+ (if (string= (substring data 0 1) "\"")
+ (setq heredoc_label (substring data 1 (- (length data) 1)))
+ (setq heredoc_label data))
+ (phps-mode-lexer-BEGIN phps-mode-lexer-ST_HEREDOC)))
+
+ ;; Check for ending label on the next line
+ (when (string= (buffer-substring-no-properties end (+ end (length
heredoc_label))) heredoc_label)
+ (phps-mode-lexer-BEGIN phps-mode-lexer-ST_END_HEREDOC))
+
+ (push heredoc_label phps-mode-lexer-heredoc_label_stack)
+ ;; (message "Found heredoc or nowdoc at %s with label %s" data
heredoc_label)
+
+ (phps-mode-lexer-RETURN_TOKEN 'T_START_HEREDOC start end)))
+
+ ((looking-at "::")
+ (phps-mode-lexer-RETURN_TOKEN 'T_PAAMAYIM_NEKUDOTAYIM (match-beginning
0) (match-end 0)))
+ ((looking-at "\\\\")
+ (phps-mode-lexer-RETURN_TOKEN 'T_NS_SEPARATOR (match-beginning 0)
(match-end 0)))
+ ((looking-at "\\.\\.\\.")
+ (phps-mode-lexer-RETURN_TOKEN 'T_ELLIPSIS (match-beginning 0)
(match-end 0)))
+ ((looking-at "\\?\\?")
+ (phps-mode-lexer-RETURN_TOKEN 'T_COALESCE (match-beginning 0)
(match-end 0)))
+ ((looking-at (concat "new" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_NEW (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "clone" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_CLONE (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "var" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_VAR (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES
"\\(integer\\|int\\)" phps-mode-lexer-TABS_AND_SPACES ")"))
+ (phps-mode-lexer-RETURN_TOKEN 'T_INT_CAST (match-beginning 0)
(match-end 0)))
+ ((looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES
"\\(real\\|double\\|float\\)" phps-mode-lexer-TABS_AND_SPACES ")"))
+ (phps-mode-lexer-RETURN_TOKEN 'T_DOUBLE_CAST (match-beginning 0)
(match-end 0)))
+ ((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 (match-beginning 0)
(match-end 0)))
+ ((looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES "array"
phps-mode-lexer-TABS_AND_SPACES ")"))
+ (phps-mode-lexer-RETURN_TOKEN 'T_ARRAY_CAST (match-beginning 0)
(match-end 0)))
+ ((looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES "object"
phps-mode-lexer-TABS_AND_SPACES ")"))
+ (phps-mode-lexer-RETURN_TOKEN 'T_OBJECT_CAST (match-beginning 0)
(match-end 0)))
+ ((looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES
"\\(boolean\\|bool\\)" phps-mode-lexer-TABS_AND_SPACES ")"))
+ (phps-mode-lexer-RETURN_TOKEN 'T_BOOL_CAST (match-beginning 0)
(match-end 0)))
+ ((looking-at (concat "(" phps-mode-lexer-TABS_AND_SPACES "unset"
phps-mode-lexer-TABS_AND_SPACES ")"))
+ (phps-mode-lexer-RETURN_TOKEN 'T_UNSET_CAST (match-beginning 0)
(match-end 0)))
+ ((looking-at (concat "eval" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_EVAL (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "include_once" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_INCLUDE_ONCE (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "include" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_INCLUDE (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "require_once" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_REQUIRE_ONCE (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "require" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_REQUIRE (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "namespace" phps-mode-lexer-NOT-LABEL))
+ (setq phps-mode-lexer-declaring_namespace t)
+ (phps-mode-lexer-RETURN_TOKEN 'T_NAMESPACE (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "use" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_USE (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "insteadof" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_INSTEADOF (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "global" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_GLOBAL (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "isset" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_ISSET (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "empty" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_EMPTY (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "__halt_compiler" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_HALT_COMPILER (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "static" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_STATIC (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "abstract" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_ABSTRACT (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "final" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_FINAL (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "private" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_PRIVATE (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "protected" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_PROTECTED (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "public" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_PUBLIC (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "unset" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_UNSET (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at "=>")
+ (phps-mode-lexer-RETURN_TOKEN 'T_DOUBLE_ARROW (match-beginning 0)
(match-end 0)))
+ ((looking-at (concat "list" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_LIST (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "array" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_ARRAY (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "callable" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_CALLABLE (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at "\\+\\+")
+ (phps-mode-lexer-RETURN_TOKEN 'T_INC (match-beginning 0) (match-end
0)))
+ ((looking-at "--")
+ (phps-mode-lexer-RETURN_TOKEN 'T_DEC (match-beginning 0) (match-end
0)))
+ ((looking-at "===")
+ (phps-mode-lexer-RETURN_TOKEN 'T_IS_IDENTICAL (match-beginning 0)
(match-end 0)))
+ ((looking-at "!==")
+ (phps-mode-lexer-RETURN_TOKEN 'T_IS_NOT_IDENTICAL (match-beginning 0)
(match-end 0)))
+ ((looking-at "==")
+ (phps-mode-lexer-RETURN_TOKEN 'T_IS_EQUAL (match-beginning 0)
(match-end 0)))
+ ((looking-at "\\(!=\\|<>\\)")
+ (phps-mode-lexer-RETURN_TOKEN 'T_IS_NOT_EQUAL (match-beginning 0)
(match-end 0)))
+ ((looking-at "<=>")
+ (phps-mode-lexer-RETURN_TOKEN 'T_SPACESHIP (match-beginning 0)
(match-end 0)))
+ ((looking-at "<=")
+ (phps-mode-lexer-RETURN_TOKEN 'T_IS_SMALLER_OR_EQUAL (match-beginning
0) (match-end 0)))
+ ((looking-at ">=")
+ (phps-mode-lexer-RETURN_TOKEN 'T_IS_GREATER_OR_EQUAL (match-beginning
0) (match-end 0)))
+ ((looking-at "\\+=")
+ (phps-mode-lexer-RETURN_TOKEN 'T_PLUS_EQUAL (match-beginning 0)
(match-end 0)))
+ ((looking-at "-=")
+ (phps-mode-lexer-RETURN_TOKEN 'T_MINUS_EQUAL (match-beginning 0)
(match-end 0)))
+ ((looking-at "\\*=")
+ (phps-mode-lexer-RETURN_TOKEN 'T_MUL_EQUAL (match-beginning 0)
(match-end 0)))
+ ((looking-at "\\*\\\\\\*=")
+ (phps-mode-lexer-RETURN_TOKEN 'T_POW_EQUAL (match-beginning 0)
(match-end 0)))
+ ((looking-at "\\*\\\\\\*")
+ (phps-mode-lexer-RETURN_TOKEN 'T_POW (match-beginning 0) (match-end
0)))
+ ((looking-at "/=")
+ (phps-mode-lexer-RETURN_TOKEN 'T_DIV_EQUAL (match-beginning 0)
(match-end 0)))
+ ((looking-at "\\.=")
+ (phps-mode-lexer-RETURN_TOKEN 'T_CONCAT_EQUAL (match-beginning 0)
(match-end 0)))
+ ((looking-at "%=")
+ (phps-mode-lexer-RETURN_TOKEN 'T_MOD_EQUAL (match-beginning 0)
(match-end 0)))
+ ((looking-at "<<=")
+ (phps-mode-lexer-RETURN_TOKEN 'T_SL_EQUAL (match-beginning 0)
(match-end 0)))
+ ((looking-at ">>=")
+ (phps-mode-lexer-RETURN_TOKEN 'T_SR_EQUAL (match-beginning 0)
(match-end 0)))
+ ((looking-at "&=")
+ (phps-mode-lexer-RETURN_TOKEN 'T_AND_EQUAL (match-beginning 0)
(match-end 0)))
+ ((looking-at "|=")
+ (phps-mode-lexer-RETURN_TOKEN 'T_OR_EQUAL (match-beginning 0)
(match-end 0)))
+ ((looking-at "\\^=")
+ (phps-mode-lexer-RETURN_TOKEN 'T_XOR_EQUAL (match-beginning 0)
(match-end 0)))
+ ((looking-at "||")
+ (phps-mode-lexer-RETURN_TOKEN 'T_BOOLEAN_OR (match-beginning 0)
(match-end 0)))
+ ((looking-at "&&")
+ (phps-mode-lexer-RETURN_TOKEN 'T_BOOLEAN_AND (match-beginning 0)
(match-end 0)))
+ ((looking-at (concat "XOR" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_XOR (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "OR" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_OR (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "AND" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_LOGICAL_AND (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at "<<")
+ (phps-mode-lexer-RETURN_TOKEN 'T_SL (match-beginning 0) (match-end 0)))
+ ((looking-at ">>")
+ (phps-mode-lexer-RETURN_TOKEN 'T_SR (match-beginning 0) (match-end 0)))
+
+ ((looking-at "{")
+ (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_IN_SCRIPTING)
+ (when phps-mode-lexer-declaring_namespace
+ (setq phps-mode-lexer-declaring_namespace nil))
+ (phps-mode-lexer-RETURN_TOKEN "{" (match-beginning 0) (match-end 0)))
+
+ ((looking-at "}")
+ (when phps-mode-lexer-state_stack
+ ;; (message "State stack %s" phps-mode-lexer-state_stack)
+ ;; (message "popping state from } %s at %s-%s" (length
phps-mode-lexer-state_stack) (match-beginning 0) (match-end 0))
+ (phps-mode-lexer-yy_pop_state)
+ ;; (message "New state: %s" phps-mode-lexer-STATE)
)
- (setq phps-mode-lexer-declaring_namespace nil))
- (if use-brace
- (phps-mode-lexer-RETURN_TOKEN "{" start end)
- (phps-mode-lexer-RETURN_TOKEN data start end))))
-
- ((looking-at "'")
- (let* ((start (match-beginning 0))
- (end (match-end 0))
- (_data (buffer-substring-no-properties start end))
- (un-escaped-end (phps-mode-lexer--get-next-unescaped "'")))
- (if un-escaped-end
- (progn
- ;; (message "Single quoted string %s"
(buffer-substring-no-properties start un-escaped-end))
- (phps-mode-lexer-RETURN_TOKEN 'T_CONSTANT_ENCAPSED_STRING start
un-escaped-end))
- (progn
- ;; Unclosed single quotes
- ;; (message "Single quoted string never ends..")
- (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE start
(point-max))
- (phps-mode-lexer-MOVE_FORWARD (point-max))))))
-
- ;; Double quoted string
- ((looking-at "\"")
- (let* ((start (match-beginning 0))
- (end (match-end 0))
- (_data (buffer-substring-no-properties start end)))
- (forward-char)
- ;; Handle the "" case
- (if (looking-at-p "\"")
- (progn
- ;; (message "Empty double quoted string from %s to %s" start (+
start 2))
- (phps-mode-lexer-RETURN_TOKEN 'T_CONSTANT_ENCAPSED_STRING start (+
start 2))
- (forward-char))
- (let ((string-start (search-forward-regexp (concat
- "\\([^\\\\]\""
- "\\|\\$"
phps-mode-lexer-LABEL
- "\\|\\${"
phps-mode-lexer-LABEL
- "\\|{\\$"
phps-mode-lexer-LABEL "\\)")
- nil t)))
- ;; Do we find a ending double quote or starting variable?
- (if string-start
- (let ((string-start (match-beginning 0)))
- ;; (message "Double quoted string %s" double-quoted-string)
- ;; Do we find variable inside quote?
- (goto-char string-start)
- (if (looking-at "[^\\\\]\"")
- (progn
- (let ((_double-quoted-string
(buffer-substring-no-properties start (+ string-start 2))))
- ;; (message "Double quoted string: %s"
_double-quoted-string)
- (phps-mode-lexer-RETURN_TOKEN
'T_CONSTANT_ENCAPSED_STRING start (+ string-start 2))))
- (progn
- ;; (message "Found variable after '%s'"
(buffer-substring-no-properties start string-start))
- (phps-mode-lexer-BEGIN phps-mode-lexer-ST_DOUBLE_QUOTES)
- (phps-mode-lexer-RETURN_TOKEN "\"" start (1+ start))
- (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE
(1+ start) string-start))))
+ (phps-mode-lexer-RETURN_TOKEN "}" (match-beginning 0) (match-end 0)))
+
+ ((looking-at phps-mode-lexer-BNUM)
+ (let* ((start (match-beginning 0))
+ (end (match-end 0))
+ (data (buffer-substring-no-properties (+ start 2) end))
+ (long-number (string-to-number data 2)))
+ ;; (message "Binary number %s from %s" long-number data)
+ (if (> long-number phps-mode-lexer-long-limit)
+ (phps-mode-lexer-RETURN_TOKEN 'T_DNUMBER start end)
+ (phps-mode-lexer-RETURN_TOKEN 'T_LNUMBER start end))))
+
+ ((looking-at phps-mode-lexer-HNUM)
+ (let* ((start (match-beginning 0))
+ (end (match-end 0))
+ (data (buffer-substring-no-properties (+ start 2) end))
+ (long-number (string-to-number data 16)))
+ ;; (message "Hexadecimal number %s from %s" long-number data)
+ (if (> long-number phps-mode-lexer-long-limit)
+ (phps-mode-lexer-RETURN_TOKEN 'T_DNUMBER start end)
+ (phps-mode-lexer-RETURN_TOKEN 'T_LNUMBER start end))))
+
+ ((or (looking-at phps-mode-lexer-EXPONENT_DNUM)
+ (looking-at phps-mode-lexer-DNUM))
+ (let* ((start (match-beginning 0))
+ (end (match-end 0))
+ (_data (buffer-substring-no-properties start end)))
+ ;; (message "Exponent/double at: %s" _data)
+ (phps-mode-lexer-RETURN_TOKEN 'T_DNUMBER start end)))
+
+ ((looking-at phps-mode-lexer-LNUM)
+ (let* ((start (match-beginning 0))
+ (end (match-end 0))
+ (data (string-to-number (buffer-substring-no-properties start
end))))
+ ;; (message "Long number: %d" data)
+ (if (> data phps-mode-lexer-long-limit)
+ (phps-mode-lexer-RETURN_TOKEN 'T_DNUMBER start end)
+ (phps-mode-lexer-RETURN_TOKEN 'T_LNUMBER start end))))
+
+ ((looking-at (concat "__CLASS__" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_CLASS_C (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "__TRAIT__" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_TRAIT_C (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "__FUNCTION__" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_FUNC_C (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "__METHOD__" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_METHOD_C (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "__LINE__" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_LINE (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "__FILE__" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_FILE (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "__DIR__" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_DIR (match-beginning 0) (1-
(match-end 0))))
+ ((looking-at (concat "__NAMESPACE__" phps-mode-lexer-NOT-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_NS_C (match-beginning 0) (1-
(match-end 0))))
+
+ ((looking-at "\\(//\\|#\\)")
+ (let* ((start (match-beginning 0))
+ (end (match-end 0))
+ (_data (buffer-substring-no-properties start end))
+ (line (buffer-substring-no-properties end (line-end-position))))
+ (if (string-match "\\?>" line)
+ (progn
+ ;; (message "Found comment 1 from %s to %s %s in %s" end (+
end (match-beginning 0)) (match-beginning 0) line)
+ (phps-mode-lexer-RETURN_TOKEN 'T_COMMENT start (+ end
(match-beginning 0)))
+ )
(progn
- ;; (message "Found no ending quote, skipping to end")
- (phps-mode-lexer-RETURN_TOKEN 'T_ERROR start (point-max))
- (phps-mode-lexer-MOVE_FORWARD (point-max))))))))
-
- ((looking-at "[`]")
- ;; (message "Begun backquote at %s-%s" (match-beginning 0) (match-end 0))
- (phps-mode-lexer-BEGIN phps-mode-lexer-ST_BACKQUOTE)
- (phps-mode-lexer-RETURN_TOKEN "`" (match-beginning 0) (match-end 0)))
-
- ((looking-at phps-mode-lexer-WHITESPACE)
- (let* ((start (match-beginning 0))
- (end (match-end 0))
- (data (buffer-substring-no-properties start end)))
- (if phps-mode-lexer-PARSER_MODE
- (phps-mode-lexer-MOVE_FORWARD end)
- (phps-mode-lexer-RETURN_TOKEN data start end))))
-
- ((looking-at phps-mode-lexer-LABEL)
- ;; (message "Adding T_STRING from %s to %s" (match-beginning 0) (match-end
0))
- (phps-mode-lexer-RETURN_TOKEN 'T_STRING (match-beginning 0) (match-end 0)))
-
- ((looking-at phps-mode-lexer-TOKENS)
- (phps-mode-lexer-RETURN_TOKEN (match-string 0) (match-beginning 0)
(match-end 0)))
-
- ((looking-at phps-mode-lexer-ANY_CHAR)
- ;; Unexpected character
- ;; (message "Unexpected character '%s'" (buffer-substring-no-properties
(match-beginning 0) (match-end 0)))
- (phps-mode-lexer-RETURN_TOKEN 'T_ERROR (match-beginning 0) (point-max))
- (phps-mode-lexer-MOVE_FORWARD (point-max)))
-
- ))
-
-(define-lex-analyzer phps-mode-lexer-lex--ST_LOOKING_FOR_PROPERTY "
-{WHITESPACE}+
-->
-{LABEL}
-{ANY_CHAR}
-"
- (= phps-mode-lexer-STATE phps-mode-lexer-ST_LOOKING_FOR_PROPERTY)
-
- (cond
-
- ((looking-at phps-mode-lexer-WHITESPACE)
- (let* ((start (match-beginning 0))
- (end (match-end 0))
- (_data (buffer-substring-no-properties start end)))
- (if phps-mode-lexer-PARSER_MODE
- (phps-mode-lexer-MOVE_FORWARD end)
- (phps-mode-lexer-RETURN_TOKEN 'T_WHITESPACE start end))))
-
- ((looking-at "->")
- (phps-mode-lexer-RETURN_TOKEN 'T_OBJECT_OPERATOR (match-beginning 0)
(match-end 0)))
-
- ((looking-at phps-mode-lexer-LABEL)
- (let ((start (match-beginning 0))
- (end (match-end 0)))
- (phps-mode-lexer-yy_pop_state)
- (phps-mode-lexer-RETURN_TOKEN 'T_STRING start end)))
-
- ((looking-at phps-mode-lexer-ANY_CHAR)
- (let ((_start (match-beginning 0))
- (end (match-end 0)))
- (phps-mode-lexer-yy_pop_state)
- ;; TODO goto restart here?
- ;; (message "Restart here")
- (phps-mode-lexer-MOVE_FORWARD end)))
-
- ))
-
-(define-lex-analyzer phps-mode-lexer-lex--ST_DOUBLE_QUOTES "
-<ST_DOUBLE_QUOTES>
-\"${\"
-\"$\"{LABEL}\"->\"[a-zA-Z_\x80-\xff]
-\"$\"{LABEL}\"[\"
-\"$\"{LABEL}
-\"{$\"
-[\"]
-{ANY_CHAR}
-"
- (= phps-mode-lexer-STATE phps-mode-lexer-ST_DOUBLE_QUOTES)
- (cond
-
- ((looking-at "\\${")
- (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_LOOKING_FOR_VARNAME)
- (phps-mode-lexer-RETURN_TOKEN 'T_DOLLAR_OPEN_CURLY_BRACES (match-beginning
0) (match-end 0)))
-
- ((looking-at (concat "\\$" phps-mode-lexer-LABEL "->" "[a-zA-Z_\x80-\xff]"))
- (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_LOOKING_FOR_PROPERTY)
- (forward-char -3)
- (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (-
(match-end 0) 3)))
-
- ((looking-at (concat "\\$" phps-mode-lexer-LABEL "\\["))
- (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_VAR_OFFSET)
- (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (match-end
0)))
-
- ((looking-at (concat "\\$" phps-mode-lexer-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (match-end
0)))
-
- ((looking-at "{\\$")
- (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_IN_SCRIPTING)
- ;; (message "Starting ST_IN_SCRIPTING from double-quoted string at %s-%s"
(match-beginning 0) (- (match-end 0) 1))
- (phps-mode-lexer-RETURN_TOKEN 'T_CURLY_OPEN (match-beginning 0) (-
(match-end 0) 1)))
-
- ((looking-at "[\"]")
- (phps-mode-lexer-BEGIN phps-mode-lexer-ST_IN_SCRIPTING)
- ;; (message "Ended double-quote at %s" (match-beginning 0))
- (phps-mode-lexer-RETURN_TOKEN "\"" (match-beginning 0) (match-end 0)))
-
- ((looking-at phps-mode-lexer-ANY_CHAR)
- (let ((start (point)))
- (let ((string-start (search-forward-regexp "[^\\\\]\"" nil t)))
- (if string-start
- (let* ((end (- (match-end 0) 1))
- (double-quoted-string (buffer-substring-no-properties start
end)))
- ;; Do we find variable inside quote?
- (if (or (string-match (concat "\\${" phps-mode-lexer-LABEL)
double-quoted-string)
- (string-match (concat "{\\$" phps-mode-lexer-LABEL)
double-quoted-string)
- (string-match (concat "\\$" phps-mode-lexer-LABEL)
double-quoted-string))
- (progn
- (let ((variable-start (+ start (match-beginning 0))))
-
- ;; (message "Found starting expression inside
double-quoted string at: %s %s" start variable-start)
- (phps-mode-lexer-RETURN_TOKEN
'T_CONSTANT_ENCAPSED_STRING start variable-start)
- ))
+ ;; TODO Handle expecting values here
+ ;; (message "Found comment 2 from %s to %s" start
(line-end-position))
+ (phps-mode-lexer-RETURN_TOKEN 'T_COMMENT start
(line-end-position))
+ ))))
+
+ ((looking-at (concat "/\\*\\*" phps-mode-lexer-WHITESPACE))
+ (let* ((start (match-beginning 0))
+ (end (match-end 0))
+ (_data (buffer-substring-no-properties start end)))
+ (let ((string-start (search-forward "*/" nil t))
+ position)
+ (if string-start
+ (setq position string-start)
+ (progn
+ (setq position (point-max))
+ (phps-mode-lexer-MOVE_FORWARD (point-max))))
+ (phps-mode-lexer-RETURN_TOKEN 'T_DOC_COMMENT start position)
+ )))
+
+ ((looking-at "/\\*")
+ (let* ((start (match-beginning 0))
+ (end (match-end 0))
+ (_data (buffer-substring-no-properties start end)))
+ (let ((string-start (search-forward "*/" nil t))
+ position)
+ (if string-start
+ (setq position string-start)
+ (progn
+ (setq position (point-max))
+ (phps-mode-lexer-MOVE_FORWARD (point-max))))
+ (phps-mode-lexer-RETURN_TOKEN 'T_COMMENT start position)
+ )))
+
+ ((looking-at (concat "\\$" phps-mode-lexer-LABEL))
+ (let ((start (match-beginning 0))
+ (end (match-end 0)))
+ (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE start end)))
+
+ ((looking-at phps-mode-lexer-TOKENS)
+ (let* ((start (match-beginning 0))
+ (end (match-end 0))
+ (data (buffer-substring-no-properties start end))
+ (use-brace nil))
+ ;; (message "Found token '%s'" data)
+ (when phps-mode-lexer-declaring_namespace
+ (when (string= data ";")
+ (setq phps-mode-lexer-prepend_trailing_brace t)
+ ;; (message "Set flag prepend trailing brace")
+ ;; (setq use-brace t)
+ )
+ (setq phps-mode-lexer-declaring_namespace nil))
+ (if use-brace
+ (phps-mode-lexer-RETURN_TOKEN "{" start end)
+ (phps-mode-lexer-RETURN_TOKEN data start end))))
+
+ ((looking-at "'")
+ (let* ((start (match-beginning 0))
+ (end (match-end 0))
+ (_data (buffer-substring-no-properties start end))
+ (un-escaped-end (phps-mode-lexer--get-next-unescaped "'")))
+ (if un-escaped-end
+ (progn
+ ;; (message "Single quoted string %s"
(buffer-substring-no-properties start un-escaped-end))
+ (phps-mode-lexer-RETURN_TOKEN 'T_CONSTANT_ENCAPSED_STRING
start un-escaped-end))
+ (progn
+ ;; Unclosed single quotes
+ ;; (message "Single quoted string never ends..")
+ (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE start
(point-max))
+ (phps-mode-lexer-MOVE_FORWARD (point-max))))))
+
+ ;; Double quoted string
+ ((looking-at "\"")
+ (let* ((start (match-beginning 0))
+ (end (match-end 0))
+ (_data (buffer-substring-no-properties start end)))
+ (forward-char)
+ ;; Handle the "" case
+ (if (looking-at-p "\"")
+ (progn
+ ;; (message "Empty double quoted string from %s to %s" start
(+ start 2))
+ (phps-mode-lexer-RETURN_TOKEN 'T_CONSTANT_ENCAPSED_STRING
start (+ start 2))
+ (forward-char))
+ (let ((string-start (search-forward-regexp (concat
+ "\\([^\\\\]\""
+ "\\|\\$"
phps-mode-lexer-LABEL
+ "\\|\\${"
phps-mode-lexer-LABEL
+ "\\|{\\$"
phps-mode-lexer-LABEL "\\)")
+ nil t)))
+ ;; Do we find a ending double quote or starting variable?
+ (if string-start
+ (let ((string-start (match-beginning 0)))
+ ;; (message "Double quoted string %s" double-quoted-string)
+ ;; Do we find variable inside quote?
+ (goto-char string-start)
+ (if (looking-at "[^\\\\]\"")
+ (progn
+ (let ((_double-quoted-string
(buffer-substring-no-properties start (+ string-start 2))))
+ ;; (message "Double quoted string: %s"
_double-quoted-string)
+ (phps-mode-lexer-RETURN_TOKEN
'T_CONSTANT_ENCAPSED_STRING start (+ string-start 2))))
+ (progn
+ ;; (message "Found variable after '%s'"
(buffer-substring-no-properties start string-start))
+ (phps-mode-lexer-BEGIN
phps-mode-lexer-ST_DOUBLE_QUOTES)
+ (phps-mode-lexer-RETURN_TOKEN "\"" start (1+ start))
+ (phps-mode-lexer-RETURN_TOKEN
'T_ENCAPSED_AND_WHITESPACE (1+ start) string-start))))
(progn
- (phps-mode-lexer-RETURN_TOKEN 'T_CONSTANT_ENCAPSED_STRING
start end)
- ;; (message "Found end of quote at %s-%s, moving ahead after
'%s'" start end (buffer-substring-no-properties start end))
- )))
- (progn
- ;; "Found no end of double-quoted region
- (phps-mode-lexer-RETURN_TOKEN 'T_ERROR start (point-max))
- (phps-mode-lexer-MOVE_FORWARD (point-max)))))))
+ ;; (message "Found no ending quote, skipping to end")
+ (phps-mode-lexer-RETURN_TOKEN 'T_ERROR start (point-max))
+ (phps-mode-lexer-MOVE_FORWARD (point-max))))))))
+
+ ((looking-at "[`]")
+ ;; (message "Begun backquote at %s-%s" (match-beginning 0) (match-end
0))
+ (phps-mode-lexer-BEGIN phps-mode-lexer-ST_BACKQUOTE)
+ (phps-mode-lexer-RETURN_TOKEN "`" (match-beginning 0) (match-end 0)))
+
+ ((looking-at phps-mode-lexer-WHITESPACE)
+ (let* ((start (match-beginning 0))
+ (end (match-end 0))
+ (data (buffer-substring-no-properties start end)))
+ (if phps-mode-lexer-PARSER_MODE
+ (phps-mode-lexer-MOVE_FORWARD end)
+ (phps-mode-lexer-RETURN_TOKEN data start end))))
+
+ ((looking-at phps-mode-lexer-LABEL)
+ ;; (message "Adding T_STRING from %s to %s" (match-beginning 0)
(match-end 0))
+ (phps-mode-lexer-RETURN_TOKEN 'T_STRING (match-beginning 0) (match-end
0)))
+
+ ((looking-at phps-mode-lexer-TOKENS)
+ (phps-mode-lexer-RETURN_TOKEN (match-string 0) (match-beginning 0)
(match-end 0)))
+
+ ((looking-at phps-mode-lexer-ANY_CHAR)
+ ;; Unexpected character
+ ;; (message "Unexpected character '%s'"
(buffer-substring-no-properties (match-beginning 0) (match-end 0)))
+ (phps-mode-lexer-RETURN_TOKEN 'T_ERROR (match-beginning 0) (point-max))
+ (phps-mode-lexer-MOVE_FORWARD (point-max)))
+
+ ))
+
+ ;; ST_LOOKING_FOR_PROPERTY
+ ((= phps-mode-lexer-STATE phps-mode-lexer-ST_LOOKING_FOR_PROPERTY)
+
+ (cond
+
+ ((looking-at phps-mode-lexer-WHITESPACE)
+ (let* ((start (match-beginning 0))
+ (end (match-end 0))
+ (_data (buffer-substring-no-properties start end)))
+ (if phps-mode-lexer-PARSER_MODE
+ (phps-mode-lexer-MOVE_FORWARD end)
+ (phps-mode-lexer-RETURN_TOKEN 'T_WHITESPACE start end))))
+
+ ((looking-at "->")
+ (phps-mode-lexer-RETURN_TOKEN 'T_OBJECT_OPERATOR (match-beginning 0)
(match-end 0)))
+
+ ((looking-at phps-mode-lexer-LABEL)
+ (let ((start (match-beginning 0))
+ (end (match-end 0)))
+ (phps-mode-lexer-yy_pop_state)
+ (phps-mode-lexer-RETURN_TOKEN 'T_STRING start end)))
+
+ ((looking-at phps-mode-lexer-ANY_CHAR)
+ (let ((_start (match-beginning 0))
+ (end (match-end 0)))
+ (phps-mode-lexer-yy_pop_state)
+ ;; TODO goto restart here?
+ ;; (message "Restart here")
+ (phps-mode-lexer-MOVE_FORWARD end)))
+
+ ))
+
+ ;; ST_DOUBLE_QUOTES
+ ((= phps-mode-lexer-STATE phps-mode-lexer-ST_DOUBLE_QUOTES)
+ (cond
+
+ ((looking-at "\\${")
+ (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_LOOKING_FOR_VARNAME)
+ (phps-mode-lexer-RETURN_TOKEN 'T_DOLLAR_OPEN_CURLY_BRACES
(match-beginning 0) (match-end 0)))
+
+ ((looking-at (concat "\\$" phps-mode-lexer-LABEL "->"
"[a-zA-Z_\x80-\xff]"))
+ (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_LOOKING_FOR_PROPERTY)
+ (forward-char -3)
+ (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (-
(match-end 0) 3)))
+
+ ((looking-at (concat "\\$" phps-mode-lexer-LABEL "\\["))
+ (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_VAR_OFFSET)
+ (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0)
(match-end 0)))
+
+ ((looking-at (concat "\\$" phps-mode-lexer-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0)
(match-end 0)))
+
+ ((looking-at "{\\$")
+ (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_IN_SCRIPTING)
+ ;; (message "Starting ST_IN_SCRIPTING from double-quoted string at
%s-%s" (match-beginning 0) (- (match-end 0) 1))
+ (phps-mode-lexer-RETURN_TOKEN 'T_CURLY_OPEN (match-beginning 0) (-
(match-end 0) 1)))
+
+ ((looking-at "[\"]")
+ (phps-mode-lexer-BEGIN phps-mode-lexer-ST_IN_SCRIPTING)
+ ;; (message "Ended double-quote at %s" (match-beginning 0))
+ (phps-mode-lexer-RETURN_TOKEN "\"" (match-beginning 0) (match-end 0)))
- ))
+ ((looking-at phps-mode-lexer-ANY_CHAR)
+ (let ((start (point)))
+ (let ((string-start (search-forward-regexp "[^\\\\]\"" nil t)))
+ (if string-start
+ (let* ((end (- (match-end 0) 1))
+ (double-quoted-string (buffer-substring-no-properties
start end)))
+ ;; Do we find variable inside quote?
+ (if (or (string-match (concat "\\${" phps-mode-lexer-LABEL)
double-quoted-string)
+ (string-match (concat "{\\$" phps-mode-lexer-LABEL)
double-quoted-string)
+ (string-match (concat "\\$" phps-mode-lexer-LABEL)
double-quoted-string))
+ (progn
+ (let ((variable-start (+ start (match-beginning 0))))
+
+ ;; (message "Found starting expression inside
double-quoted string at: %s %s" start variable-start)
+ (phps-mode-lexer-RETURN_TOKEN
'T_CONSTANT_ENCAPSED_STRING start variable-start)
+ ))
+ (progn
+ (phps-mode-lexer-RETURN_TOKEN
'T_CONSTANT_ENCAPSED_STRING start end)
+ ;; (message "Found end of quote at %s-%s, moving ahead
after '%s'" start end (buffer-substring-no-properties start end))
+ )))
+ (progn
+ ;; "Found no end of double-quoted region
+ (phps-mode-lexer-RETURN_TOKEN 'T_ERROR start (point-max))
+ (phps-mode-lexer-MOVE_FORWARD (point-max)))))))
+
+ ))
-(define-lex-analyzer phps-mode-lexer-lex--ST_BACKQUOTE "
-\"{$\"
-\"$\"{LABEL}\"->\"[a-zA-Z_\x80-\xff]
-\"$\"{LABEL}\"[\"
-\"$\"{LABEL}
-{$
-`
-ANY_CHAR'
-"
- (= phps-mode-lexer-STATE phps-mode-lexer-ST_BACKQUOTE)
- (let ((old-start (point)))
+ ;; ST_BACKQUOTE
+ ((= phps-mode-lexer-STATE phps-mode-lexer-ST_BACKQUOTE)
+ (let ((old-start (point)))
(cond
((looking-at "\\${")
@@ -1104,188 +1063,188 @@ ANY_CHAR'
)))
-(define-lex-analyzer phps-mode-lexer-lex--ST_HEREDOC "
-\"{$\"
-\"$\"{LABEL}\"->\"[a-zA-Z_\x80-\xff]
-\"$\"{LABEL}\"[\"
-\"$\"{LABEL}
-{$
-`
-ANY_CHAR'
-"
- (= phps-mode-lexer-STATE phps-mode-lexer-ST_HEREDOC)
-
- (let ((heredoc_label (car phps-mode-lexer-heredoc_label_stack))
- (old-start (point)))
- (cond
-
- ((looking-at "\\${")
- (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_LOOKING_FOR_VARNAME)
- (phps-mode-lexer-RETURN_TOKEN 'T_DOLLAR_OPEN_CURLY_BRACES
(match-beginning 0) (match-end 0)))
-
- ((looking-at (concat "\\$" phps-mode-lexer-LABEL "->"
"[a-zA-Z_\x80-\xff]"))
- (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_LOOKING_FOR_PROPERTY)
- (forward-char -3)
- (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (-
(match-end 0) 3)))
-
- ((looking-at (concat "\\$" phps-mode-lexer-LABEL "\\["))
- (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_VAR_OFFSET)
- (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (match-end
0)))
-
- ((looking-at (concat "\\$" phps-mode-lexer-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (match-end
0)))
-
- ((looking-at (concat "{\\$"))
- (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_IN_SCRIPTING)
- (phps-mode-lexer-RETURN_TOKEN 'T_CURLY_OPEN (match-beginning 0) (-
(match-end 0) 1)))
-
- ((looking-at phps-mode-lexer-ANY_CHAR)
- ;; (message "Found nothing useful at '%s' looking at {$ %s"
(buffer-substring-no-properties (point) (point-max)) (looking-at "{\\$"))
- ;; Check for $, ${ and {$ forward
- (let ((string-start (search-forward-regexp (concat "\\(\n" heredoc_label
";?\n\\|\\$" phps-mode-lexer-LABEL "\\|{\\$" phps-mode-lexer-LABEL "\\|\\${"
phps-mode-lexer-LABEL "\\)") nil t)))
- (if string-start
- (let* ((start (match-beginning 0))
- (end (match-end 0))
- (data (buffer-substring-no-properties start end)))
- ;; (message "Found something ending at %s" data)
-
- (cond
-
- ((string-match (concat "\n" heredoc_label ";?\n") data)
+ ;; ST_HEREDOC
+ ((= phps-mode-lexer-STATE phps-mode-lexer-ST_HEREDOC)
+
+ (let ((heredoc_label (car phps-mode-lexer-heredoc_label_stack))
+ (old-start (point)))
+ (cond
+
+ ((looking-at "\\${")
+ (phps-mode-lexer-yy_push_state
phps-mode-lexer-ST_LOOKING_FOR_VARNAME)
+ (phps-mode-lexer-RETURN_TOKEN 'T_DOLLAR_OPEN_CURLY_BRACES
(match-beginning 0) (match-end 0)))
+
+ ((looking-at (concat "\\$" phps-mode-lexer-LABEL "->"
"[a-zA-Z_\x80-\xff]"))
+ (phps-mode-lexer-yy_push_state
phps-mode-lexer-ST_LOOKING_FOR_PROPERTY)
+ (forward-char -3)
+ (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (-
(match-end 0) 3)))
+
+ ((looking-at (concat "\\$" phps-mode-lexer-LABEL "\\["))
+ (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_VAR_OFFSET)
+ (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0)
(match-end 0)))
+
+ ((looking-at (concat "\\$" phps-mode-lexer-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0)
(match-end 0)))
+
+ ((looking-at (concat "{\\$"))
+ (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_IN_SCRIPTING)
+ (phps-mode-lexer-RETURN_TOKEN 'T_CURLY_OPEN (match-beginning 0) (-
(match-end 0) 1)))
+
+ ((looking-at phps-mode-lexer-ANY_CHAR)
+ ;; (message "Found nothing useful at '%s' looking at {$ %s"
(buffer-substring-no-properties (point) (point-max)) (looking-at "{\\$"))
+ ;; Check for $, ${ and {$ forward
+ (let ((string-start (search-forward-regexp (concat "\\(\n"
heredoc_label ";?\n\\|\\$" phps-mode-lexer-LABEL "\\|{\\$"
phps-mode-lexer-LABEL "\\|\\${" phps-mode-lexer-LABEL "\\)") nil t)))
+ (if string-start
+ (let* ((start (match-beginning 0))
+ (end (match-end 0))
+ (data (buffer-substring-no-properties start end)))
+ ;; (message "Found something ending at %s" data)
+
+ (cond
+
+ ((string-match (concat "\n" heredoc_label ";?\n") data)
;, (message "Found heredoc end at
%s-%s" start end)
- (phps-mode-lexer-BEGIN phps-mode-lexer-ST_END_HEREDOC)
- (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE
old-start start))
+ (phps-mode-lexer-BEGIN phps-mode-lexer-ST_END_HEREDOC)
+ (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE
old-start start))
- (t
- ;; (message "Found variable at '%s'.. Skipping forward to %s"
data start)
- (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE
old-start start)
- )
+ (t
+ ;; (message "Found variable at '%s'.. Skipping forward to
%s" data start)
+ (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE
old-start start)
+ )
- ))
- (progn
- ;; (message "Found no ending of heredoc at %s '%s'" heredoc_label
(buffer-substring-no-properties (point) (point-max)))
- (phps-mode-lexer-RETURN_TOKEN 'T_ERROR old-start (point-max))
- (phps-mode-lexer-MOVE_FORWARD (point-max))
- ))))
-
- )))
-
-(define-lex-analyzer phps-mode-lexer-lex--ST_NOWDOC "
-ANY_CHAR'
-"
- (= phps-mode-lexer-STATE phps-mode-lexer-ST_NOWDOC)
-
- (let ((heredoc_label (car phps-mode-lexer-heredoc_label_stack))
- (old-start (point)))
- (cond
-
- ((looking-at phps-mode-lexer-ANY_CHAR)
- (let ((string-start (search-forward-regexp (concat "\n" heredoc_label
";?\n") nil t)))
- (if string-start
- (let* ((start (match-beginning 0))
- (end (match-end 0))
- (_data (buffer-substring-no-properties start end)))
- ;; (message "Found something ending at %s" _data)
- ;; (message "Found nowdoc end at %s-%s" start end)
- (phps-mode-lexer-BEGIN phps-mode-lexer-ST_END_HEREDOC)
- (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE
old-start start)
- )
- (progn
- ;; (message "Found no ending of nowdoc at %s '%s'" heredoc_label
(buffer-substring-no-properties (point) (point-max)))
- (phps-mode-lexer-RETURN_TOKEN 'T_ERROR old-start (point-max))
- (phps-mode-lexer-MOVE_FORWARD (point-max))
- ))))
- )))
-
-(define-lex-analyzer phps-mode-lexer-lex--ST_LOOKING_FOR_VARNAME "
-{LABEL}[[}]
-{ANY_CHAR}"
- (= phps-mode-lexer-STATE phps-mode-lexer-ST_LOOKING_FOR_VARNAME)
- (cond
+ ))
+ (progn
+ ;; (message "Found no ending of heredoc at %s '%s'"
heredoc_label (buffer-substring-no-properties (point) (point-max)))
+ (phps-mode-lexer-RETURN_TOKEN 'T_ERROR old-start (point-max))
+ (phps-mode-lexer-MOVE_FORWARD (point-max))
+ ))))
- ((looking-at (concat phps-mode-lexer-LABEL "[\\[}]"))
- (let ((start (match-beginning 0))
- (end (- (match-end 0) 1)))
- ;; (message "Stopped here")
- (phps-mode-lexer-yy_pop_state)
- (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_IN_SCRIPTING)
- (phps-mode-lexer-RETURN_TOKEN 'T_STRING_VARNAME start end)))
+ )))
- ((looking-at phps-mode-lexer-ANY_CHAR)
- (phps-mode-lexer-yy_pop_state)
- (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_IN_SCRIPTING))
+ ;; ST_NOWDOC
+ ((= phps-mode-lexer-STATE phps-mode-lexer-ST_NOWDOC)
- ))
+ (let ((heredoc_label (car phps-mode-lexer-heredoc_label_stack))
+ (old-start (point)))
+ (cond
-(define-lex-analyzer phps-mode-lexer-lex--ST_END_HEREDOC "
-{ANY_CHAR}"
- (= phps-mode-lexer-STATE phps-mode-lexer-ST_END_HEREDOC)
- (let ((heredoc_label (car phps-mode-lexer-heredoc_label_stack)))
- (cond
+ ((looking-at phps-mode-lexer-ANY_CHAR)
+ (let ((string-start (search-forward-regexp (concat "\n"
heredoc_label ";?\n") nil t)))
+ (if string-start
+ (let* ((start (match-beginning 0))
+ (end (match-end 0))
+ (_data (buffer-substring-no-properties start end)))
+ ;; (message "Found something ending at %s" _data)
+ ;; (message "Found nowdoc end at %s-%s" start end)
+ (phps-mode-lexer-BEGIN phps-mode-lexer-ST_END_HEREDOC)
+ (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE
old-start start)
+ )
+ (progn
+ ;; (message "Found no ending of nowdoc at %s '%s'"
heredoc_label (buffer-substring-no-properties (point) (point-max)))
+ (phps-mode-lexer-RETURN_TOKEN 'T_ERROR old-start (point-max))
+ (phps-mode-lexer-MOVE_FORWARD (point-max))
+ ))))
+ )))
- ((looking-at (concat phps-mode-lexer-ANY_CHAR))
+ ;; ST_LOOKING_FOR_VARNAME
+ ((= phps-mode-lexer-STATE phps-mode-lexer-ST_LOOKING_FOR_VARNAME)
+ (cond
- (let* ((start (match-beginning 0))
- (end (+ start (length heredoc_label) 1))
- (_data (buffer-substring-no-properties start end)))
- ;; (message "Found ending heredoc at %s, %s of %s" _data
(thing-at-point 'line) heredoc_label)
- (pop phps-mode-lexer-heredoc_label_stack)
- (phps-mode-lexer-BEGIN phps-mode-lexer-ST_IN_SCRIPTING)
- (phps-mode-lexer-RETURN_TOKEN 'T_END_HEREDOC start end)
+ ((looking-at (concat phps-mode-lexer-LABEL "[\\[}]"))
+ (let ((start (match-beginning 0))
+ (end (- (match-end 0) 1)))
+ ;; (message "Stopped here")
+ (phps-mode-lexer-yy_pop_state)
+ (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_IN_SCRIPTING)
+ (phps-mode-lexer-RETURN_TOKEN 'T_STRING_VARNAME start end)))
- ))
+ ((looking-at phps-mode-lexer-ANY_CHAR)
+ (phps-mode-lexer-yy_pop_state)
+ (phps-mode-lexer-yy_push_state phps-mode-lexer-ST_IN_SCRIPTING))
- )))
+ ))
-(define-lex-analyzer phps-mode-lexer-lex--ST_VAR_OFFSET "
-[0]|([1-9][0-9]*)
-{LNUM}|{HNUM}|{BNUM}
-\"$\"{LABEL}
-]
-{TOKENS}|[{}\"`]
-[ \n\r\t\\'#]
-{LABEL}
-{ANY_CHAR}
-"
- (= phps-mode-lexer-STATE phps-mode-lexer-ST_VAR_OFFSET)
+ ;; ST_END_HEREDOC
+ ((= phps-mode-lexer-STATE phps-mode-lexer-ST_END_HEREDOC)
+ (let ((heredoc_label (car phps-mode-lexer-heredoc_label_stack)))
+ (cond
- (cond
+ ((looking-at (concat phps-mode-lexer-ANY_CHAR))
- ((looking-at (concat "\\("
- phps-mode-lexer-LNUM "\\|"
- phps-mode-lexer-HNUM "\\|"
- phps-mode-lexer-BNUM "\\)"))
- (phps-mode-lexer-RETURN_TOKEN 'T_NUM_STRING (match-beginning 0) (match-end
0)))
+ (let* ((start (match-beginning 0))
+ (end (+ start (length heredoc_label) 1))
+ (_data (buffer-substring-no-properties start end)))
+ ;; (message "Found ending heredoc at %s, %s of %s" _data
(thing-at-point 'line) heredoc_label)
+ (pop phps-mode-lexer-heredoc_label_stack)
+ (phps-mode-lexer-BEGIN phps-mode-lexer-ST_IN_SCRIPTING)
+ (phps-mode-lexer-RETURN_TOKEN 'T_END_HEREDOC start end)
- ((looking-at (concat "\\$" phps-mode-lexer-LABEL))
- (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0) (match-end
0)))
+ ))
- ((looking-at "\\]")
- (phps-mode-lexer-yy_pop_state)
- (phps-mode-lexer-RETURN_TOKEN "]" (match-beginning 0) (match-end 0)))
+ )))
- ((looking-at (concat "\\(" phps-mode-lexer-TOKENS
- "\\|[{}\"`]\\)"))
- (let* ((start (match-beginning 0))
- (end (match-end 0))
- (data (buffer-substring-no-properties start end)))
- (phps-mode-lexer-RETURN_TOKEN data start end)))
+ ;; ST_VAR_OFFSET
+ ((= phps-mode-lexer-STATE phps-mode-lexer-ST_VAR_OFFSET)
- ((looking-at (concat "[ \n\r\t'#]"))
- (let* ((start (match-beginning 0))
- (end (- (match-end 0) 1)))
- (phps-mode-lexer-yy_pop_state)
- (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE start end)))
+ (cond
- ((looking-at phps-mode-lexer-LABEL)
- (phps-mode-lexer-RETURN_TOKEN 'T_STRING (match-beginning 0) (match-end 0)))
+ ((looking-at (concat "\\("
+ phps-mode-lexer-LNUM "\\|"
+ phps-mode-lexer-HNUM "\\|"
+ phps-mode-lexer-BNUM "\\)"))
+ (phps-mode-lexer-RETURN_TOKEN 'T_NUM_STRING (match-beginning 0)
(match-end 0)))
- ((looking-at phps-mode-lexer-ANY_CHAR)
- ;; Unexpected character
- (phps-mode-lexer-RETURN_TOKEN 'T_ERROR (match-beginning 0) (point-max))
- (phps-mode-lexer-MOVE_FORWARD (point-max)))
+ ((looking-at (concat "\\$" phps-mode-lexer-LABEL))
+ (phps-mode-lexer-RETURN_TOKEN 'T_VARIABLE (match-beginning 0)
(match-end 0)))
- ))
+ ((looking-at "\\]")
+ (phps-mode-lexer-yy_pop_state)
+ (phps-mode-lexer-RETURN_TOKEN "]" (match-beginning 0) (match-end 0)))
+
+ ((looking-at (concat "\\(" phps-mode-lexer-TOKENS
+ "\\|[{}\"`]\\)"))
+ (let* ((start (match-beginning 0))
+ (end (match-end 0))
+ (data (buffer-substring-no-properties start end)))
+ (phps-mode-lexer-RETURN_TOKEN data start end)))
+
+ ((looking-at (concat "[ \n\r\t'#]"))
+ (let* ((start (match-beginning 0))
+ (end (- (match-end 0) 1)))
+ (phps-mode-lexer-yy_pop_state)
+ (phps-mode-lexer-RETURN_TOKEN 'T_ENCAPSED_AND_WHITESPACE start end)))
+
+ ((looking-at phps-mode-lexer-LABEL)
+ (phps-mode-lexer-RETURN_TOKEN 'T_STRING (match-beginning 0) (match-end
0)))
+
+ ((looking-at phps-mode-lexer-ANY_CHAR)
+ ;; Unexpected character
+ (phps-mode-lexer-RETURN_TOKEN 'T_ERROR (match-beginning 0) (point-max))
+ (phps-mode-lexer-MOVE_FORWARD (point-max)))
+
+ ))))
+
+(defun phps-mode-lexer-get-tokens ()
+ "Get tokens."
+ phps-mode-lexer-tokens)
+
+(defun phps-mode-lexer--get-next-unescaped (character)
+ "Find where next un-escaped CHARACTER comes, if none is found return nil."
+ ;; (message "phps-mode-lexer--get-next-unescaped(%s)" character)
+ (let ((escaped nil)
+ (pos nil))
+ (while (and (not pos)
+ (< (point) (point-max)))
+ (progn
+ ;; (message "Setting forward one %s vs %s" (point) (point-max))
+ (forward-char)
+ (if (and (not escaped)
+ (looking-at-p character))
+ (setq pos (1+ (point)))
+ (if (looking-at-p "\\\\")
+ (setq escaped (not escaped))
+ (setq escaped nil)))))
+ pos))
(defun phps-mode-lexer-setup (start end)
"Just prepare other lexers for lexing region START to END."
@@ -1418,27 +1377,16 @@ ANY_CHAR'
(phps-mode-lexer-run)))
(phps-mode-functions-reset-buffer-changes-start)))
-(define-lex phps-mode-lexer-tags-lexer
- "Lexer that handles PHP buffers."
-
- phps-mode-lexer-lex--INITIAL
- phps-mode-lexer-lex--ST_IN_SCRIPTING
- phps-mode-lexer-lex--ST_LOOKING_FOR_PROPERTY
- phps-mode-lexer-lex--ST_DOUBLE_QUOTES
- phps-mode-lexer-lex--ST_BACKQUOTE
- phps-mode-lexer-lex--ST_HEREDOC
- phps-mode-lexer-lex--ST_NOWDOC
- phps-mode-lexer-lex--ST_LOOKING_FOR_VARNAME
- phps-mode-lexer-lex--ST_END_HEREDOC
- phps-mode-lexer-lex--ST_VAR_OFFSET
-
+(define-lex phps-mode-lexer-lex
+ "Call lexer analyzer action."
+ phps-mode-lexer-lex-analyzer
semantic-lex-default-action)
(defun phps-mode-lexer-init ()
"Initialize lexer."
(when (boundp 'phps-mode-syntax-table)
(setq semantic-lex-syntax-table phps-mode-syntax-table))
- (setq semantic-lex-analyzer #'phps-mode-lexer-tags-lexer)
+ (setq semantic-lex-analyzer #'phps-mode-lexer-lex)
(add-hook 'semantic-lex-reset-functions #'phps-mode-lexer-setup)
(phps-mode-lexer-run))
- [elpa] externals/phps-mode 40bffbc 265/405: Added syntax coloring for [ )( ,, (continued)
- [elpa] externals/phps-mode 40bffbc 265/405: Added syntax coloring for [ )( ,, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode 9deb882 266/405: Added syntax coloring for ? ! < > :, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode 969a4d1 278/405: Fixed syntax for coalesce assignment operator, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode bd08a00 277/405: Added unit test for COALESCING EQUAL token, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode a49ce7d 272/405: Added TODO item for lexer to better match re2c, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode 552eada 264/405: Tuning of incremental logic, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode 6cb1d5a 261/405: Added T_INLINE_HTML lexer token, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode d6caab9 269/405: Added support for coalesce_equal token and made lexer structure more similar to re2c, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode d51a2c4 276/405: Lexer grammar used same logic as PHP language scanner, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode 1e3537c 268/405: Re-factored lexer to be more similar to re2c, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode 9748853 267/405: Merged all lexer analysis into one to better match re2c lexer,
Stefan Monnier <=
- [elpa] externals/phps-mode bfeaa74 273/405: Started with changing lexer syntax to be more alike re2c, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode 73b8b4d 297/405: More work on concatenation and assignment indent, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode 81c7179 293/405: Fixed indentation bug with assignment of square array in function argument, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode 419a812 298/405: More work on debugging indentation with assignment, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode ed36115 288/405: Added TODO item for indentation, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode 52cfc78 281/405: Added failing indent test, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode 46147f4 287/405: Fixed bug with undefined token-end-line-number in new buffers, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode 66edaca 286/405: Improved lexing of comment version doc comment, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode 55f61b0 296/405: New algorithm for concatenation indentation passes tests, Stefan Monnier, 2019/07/13
- [elpa] externals/phps-mode 9069d0a 300/405: Concatenation indentation now uses stack, Stefan Monnier, 2019/07/13