[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/phps-mode 620ec6e 91/96: Optimization of parser speed
From: |
Christian Johansson |
Subject: |
[elpa] externals/phps-mode 620ec6e 91/96: Optimization of parser speed |
Date: |
Fri, 29 Oct 2021 11:15:06 -0400 (EDT) |
branch: externals/phps-mode
commit 620ec6eaeaa8bba8af0bd0a00e208d3c60f1f8fc
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>
Optimization of parser speed
---
phps-mode-automation-grammar.el | 126 +++++-----------------------------------
phps-mode-lex-analyzer.el | 53 ++++++++++++++++-
phps-mode-parser.el | 125 +++++----------------------------------
test/phps-mode-test-parser.el | 6 +-
4 files changed, 83 insertions(+), 227 deletions(-)
diff --git a/phps-mode-automation-grammar.el b/phps-mode-automation-grammar.el
index 4a390b0..5b2a7a4 100644
--- a/phps-mode-automation-grammar.el
+++ b/phps-mode-automation-grammar.el
@@ -25,10 +25,6 @@
;; Just to stop linter from complaining
-(defvar
- phps-mode-parser-position
- nil
- "Position of parser.")
(defvar
phps-mode-parser-tokens
@@ -52,7 +48,7 @@
(defvar
phps-mode-automation-grammar--header
- "\n\n(defvar-local\n phps-mode-parser-position\n nil\n \"Position of
parser.\")\n\n(defvar-local\n phps-mode-parser-tokens\n nil\n \"Tokens for
parser.\")\n\n(define-error\n 'phps-parser-error\n \"PHPs Lexer Error\")\n\n"
+ "\n\n(defvar-local\n phps-mode-parser-tokens\n nil\n \"Tokens for
parser.\")\n\n(define-error\n 'phps-parser-error\n \"PHPs Parser Error\")\n\n"
"Header contents for parser.")
(defvar
@@ -68,118 +64,26 @@
(defvar
phps-mode-automation-grammar--lex-analyzer-function
(lambda (buffer-index)
- (let ((token-list-index))
- (if (and
- phps-mode-parser-position
- (= (car (car phps-mode-parser-position)) buffer-index))
- (progn
- (setq
- token-list-index
- (car (cdr (car phps-mode-parser-position)))))
-
- ;; Search from last requested index and forward until
- ;; we find a token starting at or after buffer-index and
- ;; use this as buffer-index, save buffer-index to
- ;; token-list-index connection
- (let ((previous-token-list-index 0))
- (when (and
- phps-mode-parser-position
- (< (car (car phps-mode-parser-position)) buffer-index))
- (setq
- previous-token-list-index
- (car (cdr (car phps-mode-parser-position)))))
-
- (let ((temp-token-list-index
- previous-token-list-index)
- (token-list-size
- (length
- phps-mode-parser-tokens))
- (continue t))
- (while (and
- continue
- (<
- temp-token-list-index
- token-list-size))
- (let ((token
- (nth
- temp-token-list-index
- phps-mode-parser-tokens)))
-
- ;; When token starts at cursor we found correct index
- ;; Save it
- (when (= (car (cdr token)) buffer-index)
- (let ((token-type (car token)))
- (push
- (list
- buffer-index
- temp-token-list-index)
- phps-mode-parser-position)
- (unless (or
- (equal token-type 'T_OPEN_TAG)
- (equal token-type 'T_CLOSE_TAG)
- (equal token-type 'T_DOC_COMMENT)
- (equal token-type 'T_COMMENT))
- (setq
- token-list-index
- temp-token-list-index)
- (setq
- continue
- nil))))
-
- ;; When token starts after cursor, flag move of cursor
- ;; Save it
- (when (> (car (cdr token)) buffer-index)
- (let ((token-type (car token)))
- (push
- (list
- (car (cdr token))
- temp-token-list-index)
- phps-mode-parser-position)
-
- ;; Compatibility with parser
- (unless (or
- (equal token-type 'T_OPEN_TAG)
- (equal token-type 'T_DOC_COMMENT)
- (equal token-type 'T_COMMENT))
- (setq-local
- phps-mode-parser-lex-analyzer--move-to-index-flag
- (car (cdr token)))
- (setq
- continue
- nil))))
-
- (setq
- temp-token-list-index
- (1+ temp-token-list-index))
- )))))
- (when
- token-list-index
- (let ((token
- (nth
- token-list-index
- phps-mode-parser-tokens)))
-
- ;; Compatibility with parser
- (when (equal (car token) 'T_OPEN_TAG_WITH_ECHO)
- (setq
- token
- `(T_ECHO ,(car (cdr token)) . ,(cdr (cdr token)))))
- (when (equal (car token) 'T_CLOSE_TAG)
- (setq
- token
- `(";" ,(car (cdr token)) . ,(cdr (cdr token)))))
-
- token))))
+ (let ((result (gethash buffer-index phps-mode-parser-tokens))
+ (token))
+ (when result
+ (cond
+ ((numberp result)
+ (setq
+ phps-mode-parser-lex-analyzer--move-to-index-flag
+ result))
+ ((listp result)
+ (setq
+ token
+ result))))
+ token))
"The custom lex-analyzer.")
(defvar
phps-mode-automation-grammar--lex-analyzer-reset-function
(lambda()
(progn
- ;; Reset buffer-index to token-list-index connections
- (setq-local
- phps-mode-parser-position
- nil)))
+ ))
"The reset function.")
(defvar
diff --git a/phps-mode-lex-analyzer.el b/phps-mode-lex-analyzer.el
index ae707d8..7c68a4d 100644
--- a/phps-mode-lex-analyzer.el
+++ b/phps-mode-lex-analyzer.el
@@ -3196,6 +3196,50 @@ SQUARE-BRACKET-LEVEL and ROUND-BRACKET-LEVEL."
(unless phps-mode-lex-analyzer--state
(setq phps-mode-lex-analyzer--state 'ST_INITIAL)))
+(defun phps-mode-lex-analyzer--generate-parser-tokens (lexer-tokens)
+ "Generate parser-tokens from LEXER-TOKENS which are in reversed order."
+ (let ((parser-tokens (make-hash-table :test 'equal))
+ (previous-start))
+ (dolist (token lexer-tokens)
+ (let ((token-type (car token))
+ (token-start (car (cdr token)))
+ (token-end (cdr (cdr token))))
+ (if (or
+ (equal token-type 'T_OPEN_TAG)
+ (equal token-type 'T_DOC_COMMENT)
+ (equal token-type 'T_COMMENT))
+ (when previous-start
+ (puthash
+ token-start
+ previous-start
+ parser-tokens))
+ (cond
+ ((equal token-type 'T_CLOSE_TAG)
+ (setq
+ token
+ `(";" ,token-start . ,token-end)))
+ ((equal token-type 'T_OPEN_TAG_WITH_ECHO)
+ (setq
+ token
+ `(T_ECHO ,token-start . ,token-end))))
+ (puthash
+ token-start
+ token
+ parser-tokens))
+
+ (when (and
+ previous-start
+ (not
+ (= previous-start token-end)))
+ (puthash
+ token-end
+ previous-start
+ parser-tokens))
+ (setq
+ previous-start
+ token-start)))
+ parser-tokens))
+
(defun phps-mode-lex-analyzer--lex-string (contents &optional start end states
state state-stack heredoc-label heredoc-label-stack nest-location-stack tokens)
"Run lexer on CONTENTS."
;; Create a separate buffer, run lexer inside of it, catch errors and return
them
@@ -3261,15 +3305,18 @@ SQUARE-BRACKET-LEVEL and ROUND-BRACKET-LEVEL."
(setq state phps-mode-lexer--state)
(setq state-stack phps-mode-lexer--state-stack)
(setq states phps-mode-lexer--states)
+
+ ;; NOTE Generate parser tokens here before nreverse destructs list
+ (setq
+ phps-mode-parser-tokens
+ (phps-mode-lex-analyzer--generate-parser-tokens
+ phps-mode-lexer--generated-tokens))
(setq tokens (nreverse phps-mode-lexer--generated-tokens))
(setq heredoc-label phps-mode-lexer--heredoc-label)
(setq heredoc-label-stack phps-mode-lexer--heredoc-label-stack)
(setq nest-location-stack phps-mode-lexer--nest-location-stack)
;; Error-free parse here
- (setq
- phps-mode-parser-tokens
- tokens)
(condition-case conditions
(progn
(setq
diff --git a/phps-mode-parser.el b/phps-mode-parser.el
index 09b976e..e914eeb 100644
--- a/phps-mode-parser.el
+++ b/phps-mode-parser.el
@@ -8,18 +8,13 @@
(defvar-local
- phps-mode-parser-position
- nil
- "Position of parser.")
-
-(defvar-local
phps-mode-parser-tokens
nil
"Tokens for parser.")
(define-error
'phps-parser-error
- "PHPs Lexer Error")
+ "PHPs Parser Error")
;;; Constants:
@@ -111,118 +106,26 @@
(defvar
phps-mode-parser-lex-analyzer--function
(lambda (buffer-index)
- (let ((token-list-index))
- (if (and
- phps-mode-parser-position
- (= (car (car phps-mode-parser-position)) buffer-index))
- (progn
- (setq
- token-list-index
- (car (cdr (car phps-mode-parser-position)))))
-
- ;; Search from last requested index and forward until
- ;; we find a token starting at or after buffer-index and
- ;; use this as buffer-index, save buffer-index to
- ;; token-list-index connection
- (let ((previous-token-list-index 0))
- (when (and
- phps-mode-parser-position
- (< (car (car phps-mode-parser-position)) buffer-index))
- (setq
- previous-token-list-index
- (car (cdr (car phps-mode-parser-position)))))
-
- (let ((temp-token-list-index
- previous-token-list-index)
- (token-list-size
- (length
- phps-mode-parser-tokens))
- (continue t))
- (while (and
- continue
- (<
- temp-token-list-index
- token-list-size))
- (let ((token
- (nth
- temp-token-list-index
- phps-mode-parser-tokens)))
-
- ;; When token starts at cursor we found correct index
- ;; Save it
- (when (= (car (cdr token)) buffer-index)
- (let ((token-type (car token)))
- (push
- (list
- buffer-index
- temp-token-list-index)
- phps-mode-parser-position)
- (unless (or
- (equal token-type 'T_OPEN_TAG)
- (equal token-type 'T_CLOSE_TAG)
- (equal token-type 'T_DOC_COMMENT)
- (equal token-type 'T_COMMENT))
- (setq
- token-list-index
- temp-token-list-index)
- (setq
- continue
- nil))))
-
- ;; When token starts after cursor, flag move of cursor
- ;; Save it
- (when (> (car (cdr token)) buffer-index)
- (let ((token-type (car token)))
- (push
- (list
- (car (cdr token))
- temp-token-list-index)
- phps-mode-parser-position)
-
- ;; Compatibility with parser
- (unless (or
- (equal token-type 'T_OPEN_TAG)
- (equal token-type 'T_DOC_COMMENT)
- (equal token-type 'T_COMMENT))
- (setq-local
- phps-mode-parser-lex-analyzer--move-to-index-flag
- (car (cdr token)))
- (setq
- continue
- nil))))
-
- (setq
- temp-token-list-index
- (1+ temp-token-list-index))
- )))))
- (when
- token-list-index
- (let ((token
- (nth
- token-list-index
- phps-mode-parser-tokens)))
-
- ;; Compatibility with parser
- (when (equal (car token) 'T_OPEN_TAG_WITH_ECHO)
- (setq
- token
- `(T_ECHO ,(car (cdr token)) . ,(cdr (cdr token)))))
- (when (equal (car token) 'T_CLOSE_TAG)
+ (let ((result (gethash buffer-index phps-mode-parser-tokens))
+ (token))
+ (when result
+ (cond
+ ((numberp result)
(setq
- token
- `(";" ,(car (cdr token)) . ,(cdr (cdr token)))))
-
- token))))
+ phps-mode-parser-lex-analyzer--move-to-index-flag
+ result))
+ ((listp result)
+ (setq
+ token
+ result))))
+ token))
"The lex-analyzer function.")
(defvar
phps-mode-parser-lex-analyzer--reset-function
(lambda()
(progn
- ;; Reset buffer-index to token-list-index connections
- (setq-local
- phps-mode-parser-position
- nil)))
+ ))
"The lex-analyzer reset function.")
diff --git a/test/phps-mode-test-parser.el b/test/phps-mode-test-parser.el
index a852a63..ca3f951 100644
--- a/test/phps-mode-test-parser.el
+++ b/test/phps-mode-test-parser.el
@@ -72,8 +72,10 @@
(semantic-lex-buffer)
(setq
phps-mode-parser-tokens
- (reverse phps-mode-lexer--generated-tokens))
- (message "Lexer tokens:\n%S\n" phps-mode-parser-tokens)
+ (phps-mode-lex-analyzer--generate-parser-tokens
+ phps-mode-lexer--generated-tokens))
+ (message "Lexer tokens:\n%S\n" phps-mode-lexer--generated-tokens)
+ (message "Parser tokens:\n%S\n" phps-mode-parser-tokens)
;; Run test
(funcall logic)
- [elpa] externals/phps-mode 50c9b31 84/96: Added 2 TODO items, (continued)
- [elpa] externals/phps-mode 50c9b31 84/96: Added 2 TODO items, Christian Johansson, 2021/10/29
- [elpa] externals/phps-mode c9f6fdb 82/96: Mode-line status now signals parser errors, Christian Johansson, 2021/10/29
- [elpa] externals/phps-mode e007ea7 88/96: Fixed parser-mode issue with parser and lex-analyzer integration, Christian Johansson, 2021/10/29
- [elpa] externals/phps-mode bc8306f 71/96: Fix in automation grammar to support exporting, Christian Johansson, 2021/10/29
- [elpa] externals/phps-mode 238f967 76/96: Cleaned up lex function, Christian Johansson, 2021/10/29
- [elpa] externals/phps-mode 5e375e3 80/96: Parser is not blocking lexer anymore, Christian Johansson, 2021/10/29
- [elpa] externals/phps-mode 7b62779 86/96: Added another TODO item, Christian Johansson, 2021/10/29
- [elpa] externals/phps-mode c5058c5 87/96: Fixed issue with async.el support for parser, Christian Johansson, 2021/10/29
- [elpa] externals/phps-mode 8e263fe 85/96: Removed T_DIE as token as it's replaced by T_EXIT, Christian Johansson, 2021/10/29
- [elpa] externals/phps-mode 3489f9d 90/96: Parser parse function now ignores creating a SDT, Christian Johansson, 2021/10/29
- [elpa] externals/phps-mode 620ec6e 91/96: Optimization of parser speed,
Christian Johansson <=
- [elpa] externals/phps-mode ff25e3d 92/96: Removed obsolete files, Christian Johansson, 2021/10/29
- [elpa] externals/phps-mode aa691a8 89/96: Added parser and lexer integraction-fix to automation, Christian Johansson, 2021/10/29
- [elpa] externals/phps-mode daba241 93/96: Added another TODO item, Christian Johansson, 2021/10/29
- [elpa] externals/phps-mode 95479f9 94/96: Updates of documentation, Christian Johansson, 2021/10/29
- [elpa] externals/phps-mode efeaadd 96/96: Updated version and description, Christian Johansson, 2021/10/29
- [elpa] externals/phps-mode fd604c1 95/96: Added garbage collection modification to grammar automation again, Christian Johansson, 2021/10/29