branch: externals/phps-mode commit ea4178f999f366e5c3ce1d5b8a414ce53cf5842f Author: Christian Johansson <christ...@cvj.se> Commit: Christian Johansson <christ...@cvj.se>
Made lexer rules easier to maintain --- phps-mode-lexer.el | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/phps-mode-lexer.el b/phps-mode-lexer.el index 8016837b31..a1ff3ce78b 100644 --- a/phps-mode-lexer.el +++ b/phps-mode-lexer.el @@ -9,14 +9,9 @@ ;; any higher order meta-lexer logic goes into `phps-mode-lex-analyzer.el'. ;; ;; Features: -;; * Defines the lexer for this grammar based on the Zend PHP 8.1 Lexer at -;; https://raw.githubusercontent.com/php/php-src/PHP-8.1/Zend/zend_language_scanner.l +;; * Defines the lexer for this grammar based on the Zend PHP 8.2 Lexer at +;; https://raw.githubusercontent.com/php/php-src/PHP-8.2/Zend/zend_language_scanner.l ;; which is using re2c. -;; -;; Instructions on how to generate new lexer rules -;; 1. Make edits in lexer rules in function `phps-mode-lexer--generate-lexer-rules' -;; 2. Run `eval-buffer' and then `phps-mode-lexer--generate-lexer-rules' -;; 3. Update inline value of `phps-mode-lexer--lambdas-by-state' by running code "(insert (format "%S" phps-mode-lexer--lambdas-by-state))" ;;; Code: @@ -121,12 +116,7 @@ ;; VARIABLES -(defvar phps-mode-lexer--lambdas-by-state #s(hash-table size 65 test equal rehash-size 1.5 rehash-threshold 0.8125 data (ST_IN_SCRIPTING (((lambda nil (looking-at "exit")) (lambda nil (phps-mode-lexer--return-token-with-indent 'T_EXIT))) ((lambda nil (looking-at "die")) (lambda nil (phps-mode-lexer--return-token-with-indent 'T_EXIT))) ((lambda nil (looking-at "fn")) (lambda nil (phps-mode-lexer--return-token-with-indent 'T_FN))) ((lambda nil (looking-at "function")) (lambda nil (phps-mod [...] -]*" "\\(\\$\\|\\.\\.\\.\\)"))) (lambda nil (phps-mode-lexer--yyless 1) (phps-mode-lexer--return-token 'T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG (match-beginning 0) (- (match-end 0) 1)))) ((lambda nil (looking-at "&")) (lambda nil (phps-mode-lexer--return-token 'T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG))) ((lambda nil (looking-at (concat "\\(" "]" "\\|" ")" "\\)"))) (lambda nil (phps-mode-lexer--return-exit-nesting-token))) ((lambda nil (looking-at (concat "\\(" "\\[" "\\|" "(" "\\)"))) (la [...] -[ ]*\\(" phps-mode-lexer--heredoc-label "\\)\\|\\$" 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 (match-string 0))) (cond ((string-match-p (concat " -[ ]*" phps-mode-lexer--heredoc-label) data) (setq start (match-beginning 2)) (setq end (match-beginning 2)) (phps-mode-lexer--return-token-with-val 'T_ENCAPSED_AND_WHITESPACE old-end start) (phps-mode-lexer--begin 'ST_END_HEREDOC)) (t (phps-mode-lexer--return-token-with-val 'T_ENCAPSED_AND_WHITESPACE old-end start)))) (progn (signal 'phps-lexer-error (list (format "Found no ending of heredoc starting at %d" old-start) old-start))))))))) ST_LOOKING_FOR_VARNAME (((lambda nil (looking-at ( [...] - '#]"))) (lambda nil (phps-mode-lexer--yyless 0) (phps-mode-lexer--yy-pop-state) (phps-mode-lexer--return-token-with-val 'T_ENCAPSED_AND_WHITESPACE))) ((lambda nil (looking-at phps-mode-lexer--label)) (lambda nil (phps-mode-lexer--return-token-with-str 'T_STRING 0))) ((lambda nil (looking-at phps-mode-lexer--any-char)) (lambda nil (signal 'phps-lexer-error (list (format "Unexpected character at %d" (match-beginning 0)) (match-beginning 0)))))) quote (((lambda nil (looking-at (concat "#!.* [...] -[ ]*\\(" phps-mode-lexer--heredoc-label "\\)") nil t))) (if string-start (let* ((start (match-beginning 1)) (end (match-end 1)) (_data (buffer-substring-no-properties start end))) (phps-mode-lexer--return-token-with-val 'T_ENCAPSED_AND_WHITESPACE phps-mode-lexer--generated-new-tokens-index start) (phps-mode-lexer--begin 'ST_END_HEREDOC)) (progn (signal 'phps-lexer-error (list (format "Found no ending of nowdoc starting at %d" start) start))))))))))) +(defvar phps-mode-lexer--lambdas-by-state nil "Hash-table of lex-analyzer rules organized by state.") (defvar-local phps-mode-lexer--generated-tokens nil @@ -478,10 +468,8 @@ ;; Setup lexer rules -(defun phps-mode-lexer--generate-lexer-rules () - "Generate lexer rules." - (eval-when-compile - (setq phps-mode-lexer--lambdas-by-state (make-hash-table :test 'equal))) +(eval-when-compile + (setq phps-mode-lexer--lambdas-by-state (make-hash-table :test 'equal)) (phps-mode-lexer--match-macro ST_IN_SCRIPTING