[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/parser-generator 181b499 178/434: Fixed bug in FIRST ge
From: |
ELPA Syncer |
Subject: |
[elpa] externals/parser-generator 181b499 178/434: Fixed bug in FIRST generation where multiple equal LHS:s |
Date: |
Mon, 29 Nov 2021 15:59:35 -0500 (EST) |
branch: externals/parser-generator
commit 181b49961892f451c1ac88b27fcf4143e41f8316
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>
Fixed bug in FIRST generation where multiple equal LHS:s
---
parser-generator.el | 58 +++++++++++++++++++++++++++++++++++--------
test/parser-generator-test.el | 9 +++++++
2 files changed, 56 insertions(+), 11 deletions(-)
diff --git a/parser-generator.el b/parser-generator.el
index 138bd59..96d017e 100644
--- a/parser-generator.el
+++ b/parser-generator.el
@@ -602,28 +602,63 @@
(let ((production-lhs (car p))
(production-rhs (cdr p)))
(parser-generator--debug
- (message "Production: %s -> %s" production-lhs
production-rhs))
+ (message
+ "Production: %s -> %s"
+ production-lhs
+ production-rhs))
;; Iterate all blocks in RHS
(let ((f-p-set))
(dolist (rhs-p production-rhs)
(let ((rhs-string rhs-p))
(let ((rhs-leading-terminals
- (parser-generator--f-set rhs-string `(,k ,i
,f-sets ,disallow-e-first) '(("" t 0)))))
+ (parser-generator--f-set
+ rhs-string
+ `(
+ ,k
+ ,i
+ ,f-sets
+ ,disallow-e-first)
+ '(("" t 0)))))
(parser-generator--debug
- (message "Leading %d terminals at index %s (%s)
-> %s = %s" k i production-lhs rhs-string rhs-leading-terminals))
+ (message
+ "Leading %d terminals at index %s (%s) -> %s =
%s"
+ k
+ i
+ production-lhs
+ rhs-string
+ rhs-leading-terminals))
(when rhs-leading-terminals
(when (and
(listp rhs-leading-terminals)
(> (length rhs-leading-terminals) 0))
- (dolist (rhs-leading-terminals-element
rhs-leading-terminals)
- (push rhs-leading-terminals-element
f-p-set)))))))
+ (dolist
+ (rhs-leading-terminals-element
rhs-leading-terminals)
+ (push
+ rhs-leading-terminals-element
+ f-p-set)))))))
+
+ ;; If we have multiple equal LHS
+ ;; merge them
+ (when (gethash production-lhs f-set)
+ (setq f-p-set
+ (append
+ f-p-set
+ (gethash production-lhs f-set))))
;; Make set distinct
(setq f-p-set (parser-generator--distinct f-p-set))
(parser-generator--debug
- (message "F_%s_%s(%s) = %s" i k production-lhs f-p-set))
- (puthash production-lhs (nreverse f-p-set) f-set))))
+ (message
+ "F_%s_%s(%s) = %s"
+ i
+ k
+ production-lhs
+ f-p-set))
+ (puthash
+ production-lhs
+ (nreverse f-p-set)
+ f-set))))
(puthash i f-set f-sets)
(setq i (+ i 1))))
(if disallow-e-first
@@ -757,10 +792,11 @@
((equal rhs-type 'EMPTY)
(if disallow-e-first
- (if (= leading-terminals-count 0)
- (setq all-leading-terminals-p nil)
- (setq leading-terminals (append leading-terminals
rhs-element))
- (setq leading-terminals-count (1+
leading-terminals-count)))
+ (when (= leading-terminals-count 0)
+ (setq all-leading-terminals-p nil))
+ ;; Add e-identifier to first when
+ ;; we have not found any leading terminals
+ ;; and we are at the last symbol in input-tape
(when (and
(= leading-terminals-count 0)
(= input-tape-index (1- input-tape-length)))
diff --git a/test/parser-generator-test.el b/test/parser-generator-test.el
index 943606d..3a5b5d2 100644
--- a/test/parser-generator-test.el
+++ b/test/parser-generator-test.el
@@ -305,6 +305,15 @@
(parser-generator--first 'S)))
(message "Passed first 4 with complex grammar with starting e-identifier
variant 1")
+ (parser-generator-set-grammar '((Sp S) (a b) ((Sp S) (S (S a S b)) (S e))
Sp))
+ (parser-generator-set-look-ahead-number 1)
+ (parser-generator-process-grammar)
+ (should
+ (equal
+ '((a) (e))
+ (parser-generator--first 'S)))
+ (message "Passed first 5 with complex grammar with starting e-identifier
variant 2")
+
(parser-generator-set-grammar '((Sp S) (a b) ((Sp S) (S (S a S b) e)) Sp))
(parser-generator-set-look-ahead-number 2)
- [elpa] externals/parser-generator 83298fe 099/434: Passing test for function that generates possible look-ahead permutations, (continued)
- [elpa] externals/parser-generator 83298fe 099/434: Passing test for function that generates possible look-ahead permutations, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator e9697ea 100/434: Added function that tests if a look-ahead is valid or not, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 53c09f7 119/434: Added hash-table for productions indexed by production-number, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 58e5806 129/434: Renamed plugin from parser to parser-generator, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 0695275 143/434: More updates to docs, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 1b17ef8 159/434: Added another unit tests for translations, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 04fdc96 167/434: Added unit-test for incremental translations, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator fa6237a 170/434: Added TODO items, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 71f03cc 171/434: Updated example, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 0b72792 177/434: Added failing unit tests for FIRST, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 181b499 178/434: Fixed bug in FIRST generation where multiple equal LHS:s,
ELPA Syncer <=
- [elpa] externals/parser-generator c4455db 179/434: Added TODO-item, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 84ffb4e 181/434: f-set max index is now set depending on if all non-terminals have been expanded or not, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 4aeed22 191/434: Passed tests for e-free first function, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 18d7c63 195/434: Added new function to merge lists of terminals, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 60d9968 202/434: Fixed valid look-ahead with k above 1, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 38223d3 206/434: Passed tests for generating grammar prefixes, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 8a6b752 208/434: Starting on adding support for LR k > 1 parser, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator d604092 223/434: Added failing unit test for e-free-first function, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 172d530 214/434: Improved handling of production LHS to enable multiple symbols, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator fbc8f8b 225/434: Removed dependency of hash-table of terminals for LR parser, ELPA Syncer, 2021/11/29