[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/parser-generator 7e051d3 054/434: Algorithm 5.8 complet
From: |
ELPA Syncer |
Subject: |
[elpa] externals/parser-generator 7e051d3 054/434: Algorithm 5.8 completed but not tested |
Date: |
Mon, 29 Nov 2021 15:59:07 -0500 (EST) |
branch: externals/parser-generator
commit 7e051d3a6a950b2a547d088168dfd927342ef640
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>
Algorithm 5.8 completed but not tested
---
parser.el | 38 ++++++++++++++++++++++++++++----------
1 file changed, 28 insertions(+), 10 deletions(-)
diff --git a/parser.el b/parser.el
index d0e6e72..94fe211 100644
--- a/parser.el
+++ b/parser.el
@@ -644,8 +644,7 @@
(setq γ (list γ)))
(unless (parser--valid-sentential-form-p γ)
(error "Invalid sentential form γ!"))
- (let ((prefix-length (length γ))
- (lr-item-exists (make-hash-table :test 'equal)))
+ (let ((lr-item-exists (make-hash-table :test 'equal)))
;; 1
@@ -670,8 +669,7 @@
;; Iterate every item in V(e)
(dolist (item lr-items-e)
- (let ((lhs (nth 0 item))
- (prefix (nth 1 item))
+ (let ((prefix (nth 1 item))
(rhs (nth 2 item))
(suffix (nth 3 item)))
@@ -683,7 +681,7 @@
(when (parser--valid-non-terminal-p rhs-first)
(let ((rhs-rest (append (cdr rhs) suffix)))
(let ((rhs-first (parser--first rhs-rest)))
- (message "FIRST(%s) = %s" rhs-rest rhs-first)
+ (message "1b FIRST(%s) = %s" rhs-rest rhs-first)
(let ((sub-production (parser--get-grammar-rhs
rhs-first)))
;; For each production with B as LHS
@@ -694,6 +692,7 @@
;; Add [B -> . β, x] to v-set(e), provided it
is not already there
(unless (gethash `(e ,rhs-first nil ,sub-rhs
,f) lr-item-exists)
+ (puthash `(e ,rhs-first nil ,sub-rhs ,f) t
lr-item-exists)
(push `(,rhs-first nil ,sub-rhs ,f)
lr-items-e)
;; (c) Repeat (b) until no more items can be
added to v-set(e)
@@ -722,15 +721,34 @@
;; Add [A -> aXi . B, u] to V(X1,...,Xi)
(push `(,lr-item-lhs ,(append lr-item-prefix prefix)
,lr-item-suffix-rest ,lr-item-look-ahead) lr-new-item)))))
- ;; TODO (c) Repeat step (2b) until no more new items can be added
to V(X1,...,Xi)
+ ;; (c) Repeat step (2b) until no more new items can be added to
V(X1,...,Xi)
(let ((added-new t))
(while added-new
(setq added-new nil)
(dolist (lr-item lr-new-item)
- ;; TODO (b) If [A -> a . Bb, u] has been placed in
V(X1,...,Xi)
- ;; and B -> D is in P then add [B -> . D, x] to V(X1,...,Xi)
for each x in FIRST(bu)
- ;; provided it is not already there
- )))
+ (let ((lr-item-suffix (nth 2 lr-item)))
+ (let ((lr-item-suffix-first (car lr-item-suffix))
+ (lr-item-suffix-rest (cdr lr-item-suffix)))
+
+ ;; (b) If [A -> a . Bb, u] has been placed in
V(X1,...,Xi)
+ ;; and B -> D is in P
+ (when (parser--valid-non-terminal-p lr-item-suffix-first)
+
+ (let ((lr-item-suffix-rest-first (parser--first
lr-item-suffix-rest)))
+ (message "2b FIRST(%s) = %s" lr-item-suffix-first
lr-item-suffix-rest-first)
+ (let ((sub-production (parser--get-grammar-rhs
lr-item-suffix-first)))
+
+ ;; For each production with B as LHS
+ (dolist (sub-rhs sub-production)
+
+ ;; For each x in FIRST(αu)
+ (dolist (f lr-item-suffix-rest-first)
+
+ ;; then add [B -> . D, x] to V(X1,...,Xi) for
each x in FIRST(bu)
+ ;; provided it is not already there
+ (unless (gethash `(,prefix-acc
,lr-item-suffix-first nil ,sub-rhs ,f) lr-item-exists)
+ (puthash `(,prefix-acc ,lr-item-suffix-first
nil ,sub-rhs ,f) t lr-item-exists)
+ (push `(,lr-item-suffix-first nil ,sub-rhs
,f) lr-new-item))))))))))))
(setq prefix-previous prefix-acc)
(puthash prefix-acc lr-new-item lr-items))))
- [elpa] externals/parser-generator dc78de7 025/434: Fixed page comment reference, (continued)
- [elpa] externals/parser-generator dc78de7 025/434: Fixed page comment reference, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 3e02435 028/434: Passing complex 2 test, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 8e99d0c 035/434: Fixed typo, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator bc1ec12 036/434: Improved documentation, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator fe94691 048/434: Added hash-table for production RHS, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator afa7cb9 050/434: Added unit tests for retrieving grammar RHS, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 603df44 040/434: Added failing unit tests for (parser--sort-list), ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator aadb31a 042/434: Updated README.md about FOLLOW-sets, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 586a38e 047/434: More work on algorithm 5.8, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 00ffcde 052/434: Added TODO items, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 7e051d3 054/434: Algorithm 5.8 completed but not tested,
ELPA Syncer <=
- [elpa] externals/parser-generator 8e436df 056/434: More tweaking, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator a60952c 057/434: More debugging of new algorithm, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator ab0559d 060/434: More work, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator d7f43d7 066/434: Sorting lr-items for prefix before return, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator ca85ef4 068/434: Created TODO items, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator b73c4ed 072/434: Made e-symbol customizable, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 55bf9a9 073/434: Removed references to 'e, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 01df803 051/434: Improved documentation, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 3e1f2b6 058/434: Passed first for calculating valid LR-sets for viable prefix γ, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 51cab75 061/434: More debugging, ELPA Syncer, 2021/11/29