[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/parser-generator 99b531f 300/434: Made some cpu complex
From: |
ELPA Syncer |
Subject: |
[elpa] externals/parser-generator 99b531f 300/434: Made some cpu complexity optimizations |
Date: |
Mon, 29 Nov 2021 16:00:02 -0500 (EST) |
branch: externals/parser-generator
commit 99b531f035afcca6c06cc5ae863316377a3bd4a3
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>
Made some cpu complexity optimizations
---
parser-generator-lr-export.el | 2 ++
parser-generator-lr.el | 24 ++++++++++++++--
parser-generator.el | 61 +++++++++++++++++++++++++---------------
test/parser-generator-lr-test.el | 25 ++++++++++++++++
4 files changed, 87 insertions(+), 25 deletions(-)
diff --git a/parser-generator-lr-export.el b/parser-generator-lr-export.el
index ec4cdce..09436fe 100644
--- a/parser-generator-lr-export.el
+++ b/parser-generator-lr-export.el
@@ -11,6 +11,7 @@
(defun parser-generator-lr-export-to-elisp (namespace)
"Export parser with NAMESPACE."
+ (message "\nStarting generation of elips..\n")
;; Make sure all requisites are defined
(unless parser-generator-lr--action-tables
@@ -831,6 +832,7 @@
(buffer-substring-no-properties
(point-min)
(point-max))))
+ (message "\nCompleted generation of elips.\n")
code))
diff --git a/parser-generator-lr.el b/parser-generator-lr.el
index bb25210..a101e79 100644
--- a/parser-generator-lr.el
+++ b/parser-generator-lr.el
@@ -29,15 +29,18 @@
(defun parser-generator-lr-generate-parser-tables ()
"Generate parsing tables for grammar."
+ (message "\nStarting generation of parser-tables..\n")
(let ((table-lr-items
(parser-generator-lr--generate-goto-tables)))
(parser-generator-lr--generate-action-tables
table-lr-items)
+ (message "\nCompleted generation of parser-tables.\n")
table-lr-items))
;; Algorithm 5.11, p. 393
(defun parser-generator-lr--generate-action-tables (table-lr-items)
"Generate action-tables for lr-grammar based on TABLE-LR-ITEMS."
+ (message "\nStarting generation of action-tables..\n")
(let ((action-tables)
(states '(shift reduce error))
(added-actions (make-hash-table :test 'equal))
@@ -239,6 +242,10 @@
(parser-generator--debug
(message "%s actions %s" goto-index action-table))
(when action-table
+ (message
+ "ACTION-TABLE (%d): %s\n"
+ goto-index
+ action-table)
(push
(list
goto-index
@@ -256,11 +263,13 @@
table-index
(car (cdr (nth table-index action-tables)))
parser-generator-lr--action-tables)
- (setq table-index (1+ table-index))))))
+ (setq table-index (1+ table-index)))))
+ (message "\nCompleted generation of action-tables..\n"))
;; Algorithm 5.9, p. 389
(defun parser-generator-lr--generate-goto-tables ()
"Calculate set of valid LR(k) items for grammar and a GOTO-table."
+ (message "\nStarting generation of goto-tables..\n")
(parser-generator--debug
(message "(parser-generator-lr--generate-goto-tables)"))
(let ((lr-item-set-new-index 0)
@@ -416,6 +425,10 @@
(sort
goto-table-table
'parser-generator--sort-list))
+ (message
+ "GOTO-TABLE (%d): %s\n"
+ lr-item-set-index
+ goto-table-table)
(push
`(
,lr-item-set-index
@@ -444,6 +457,7 @@
table-lr-items
t))
(error "Inconsistent grammar!"))
+ (message "\nCompleted generation of goto-tables.\n")
table-lr-items))
;; Algorithm 5.10, p. 391
@@ -719,6 +733,7 @@
(message "γ: %s" γ))
prefix-previous)))))
+;; TODO Optimize this function 1. first and 2. sort
(defun parser-generator-lr--items-for-goto (previous-lr-item x)
"Calculate LR-items for GOTO(PREVIOUS-LR-ITEM, X)."
(let ((lr-new-item)
@@ -812,7 +827,10 @@
(let ((lr-item-suffix-rest-first
(parser-generator--first
- lr-item-suffix-rest)))
+ lr-item-suffix-rest
+ nil
+ t
+ t)))
(parser-generator--debug
(message
"lr-item-suffix-rest-first (before): %s"
@@ -875,7 +893,7 @@
lr-new-item
(sort
lr-new-item
- 'parser-generator--sort-list)))
+ 'parser-generator--sort-list))) ;; TODO Optimize this
lr-new-item))
diff --git a/parser-generator.el b/parser-generator.el
index c64ca46..282bba6 100644
--- a/parser-generator.el
+++ b/parser-generator.el
@@ -92,7 +92,8 @@
(unless (gethash element processed)
(puthash element t processed)
(push element new-elements)))
- (nreverse new-elements)))
+ (nreverse
+ new-elements)))
(defun parser-generator--generate-list-of-symbol (k symbol)
"Generate list of K number of SYMBOL."
@@ -437,6 +438,10 @@
(list
lhs
(reverse new-rhs)))
+ (message
+ "Production %s: %s"
+ production-index
+ production)
(parser-generator--debug
(message
"Production %s: %s"
@@ -510,6 +515,7 @@
(defun parser-generator-process-grammar ()
"Process grammar."
+ (message "\nStarting process of grammar..\n")
(parser-generator--clear-cache)
(unless parser-generator--look-ahead-number
(error "No look-ahead-number defined!"))
@@ -523,7 +529,8 @@
(parser-generator--valid-grammar-p
parser-generator--grammar)
(error "Invalid grammar G!"))
- (parser-generator--load-symbols))
+ (parser-generator--load-symbols)
+ (message "\nCompleted process of grammar\n"))
(defun parser-generator--sort-list (a b)
"Return non-nil if a element in A is greater than a element in B in
lexicographic order."
@@ -1418,11 +1425,13 @@
f-set)))
;; Algorithm 5.5, p. 357
-(defun parser-generator--first (β &optional disallow-e-first)
- "For sentential-form Β, calculate first terminals, optionally
DISALLOW-E-FIRST."
+(defun parser-generator--first (β &optional disallow-e-first ignore-validation
skip-sorting)
+ "For sentential-form Β, calculate first terminals, optionally
DISALLOW-E-FIRST, IGNORE-VALIDATION and SKIP-SORTING."
(unless (listp β)
(setq β (list β)))
- (unless (parser-generator--valid-sentential-form-p β)
+ (unless (or
+ ignore-validation
+ (parser-generator--valid-sentential-form-p β))
(error "Invalid sentential form β! %s" β))
(let ((k
(max
@@ -1432,7 +1441,8 @@
;; Generate F-sets only once per grammar
(parser-generator--generate-f-sets)
- (let ((first-list nil))
+ (let ((first-list nil)
+ (first-items (make-hash-table :test 'equal)))
;; Iterate each symbol in β using a PDA algorithm
(let ((input-tape β)
(input-tape-length (length β))
@@ -1534,7 +1544,7 @@
"stopped looking since non-terminal starts with
e-identifier: %s"
symbol-f-set))
(setq keep-looking nil))
-
+
;; Handle this scenario here were a non-terminal can
result in different FIRST sets
(when (>
(length symbol-f-set)
@@ -1604,21 +1614,28 @@
(setq first (reverse first))
;; (message "first-after-fill: %s" first)
)
- (parser-generator--debug
- (message
- "push to first-list: %s to %s"
- first
- first-list))
- (push
- first
- first-list))))))
-
- (setq
- first-list
- (parser-generator--distinct first-list))
- (setq
- first-list
- (sort first-list 'parser-generator--sort-list))
+ (unless
+ (gethash
+ first
+ first-items)
+ (parser-generator--debug
+ (message
+ "push to first-list: %s to %s"
+ first
+ first-list))
+ (puthash
+ first
+ t
+ first-items)
+ (push
+ first
+ first-list)))))))
+ (unless skip-sorting
+ (setq
+ first-list
+ (sort
+ first-list
+ 'parser-generator--sort-list)))
first-list)))
;; Definition at p. 343
diff --git a/test/parser-generator-lr-test.el b/test/parser-generator-lr-test.el
index 49c4071..beab25b 100644
--- a/test/parser-generator-lr-test.el
+++ b/test/parser-generator-lr-test.el
@@ -76,6 +76,31 @@
(7 (((a) reduce 1) ((b) reduce 1))))
(parser-generator--hash-to-list
parser-generator-lr--action-tables)))
+ (message "Passed Example 5.32 p. 393")
+
+ ;; Cyclical grammar
+ (parser-generator-set-grammar
+ '(
+ (Sp S A B)
+ (a b c)
+ (
+ (Sp S)
+ (S A B)
+ (A (a b A) (a B))
+ (B (c S))
+ )
+ Sp))
+ (parser-generator-set-look-ahead-number 1)
+ (parser-generator-process-grammar)
+ (let ((table-lr-items
+ (parser-generator-lr--generate-goto-tables)))
+ ;; (message "cyclical lr-items: %s" table-lr-items)
+ (parser-generator-lr--generate-action-tables
+ table-lr-items)
+ ;; (message "cyclical goto-tables: %s" parser-generator-lr--goto-tables)
+ ;; (message "cyclical action-tables: %s"
parser-generator-lr--action-tables)
+ )
+ (message "Passed cyclical grammar")
(message "Passed tests for (parser-generator-lr--generate-action-tables)"))
- [elpa] externals/parser-generator d147355 256/434: Fixed a bug in processing production RHS when loading symbols, (continued)
- [elpa] externals/parser-generator d147355 256/434: Fixed a bug in processing production RHS when loading symbols, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 8e3084b 270/434: More work LRk parser k = 0, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 58190dc 272/434: LR Parser k=0 building correct LR items, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 0f8aa1d 265/434: Updated LRk README, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator f0cd9f6 280/434: Started on test for export parser feature, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 3e9b4ee 279/434: Improved README, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 2920af5 286/434: Parser is exported but helper-functions are missing still, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator e904d46 289/434: Moved LR-parser exporter to stand-alone file and added documentation about export, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 099304e 296/434: Some coding-styling fixes, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 5a2dbb3 297/434: Removed unnecessary debug outputs, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 99b531f 300/434: Made some cpu complexity optimizations,
ELPA Syncer <=
- [elpa] externals/parser-generator 17c36f8 309/434: Added cache to lr-items for prefix function, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator b6e2e64 312/434: Passing tests after memory optimization of LR parser, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 61dfc74 310/434: Added TODO-item, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator f371e2d 320/434: Added failing test for conflict, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 2eadec5 326/434: Shortened long doc comments, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 43f3bd4 332/434: Fixed issue were non-terminals named as emacs-lisp functions was not accepted in grammar, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 8165c55 333/434: Conflicting grammar causes expected error, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator feaa9ff 338/434: Removed debug outputs, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator cf01b59 341/434: Fixed action-table generation with symbols with context-sensitive attributes, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator ae18945 353/434: Passing some calculations thanks to precedence / associativity, ELPA Syncer, 2021/11/29