branch: externals/parser-generator
commit 59aea4d7aaba2e9cb1293b18aba82e52de3d1308
Author: Christian Johansson <[email protected]>
Commit: Christian Johansson <[email protected]>
More tweaking new algorithm
---
parser.el | 14 ++++++++------
test/parser-test.el | 2 +-
2 files changed, 9 insertions(+), 7 deletions(-)
diff --git a/parser.el b/parser.el
index 7dab2dc..d17d072 100644
--- a/parser.el
+++ b/parser.el
@@ -653,8 +653,8 @@
follow-set))
;; Algorithm 5.9, p. 389
-(defun parser--lr-items-for-grammar ()
- "Calculate set of valid LR(k) items for grammar."
+(defun parser--lr-items-for-grammar (length)
+ "Calculate set of valid LR(k) items for grammar with LENGTH."
(let ((prefixes)
(marked-prefixes (make-hash-table :test 'equal))
(lr-items)
@@ -662,14 +662,16 @@
(let ((e-set (parser--lr-items-for-prefix parser--e-identifier)))
;;(1) Place V(e) in S. The set V(e) is initially unmarked.
- (push e-set lr-items)
+ (setq lr-items (append lr-items e-set))
(push `(,parser--e-identifier) prefixes))
;; (3) Repeat step (2) until all sets of items in S are marked.
(let ((prefix))
;; (2) If a set of items a in S is unmarked
- (while prefixes
+ (while (and prefixes
+ (> length 0))
+ (setq length (1- length))
;; (2) Mark a by computing for each X in N u E, GOTO (a, X).
(Algorithm 5.8 can be used here.)
(setq prefix (pop prefixes))
@@ -698,11 +700,11 @@
;; If a' = GOTO(a, X) is nonempty
(when prefix-lr-items
- (message "Added to stack.")
+ (message "viable-prefix: %s" alternative-prefix)
;; then add a' to S as an unmarked set of items
(push alternative-prefix prefixes)
- (push prefix-lr-items lr-items))))))))
+ (setq lr-items (append lr-items prefix-lr-items)))))))))
lr-items))
diff --git a/test/parser-test.el b/test/parser-test.el
index 9ca16d3..8d0b0b6 100644
--- a/test/parser-test.el
+++ b/test/parser-test.el
@@ -238,7 +238,7 @@
(S nil nil (a))
(S nil nil (e))
(Sp nil (S) (e)))
- (parser--lr-items-for-grammar)))
+ (parser--lr-items-for-grammar 8)))
(message "Passed LR-items for example 5.30")
(message "Passed tests for (parser--lr-items-for-grammar)"))