[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/parser-generator 586a38e 047/434: More work on algorith
From: |
ELPA Syncer |
Subject: |
[elpa] externals/parser-generator 586a38e 047/434: More work on algorithm 5.8 |
Date: |
Mon, 29 Nov 2021 15:59:06 -0500 (EST) |
branch: externals/parser-generator
commit 586a38e28b86925ba526fd8b711297e856c9b760
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>
More work on algorithm 5.8
---
parser.el | 64 ++++++++++++++++++++++++++++++++++-----------------------------
1 file changed, 35 insertions(+), 29 deletions(-)
diff --git a/parser.el b/parser.el
index 70c3181..21af745 100644
--- a/parser.el
+++ b/parser.el
@@ -614,41 +614,47 @@
;; Algorithm 5.8, p. 386
(defun parser--lr-items (γ)
- "Calculate valid LR-items for the viable prefix Y."
- (let ((lr-items)
+ "Calculate valid LR-items for the viable prefix Γ."
+ (let ((lr-items (make-hash-table :test 'equal))
(productions (parser--get-grammar-productions))
(start (parser--get-grammar-start)))
(unless (listp γ)
(setq γ (list γ)))
(unless (parser--valid-sentential-form-p γ)
(error "Invalid sentential form γ!"))
- (let ((prefix-length (length γ))
- (stack '((0 '1a))))
- (while stack
- (let ((stack-item (pop stack)))
- (let ((index (nth 0 stack-item))
- (state (nth 1 stack-item)))
- (cond
- ((eq state '1a)
- ;; TODO 1.a. iterate every production who has the LHS = S, add
[S -> . a] to v-set(e)
- ;; Iterate all productions in grammar
- (let ()
- (dolist (p productions)
- (let ((production-lhs (car p)))
- (when (eq production-lhs start)
- )))))
- ((eq state '1b)
- ;; TODO 1.b. iterate every item in v-set(e), if [A -> . Bα, u]
is an item and B -> β is in P, then foreach x in FIRST(αu) add [B -> . β, x] to
v-set(e), provided it is not already there
- )
-
- ((eq state '1c)
- ;; TODO 1.c. repeat b until no more items can be added to
v-set(e)
- )
- ((eq state '2a))
- ((eq state '2b))
- ((eq state '2c))
- (t (error "Invalid state!")))))))
- lr-items))
+ (let ((prefix-length (length γ)))
+
+ ;; 1
+
+ ;; Iterate all productions in grammar
+ (let ((lr-items-e))
+
+ ;; a
+ (dolist (p productions)
+ (let ((production-lhs (car p)))
+ ;; For all productions of the form S -> . α
+ (when (eq production-lhs start)
+ (let ((production-rhs (cdr p)))
+ (dolist (rhs production-rhs)
+
+ ;; Make sure RHS is a list
+ (unless (listp rhs)
+ (setq rhs (list rhs)))
+
+ ;; Add [S -> . α] to V(e)
+ (push `(,production-lhs ,nil ,rhs) lr-items-e))))))
+
+ ;; b, c
+ ;; TODO 1.b. iterate every item in v-set(e), if [A -> . Bα, u] is an
item and B -> β is in P, then foreach x in FIRST(αu) add [B -> . β, x] to
v-set(e), provided it is not already there
+ ;; TODO 1.c. repeat b until no more items can be added to v-set(e)
+ (puthash 'e lr-items-e lr-items))
+
+ ;; 2
+ ;; a
+ ;; b
+ ;; c
+
+ lr-items)))
(provide 'parser)
- [elpa] externals/parser-generator fbb8cad 012/434: Starting a refactor, (continued)
- [elpa] externals/parser-generator fbb8cad 012/434: Starting a refactor, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 563cbdd 023/434: Passed FIRST tests for semi-complex grammar, ELPA Syncer, 2021/11/29
- [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 <=
- [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, 2021/11/29
- [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