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

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

[elpa] externals/phps-mode b714471 21/96: Added parse function in lex-an


From: Christian Johansson
Subject: [elpa] externals/phps-mode b714471 21/96: Added parse function in lex-analyzer and a test for it
Date: Fri, 29 Oct 2021 11:14:36 -0400 (EDT)

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

    Added parse function in lex-analyzer and a test for it
---
 phps-mode-lex-analyzer.el           | 72 +++++++++++++++++++++++++++++++++----
 test/phps-mode-test-lex-analyzer.el | 19 +++++++++-
 2 files changed, 84 insertions(+), 7 deletions(-)

diff --git a/phps-mode-lex-analyzer.el b/phps-mode-lex-analyzer.el
index 0513e05..918c147 100644
--- a/phps-mode-lex-analyzer.el
+++ b/phps-mode-lex-analyzer.el
@@ -34,6 +34,7 @@
 
 (require 'phps-mode-lexer)
 (require 'phps-mode-macros)
+(require 'phps-mode-parser)
 (require 'phps-mode-serial)
 
 (require 'semantic)
@@ -362,15 +363,74 @@
   t
   (phps-mode-lexer--re2c))
 
-(defun phps-mode-lex-analyzer--parse-entire-buffer (&optional 
forced-synchronous)
-  "Parse entire buffer, optionally FORCED-SYNCHRONOUS"
+(defun phps-mode-lex-analyzer--parse-string
+    (
+     string
+     )
+  "Parse entire STRING."
   (interactive)
+  (require 'phps-mode-parser)
   (require 'phps-mode-macros)
-  (phps-mode-debug-message (message "Parse entire buffer run"))
+  (phps-mode-debug-message (message "Parse entire string run"))
 
-  ;; TODO Implement this
-  
-  )
+  (let ((buffer (generate-new-buffer "*PHPs Lexer*")))
+    ;; Create temporary buffer and run lexer in it
+    (when (get-buffer buffer)
+      (with-current-buffer buffer
+        (insert string)
+
+        ;; Reset lexer
+        (setq-local
+         phps-mode-lexer--generated-tokens
+         nil)
+        (setq-local
+         phps-mode-lexer--state
+         'ST_INITIAL)
+        (setq-local
+         phps-mode-lexer--states
+         nil)
+        (setq-local
+         phps-mode-lexer--state-stack
+         nil)
+        (setq-local
+         phps-mode-lexer--heredoc-label
+         nil)
+        (setq-local
+         phps-mode-lexer--heredoc-label-stack
+         nil)
+        (setq
+         phps-mode-lexer--nest-location-stack
+         nil)
+
+        ;; Catch errors to kill generated buffer
+        (let ((got-error t)
+              (after-parser-parse))
+          (unwind-protect
+              ;; Run lexer or incremental lexer
+              (progn
+                (setq
+                 after-parser-parse
+                 (phps-mode-parser-parse))
+                (setq got-error nil))
+            (when got-error
+              (kill-buffer)))
+
+          ;; Copy lexer variables outside of buffer
+          (let ((after-lexer-state phps-mode-lexer--state)
+                (after-lexer-state-stack phps-mode-lexer--state-stack)
+                (after-lexer-states phps-mode-lexer--states)
+                (after-lexer-tokens (nreverse 
phps-mode-lexer--generated-tokens))
+                (after-lexer-heredoc-label phps-mode-lexer--heredoc-label)
+                (after-lexer-heredoc-label-stack 
phps-mode-lexer--heredoc-label-stack))
+            (kill-buffer)
+            (list
+             after-lexer-tokens
+             after-lexer-states
+             after-lexer-state
+             after-lexer-state-stack
+             after-lexer-heredoc-label
+             after-lexer-heredoc-label-stack
+             after-parser-parse)))))))
 
 (defun phps-mode-lex-analyzer--re2c-run (&optional force-synchronous)
   "Run lexer, optionally FORCE-SYNCHRONOUS."
diff --git a/test/phps-mode-test-lex-analyzer.el 
b/test/phps-mode-test-lex-analyzer.el
index 895f6b3..a1c9c5b 100644
--- a/test/phps-mode-test-lex-analyzer.el
+++ b/test/phps-mode-test-lex-analyzer.el
@@ -1611,6 +1611,22 @@
 
   )
 
+(defun phps-mode-test-lex-analyzer--parse ()
+  "Test the parser."
+
+  (should
+   (equal
+    '(((T_OPEN_TAG 1 . 7) (T_ECHO 7 . 11) (T_CONSTANT_ENCAPSED_STRING 12 . 17) 
(";" 17 . 18)) ((17 18 ST_IN_SCRIPTING nil nil nil nil) (12 17 ST_IN_SCRIPTING 
nil nil nil nil) (7 11 ST_IN_SCRIPTING nil nil nil nil) (1 7 ST_IN_SCRIPTING 
nil nil nil nil)) ST_IN_SCRIPTING nil nil nil (80 459 466 411 333 332 154 102 
79))
+    (phps-mode-lex-analyzer--parse-string
+     "<?php echo 'abc';")))
+  (message "Passed valid parse test")
+
+  (should-error
+   (phps-mode-lex-analyzer--parse-string
+    "<?php echo 'abc'"))
+  (message "Passed error parse test")
+  )
+
 (defun phps-mode-test-lex-analyzer ()
   "Run test for functions."
   ;; (setq debug-on-error t)
@@ -1631,7 +1647,8 @@
   (phps-mode-test-lex-analyzer--imenu)
   (phps-mode-test-lex-analyzer--get-moved-imenu)
   (phps-mode-test-lex-analyzer--comment-uncomment-region)
-  (phps-mode-test-lex-analyzer--move-lines-indent))
+  (phps-mode-test-lex-analyzer--move-lines-indent)
+  (phps-mode-test-lex-analyzer--parse))
 
 (phps-mode-test-lex-analyzer)
 



reply via email to

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