[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/phps-mode 42c4e0e 48/96: Work on automatically generati
From: |
Christian Johansson |
Subject: |
[elpa] externals/phps-mode 42c4e0e 48/96: Work on automatically generating terminals, non-terminals and start from YACC grammar |
Date: |
Fri, 29 Oct 2021 11:14:44 -0400 (EDT) |
branch: externals/phps-mode
commit 42c4e0edaf766afdd96c83fa0570cbc806f3dbb0
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>
Work on automatically generating terminals, non-terminals and start from
YACC grammar
---
admin/phps-mode-automation.el | 2 +-
phps-mode-automation-parser-generator.el | 106 ++++++++++++++++++++++++++++---
2 files changed, 98 insertions(+), 10 deletions(-)
diff --git a/admin/phps-mode-automation.el b/admin/phps-mode-automation.el
index a51318e..01b6729 100644
--- a/admin/phps-mode-automation.el
+++ b/admin/phps-mode-automation.el
@@ -35,7 +35,7 @@
"Generate parser."
(if (fboundp 'parser-generator-lr-export-to-elisp)
(progn
- ;; TODO Generate precedence, non-terminals, terminals and start here
+ ;; TODO Generate precedence here
;; Prepare export
(when (fboundp 'parser-generator-set-grammar)
diff --git a/phps-mode-automation-parser-generator.el
b/phps-mode-automation-parser-generator.el
index 92df4ff..582c22b 100644
--- a/phps-mode-automation-parser-generator.el
+++ b/phps-mode-automation-parser-generator.el
@@ -23,6 +23,31 @@
;;; Code:
+(defvar
+ phps-mode-automation-parser-generator--start
+ nil
+ "Start position of grammar.")
+
+(defvar
+ phps-mode-automation-parser-generator--terminals
+ nil
+ "Terminals of grammar.")
+
+(defvar
+ phps-mode-automation-parser-generator--non-terminals
+ nil
+ "Non-terminals of grammar.")
+
+(defvar
+ phps-mode-automation-parser-generator--symbols
+ nil
+ "Symbols of grammar.")
+
+(defvar
+ phps-mode-automation-parser-generator--production-lhs
+ nil
+ "LHS of productions of grammar.")
+
(defun phps-mode-automation-parser-generator--ensure-yacc-grammar-is-available
()
"If grammar is not available, download it."
(let ((php-yacc-url
@@ -49,6 +74,22 @@
(require 'parser-generator-lr)
(phps-mode-automation-parser-generator--ensure-yacc-grammar-is-available)
+ (setq
+ phps-mode-automation-parser-generator--start
+ nil)
+ (setq
+ phps-mode-automation-parser-generator--terminals
+ nil)
+ (setq
+ phps-mode-automation-parser-generator--non-terminals
+ nil)
+ (setq
+ phps-mode-automation-parser-generator--production-lhs
+ (make-hash-table :test 'equal))
+ (setq
+ phps-mode-automation-parser-generator--symbols
+ (make-hash-table :test 'equal))
+
(parser-generator-set-look-ahead-number
1)
(setq
@@ -91,7 +132,23 @@
(Comment Production
(lambda(args) (format "%s" (nth 1 args))))
(LHS ":" RHSS Production-End
- (lambda(args) (format " (%s\n %s\n )" (nth 0 args) (nth 2 args))))
+ (lambda(args)
+ ;; Store distinct LHS
+ (unless (gethash
+ (intern (nth 0 args))
+ phps-mode-automation-parser-generator--production-lhs)
+ (puthash
+ (intern (nth 0 args))
+ t
+ phps-mode-automation-parser-generator--production-lhs)
+
+ ;; If no start is defined - define this as start
+ (unless phps-mode-automation-parser-generator--start
+ (setq
+ phps-mode-automation-parser-generator--start
+ (intern (nth 0 args)))))
+
+ (format " (%s\n %s\n )" (nth 0 args) (nth 2 args))))
)
(Production-End
";"
@@ -142,9 +199,29 @@
)
(Symbol
(symbol
- (lambda(args) (format "%s" args)))
+ (lambda(args)
+ ;; Store distinct symbols
+ (unless (gethash
+ (intern args)
+ phps-mode-automation-parser-generator--symbols)
+ (puthash
+ (intern args)
+ t
+ phps-mode-automation-parser-generator--symbols))
+
+ (format "%s" args)))
(literal
- (lambda(args) (format "%S" (substring args 1 2))))
+ (lambda(args)
+ ;; Store distinct symbols
+ (unless (gethash
+ (format "%S" (substring args 1 2))
+ phps-mode-automation-parser-generator--symbols)
+ (puthash
+ (format "%S" (substring args 1 2))
+ t
+ phps-mode-automation-parser-generator--symbols))
+
+ (format "%S" (substring args 1 2))))
)
)
Start))
@@ -304,14 +381,25 @@
(kill-region delimiter-start (point-max)))
(goto-char (point-min))
(let ((productions (eval (car (read-from-string
(parser-generator-lr-translate))))))
- ;; TODO Generate non-terminals here
- ;; TODO Generate terminals here
- ;; TODO Generate start here
+
+ (maphash
+ (lambda (k _v)
+ (if (gethash
+ k
+ phps-mode-automation-parser-generator--production-lhs)
+ (push
+ k
+ phps-mode-automation-parser-generator--non-terminals)
+ (push
+ k
+ phps-mode-automation-parser-generator--terminals)))
+ phps-mode-automation-parser-generator--symbols)
+
(list
- non-terminals
- terminals
+ phps-mode-automation-parser-generator--non-terminals
+ phps-mode-automation-parser-generator--terminals
productions
- start))))
+ phps-mode-automation-parser-generator--start))))
(provide 'phps-mode-automation-parser-generator)
;;; phps-mode-automation-parser-generator.el ends here
- [elpa] externals/phps-mode 1ee3094 28/96: More refactoring of the parsers lex-analyzer, (continued)
- [elpa] externals/phps-mode 1ee3094 28/96: More refactoring of the parsers lex-analyzer, Christian Johansson, 2021/10/29
- [elpa] externals/phps-mode 2ceb6e5 23/96: Added potential support for incremental parsing, Christian Johansson, 2021/10/29
- [elpa] externals/phps-mode e59d30e 26/96: Improvements in lex-analyzer for parser, Christian Johansson, 2021/10/29
- [elpa] externals/phps-mode c62ec64 27/96: Started refactor of parsers lex-analyzer, Christian Johansson, 2021/10/29
- [elpa] externals/phps-mode 9acda54 33/96: Added more passing tests for parser, Christian Johansson, 2021/10/29
- [elpa] externals/phps-mode c470e37 38/96: More work on grammar parser generator, Christian Johansson, 2021/10/29
- [elpa] externals/phps-mode 6b9c1a4 40/96: More pasing of grammar, Christian Johansson, 2021/10/29
- [elpa] externals/phps-mode 3fa1b13 41/96: Translation of productions now working, Christian Johansson, 2021/10/29
- [elpa] externals/phps-mode b0ad204 44/96: Improved YACC grammar parser for productions, Christian Johansson, 2021/10/29
- [elpa] externals/phps-mode 3824d7d 46/96: More work on automatically parsing YACC grammar, Christian Johansson, 2021/10/29
- [elpa] externals/phps-mode 42c4e0e 48/96: Work on automatically generating terminals, non-terminals and start from YACC grammar,
Christian Johansson <=
- [elpa] externals/phps-mode f56ba64 49/96: Terminals, non-terminals and start is automatically generated from YACC, Christian Johansson, 2021/10/29
- [elpa] externals/phps-mode 7323416 31/96: Added failing test for parser, Christian Johansson, 2021/10/29
- [elpa] externals/phps-mode 7c66145 30/96: Refactor of parsers lex-analyzer complete, Christian Johansson, 2021/10/29
- [elpa] externals/phps-mode 0e89b6e 35/96: Fixed bug in automation grammar, Christian Johansson, 2021/10/29
- [elpa] externals/phps-mode 65152f4 36/96: Added TODO item, Christian Johansson, 2021/10/29
- [elpa] externals/phps-mode add17a7 24/96: T_COMMENT and T_DOC_COMMENT are excluded from parser, Christian Johansson, 2021/10/29
- [elpa] externals/phps-mode f46b98f 25/96: More work on integrating parser, Christian Johansson, 2021/10/29
- [elpa] externals/phps-mode 6b3a298 29/96: More work on parsers lex-analyzer refactor, Christian Johansson, 2021/10/29
- [elpa] externals/phps-mode 45508e1 32/96: Reverted integration of parser into other files due to immaturity, Christian Johansson, 2021/10/29
- [elpa] externals/phps-mode 37dda7a 34/96: Added another failing test for parser, Christian Johansson, 2021/10/29