[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
- [elpa] externals/phps-mode 9172bf2 35/62: Improved incremental lex-analyzer, (continued)
- [elpa] externals/phps-mode 9172bf2 35/62: Improved incremental lex-analyzer, Christian Johansson, 2021/04/20
- [elpa] externals/phps-mode 490826c 45/62: Implemented the YACC grammar, Christian Johansson, 2021/04/20
- [elpa] externals/phps-mode f805d35 52/62: Added global declaration, global attributes of grammar, Christian Johansson, 2021/04/20
- [elpa] externals/phps-mode a8242c8 23/62: Passed all unit tests for lexer, Christian Johansson, 2021/04/20
- [elpa] externals/phps-mode c4f1335 34/62: Updated version and modified date, Christian Johansson, 2021/04/20
- [elpa] externals/phps-mode 6ffce34 42/62: More work on implementing grammar, Christian Johansson, 2021/04/20
- [elpa] externals/phps-mode fa61295 41/62: More work on grammar, Christian Johansson, 2021/04/20
- [elpa] externals/phps-mode 9a9c296 44/62: More grammar implementation, Christian Johansson, 2021/04/20
- [elpa] externals/phps-mode 9e291dc 47/62: Excluded admin-files from compilation, Christian Johansson, 2021/04/20
- [elpa] externals/phps-mode 9011c85 32/62: Updated copyright years, Christian Johansson, 2021/04/20
- [elpa] externals/phps-mode 85ed75d 46/62: More work on automated parser generation,
Christian Johansson <=
- [elpa] externals/phps-mode aeec1d2 55/62: Removed comment, Christian Johansson, 2021/04/20
- [elpa] externals/phps-mode 62e7617 61/62: Merged GitHub, Christian Johansson, 2021/04/20
- [elpa] externals/phps-mode cd3bbfd 02/62: More work on PHP 8.0 lex analyzer, Christian Johansson, 2021/04/20
- [elpa] externals/phps-mode 804a42e 09/62: Most of lex analyzer implemented, Christian Johansson, 2021/04/20
- [elpa] externals/phps-mode 1072b2d 14/62: Improved debugging of lex-analyzer, Christian Johansson, 2021/04/20
- [elpa] externals/phps-mode 9c63f7d 16/62: Passed first old tests for lexer, Christian Johansson, 2021/04/20
- [elpa] externals/phps-mode e624011 19/62: White-space fixes for lexer unit tests, Christian Johansson, 2021/04/20
- [elpa] externals/phps-mode d893f7f 22/62: Passing some more tests, Christian Johansson, 2021/04/20
- [elpa] externals/phps-mode c1ab121 25/62: Work on making integration-tests pass, Christian Johansson, 2021/04/20
- [elpa] externals/phps-mode ad4e825 20/62: Added some new lex analyzer tests for PHP 8.0 tokens, Christian Johansson, 2021/04/20