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

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

[elpa] externals/phps-mode 85ed75d 46/62: More work on automated parser


From: Christian Johansson
Subject: [elpa] externals/phps-mode 85ed75d 46/62: More work on automated parser generation
Date: Tue, 20 Apr 2021 10:56:21 -0400 (EDT)

branch: externals/phps-mode
commit 85ed75d8d1edf4f829a43809daea9a01fff0566f
Author: Christian Johansson <christian@mediastrategi.se>
Commit: Christian Johansson <christian@mediastrategi.se>

    More work on automated parser generation
---
 admin/phps-mode-automation-grammar.el | 32 +++++++++++++++++++++++++++-
 admin/phps-mode-automation.el         | 40 +++++++++++++++++++++++++++++++++--
 phps-mode-lexer.el                    |  5 +++++
 3 files changed, 74 insertions(+), 3 deletions(-)

diff --git a/admin/phps-mode-automation-grammar.el 
b/admin/phps-mode-automation-grammar.el
index 31915f1..4fca800 100644
--- a/admin/phps-mode-automation-grammar.el
+++ b/admin/phps-mode-automation-grammar.el
@@ -4,6 +4,9 @@
 
 ;;; Code:
 
+
+(require 'phps-mode-lexer)
+
 (defconst
   phps-mode-automation-grammar-non-terminals
   '(
@@ -1323,7 +1326,34 @@
   '%empty
   "The e-identifier of grammar.")
 
-;; TODO Add lex-analyzer as well
+(defconst
+  phps-mode-automation-grammar-eof-identifier
+  '$
+  "The EOF-identifier of grammar.")
+
+(defconst
+  phps-mode-automation-grammar-lex-analyzer-function
+  (lambda(index)
+    (with-current-buffer "*phps-mode-lex-analyzer*"
+      (unless (= (point) index)
+        (goto-char index))
+      (phps-mode-lexer--re2c)
+      (car
+       (nreverse
+        phps-mode-lexer--generated-new-tokens))))
+  "The custom lex-analyzer.")
+
+(defconst
+  phps-mode-automation-grammar-lex-analyzer-get-function
+  (lambda (token)
+    (with-current-buffer "*phps-mode-lex-analyzer*"
+      (let ((start (car (cdr token)))
+            (end (cdr (cdr token))))
+        (when (<= end (point-max))
+          (buffer-substring-no-properties
+           start
+           end)))))
+  "Fetch token meta data.")
 
 
 (provide 'phps-mode-automation-grammar)
diff --git a/admin/phps-mode-automation.el b/admin/phps-mode-automation.el
index 28bc423..2171092 100644
--- a/admin/phps-mode-automation.el
+++ b/admin/phps-mode-automation.el
@@ -27,14 +27,50 @@
 
 ;;; Code:
 
+(require 'phps-mode-automation-grammar)
+(require 'parser-generator-lr-export)
+
 (let ((php-yacc-url 
"https://raw.githubusercontent.com/php/php-src/php-8.0.0/Zend/zend_language_parser.y";)
       (php-yacc-file (expand-file-name "zend_language_parser.y")))
 
   ;; Download Yacc if not available
   (unless (file-exists-p php-yacc-file)
-    (message "Downloading PHP Yacc grammar..")
+    (message "Downloading PHP 8.0 YACC grammar..")
     (url-copy-file php-yacc-url php-yacc-file t t)
-    (message "Download completed"))
+    (message "Download of PHP 8.0 YACC grammar completed"))
+
+  ;; Prepare export
+  (parser-generator-set-grammar
+   `(
+     ,phps-mode-automation-grammar-non-terminals
+     ,phps-mode-automation-grammar-terminals
+     ,phps-mode-automation-grammar-productions
+     ,phps-mode-automation-grammar-start
+     )
+   )
+  (parser-generator-set-look-ahead-number
+   phps-mode-automation-grammar-look-ahead-number
+   )
+  (setq
+   parser-generator--e-identifier
+   phps-mode-automation-grammar-e-identifier)
+  (setq
+   parser-generator--eof-identifier
+   phps-mode-automation-grammar-eof-identifier)
+  (setq
+   parser-generator-lex-analyzer--function
+   phps-mode-automation-grammar-lex-analyzer-function
+   )
+  (setq
+   parser-generator-lex-analyzer--get-function
+   phps-mode-automation-grammar-lex-analyzer-get-function)
+  (parser-generator-process-grammar)
+  (parser-generator-lr-generate-parser-tables)
+
+  ;; Export
+  (let ((export (parser-generator-lr-export-to-elisp "phps-mode-parser")))
+    (message "export: %s" export)
+    )
 
   (message "Automation completed"))
 
diff --git a/phps-mode-lexer.el b/phps-mode-lexer.el
index 358d8b3..2f2551c 100644
--- a/phps-mode-lexer.el
+++ b/phps-mode-lexer.el
@@ -117,6 +117,9 @@
 (defvar-local phps-mode-lexer--generated-tokens nil
   "List of current generated tokens.")
 
+(defvar-local phps-mode-lexer--generated-new-tokens nil
+  "List of current newly generated tokens.")
+
 (defvar-local phps-mode-lexer--state nil
   "Current state of lexer.")
 
@@ -271,6 +274,7 @@
 
   (semantic-lex-push-token (semantic-lex-token token start end))
   (push `(,token ,start . ,end) phps-mode-lexer--generated-tokens)
+  (push `(,token ,start . ,end) phps-mode-lexer--generated-new-tokens)
 
   (phps-mode-debug-message
    (message
@@ -461,6 +465,7 @@
 (defun phps-mode-lexer--re2c ()
   "Elisp port of original Zend re2c lexer."
 
+  (setq phps-mode-lexer--generated-new-tokens nil)
   (setq phps-mode-lexer--restart-flag nil)
   (let ((old-start (point)))
     (phps-mode-debug-message



reply via email to

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