[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/parser-generator d7daabf 111/434: Fixed bug with e-free
From: |
ELPA Syncer |
Subject: |
[elpa] externals/parser-generator d7daabf 111/434: Fixed bug with e-free-first function |
Date: |
Mon, 29 Nov 2021 15:59:20 -0500 (EST) |
branch: externals/parser-generator
commit d7daabff9d66a16ed45b18829fa2c7657dde9ef9
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>
Fixed bug with e-free-first function
---
parser.el | 55 ++++++++++++++++++++++++++++++++++++-------------------
1 file changed, 36 insertions(+), 19 deletions(-)
diff --git a/parser.el b/parser.el
index 0121699..4e6ca78 100644
--- a/parser.el
+++ b/parser.el
@@ -529,6 +529,7 @@
(f-sets (nth 2 state))
(disallow-e-first (nth 3 state)))
(parser--debug
+ (message "disallow-e-first: %s" disallow-e-first)
(message "input-tape-length: %s" input-tape-length)
(message "k: %s" k)
(message "i: %s" i))
@@ -539,7 +540,7 @@
(let ((leading-terminals (nth 0 stack-symbol))
(all-leading-terminals-p (nth 1 stack-symbol))
(input-tape-index (nth 2 stack-symbol))
- (e-first-p nil))
+ (e-first-p))
(parser--debug
(message "leading-terminals: %s" leading-terminals)
(message "all-leading-terminals-p: %s" all-leading-terminals-p)
@@ -629,7 +630,8 @@
(setq leading-terminals (butlast
leading-terminals (- leading-terminals-count k)))
(setq leading-terminals-count k)))))
(parser--debug
- (message "Found no subsets for %s %s" rhs-element
(1- i)))))
+ (message "Found no subsets for %s %s" rhs-element
(1- i)))
+ (setq all-leading-terminals-p nil)))
(setq all-leading-terminals-p nil)))
((equal rhs-type 'EMPTY)
@@ -725,15 +727,20 @@
(message "stack-topmost: %s" stack-topmost))
(let ((input-tape-index (car stack-topmost))
(first-length (car (cdr stack-topmost)))
- (first (car (cdr (cdr stack-topmost)))))
+ (first (car (cdr (cdr stack-topmost))))
+ (keep-looking t))
(while (and
+ keep-looking
(< input-tape-index input-tape-length)
(< first-length k))
(let ((symbol (nth input-tape-index input-tape)))
+ (parser--debug
+ (message "symbol index: %s from %s is: %s"
input-tape-index input-tape symbol))
(cond
((parser--valid-terminal-p symbol)
(setq first (append first (list symbol)))
(setq first-length (1+ first-length)))
+
((parser--valid-non-terminal-p symbol)
(parser--debug
(message "non-terminal symbol: %s" symbol))
@@ -743,26 +750,36 @@
(setq symbol-f-set (gethash symbol (gethash (1-
i-max) parser--f-sets))))
(parser--debug
(message "symbol-f-set: %s" symbol-f-set))
- (when (> (length symbol-f-set) 1)
+ (if (not symbol-f-set)
+ (progn
+ (parser--debug
+ (message "empty symbol-f-set, so stop looking"))
+ (setq keep-looking nil))
+
;; Handle this scenario here were a non-terminal can
result in different FIRST sets
- (let ((symbol-f-set-index 1)
- (symbol-f-set-length (length symbol-f-set)))
- (while (< symbol-f-set-index symbol-f-set-length)
- (let ((symbol-f-set-element (nth
symbol-f-set-index symbol-f-set)))
- (let ((alternative-first-length (+
first-length (length symbol-f-set-element)))
- (alternative-first (append first
symbol-f-set-element))
- (alternative-tape-index (1+
input-tape-index)))
- (parser--debug
- (message "alternative-first: %s"
alternative-first))
- (push `(,alternative-tape-index
,alternative-first-length ,alternative-first) stack)))
- (setq symbol-f-set-index (1+
symbol-f-set-index)))))
- (parser--debug
- (message "main-symbol-f-set: %s" (car symbol-f-set)))
- (setq first-length (+ first-length (length (car
symbol-f-set))))
- (setq first (append first (car symbol-f-set)))))))
+ (when (> (length symbol-f-set) 1)
+ (let ((symbol-f-set-index 1)
+ (symbol-f-set-length (length symbol-f-set)))
+ (while (< symbol-f-set-index symbol-f-set-length)
+ (let ((symbol-f-set-element (nth
symbol-f-set-index symbol-f-set)))
+ (let ((alternative-first-length (+
first-length (length symbol-f-set-element)))
+ (alternative-first (append first
symbol-f-set-element))
+ (alternative-tape-index (1+
input-tape-index)))
+ (parser--debug
+ (message "alternative-first: %s"
alternative-first))
+ (push `(,alternative-tape-index
,alternative-first-length ,alternative-first) stack)))
+ (setq symbol-f-set-index (1+
symbol-f-set-index)))))
+
+ (parser--debug
+ (message "main-symbol-f-set: %s" (car
symbol-f-set)))
+ (setq first-length (+ first-length (length (car
symbol-f-set))))
+ (setq first (append first (car symbol-f-set))))))))
(setq input-tape-index (1+ input-tape-index)))
(when (> first-length 0)
+ (parser--debug
+ (message "push to first-list: %s to %s" first first-list))
(push first first-list))))))
+
(setq first-list (sort first-list 'parser--sort-list))
first-list))))
- [elpa] externals/parser-generator 343fd72 104/434: Some parts of the action-table is generated, (continued)
- [elpa] externals/parser-generator 343fd72 104/434: Some parts of the action-table is generated, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator b2a0d71 112/434: Passed test for action-table generation, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 1c1177f 116/434: More work on LR-parser algorithm, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 9db14cd 118/434: Added TODO items, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 5784f3f 126/434: Updated README with link to separate document for grammar, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator edfb7b4 131/434: Moved lex-analyzer to separate file, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 8cda060 149/434: Made some functions public, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator c1d3707 150/434: Passing test for including SDT in Produductions, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator d36051c 103/434: Parser now creates hash table over productions to their production number, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator e3d3007 109/434: Tweaking of action-table generation for canonical LR-parser, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator d7daabf 111/434: Fixed bug with e-free-first function,
ELPA Syncer <=
- [elpa] externals/parser-generator 2be434c 114/434: Removed obsolete debug messages, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 89d128c 123/434: Added TODO item, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 044f33a 151/434: Added more support for SDT, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 96f128f 155/434: More various stuff, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator a586a0e 162/434: More work on incremental parsing, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 6d323a4 120/434: Implemented reduce action of LR-parser algorithm, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 9b44827 124/434: Optimized LR-parser with hash-tables, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 01fc56f 127/434: Updated list of grammars, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 4ef0430 133/434: White-space fix, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator b2fd896 136/434: Added support for indexed tokens, ELPA Syncer, 2021/11/29