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

[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



reply via email to

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