branch: externals/parser-generator
commit c2d2d0d3e1f8c514861629a19d2bc130c47256b9
Author: Christian Johansson <[email protected]>
Commit: Christian Johansson <[email protected]>
Fixed FIRST calculating when building lr-item sets
---
parser-generator-lr.el | 57 +++++++++++++++++++++++++++++++++++---------------
1 file changed, 40 insertions(+), 17 deletions(-)
diff --git a/parser-generator-lr.el b/parser-generator-lr.el
index 21e166f..13cd8be 100644
--- a/parser-generator-lr.el
+++ b/parser-generator-lr.el
@@ -400,13 +400,19 @@
(< b-index set-length))
(unless (= a-index b-index)
(setq b (nth b-index set))
+ (parser-generator--debug
+ (message "b: %s" b))
+
(setq b-suffix (nth 2 b))
(setq b-follow (nth 3 b))
- (setq b-suffix-follow (append b-suffix b-follow))
- (setq b-suffix-follow-eff (parser-generator--e-free-first
b-suffix-follow))
+ (setq
+ b-suffix-follow
+ (append b-suffix b-follow))
+ (setq
+ b-suffix-follow-eff
+ (parser-generator--e-free-first b-suffix-follow))
(parser-generator--debug
- (message "b: %s" b)
(message "b-suffix: %s" b-suffix)
(message "b-follow: %s" b-follow)
(message "b-suffix-follow: %s" b-suffix-follow)
@@ -658,32 +664,49 @@
(let ((lr-item-suffix-rest-first
(parser-generator--first
lr-item-suffix-rest)))
+ (parser-generator--debug
+ (message
+ "lr-item-suffix-rest-first (before): %s"
+ lr-item-suffix-rest-first))
+
(unless lr-item-suffix-rest-first
(setq
lr-item-suffix-rest-first
(list eof-list)))
;; When |FIRST| < k add EOF symbols
- (when (
- <
- (length lr-item-suffix-rest-first)
- parser-generator--look-ahead-number)
- (setq
- lr-item-suffix-rest-first
- (reverse lr-item-suffix-rest-first))
- (while (<
- (length lr-item-suffix-rest-first)
- parser-generator--look-ahead-number)
+ (let ((new-first))
+ (dolist
+ (first-item
+ lr-item-suffix-rest-first)
+ (when (
+ <
+ (length first-item)
+ parser-generator--look-ahead-number)
+ (setq
+ first-item
+ (reverse
+ first-item))
+ (while (<
+ (length first-item)
+ parser-generator--look-ahead-number)
+ (push
+ parser-generator--eof-identifier
+ first-item))
+ (setq
+ first-item
+ (reverse first-item)))
(push
- parser-generator--eof-identifier
- lr-item-suffix-rest-first))
+ first-item
+ new-first))
(setq
lr-item-suffix-rest-first
- (reverse lr-item-suffix-rest-first)))
+ (reverse
+ new-first)))
(parser-generator--debug
(message
- "lr-item-suffix-rest-first: %s"
+ "lr-item-suffix-rest-first (after): %s"
lr-item-suffix-rest-first))
(let ((sub-production
(parser-generator--get-grammar-rhs