[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/parser-generator 65d9ce2 106/434: Fixed a bug with E-FR
From: |
ELPA Syncer |
Subject: |
[elpa] externals/parser-generator 65d9ce2 106/434: Fixed a bug with E-FREE-FIRST function and function that validates a set of LR-items |
Date: |
Mon, 29 Nov 2021 15:59:19 -0500 (EST) |
branch: externals/parser-generator
commit 65d9ce2d5161c70b6c1ae861a57919dffbc84672
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>
Fixed a bug with E-FREE-FIRST function and function that validates a set of
LR-items
---
parser-lr.el | 4 +++-
parser.el | 21 ++++++++++++++++++---
test/parser-test.el | 8 ++++++++
3 files changed, 29 insertions(+), 4 deletions(-)
diff --git a/parser-lr.el b/parser-lr.el
index b46fb9d..9a33364 100644
--- a/parser-lr.el
+++ b/parser-lr.el
@@ -269,7 +269,9 @@
(message "a-look-ahead: %s" a-look-ahead))
;; The only sets of LR items which need to be tested are those that
contain a dot at the right end of a production
- (unless a-look-ahead
+ (when (and
+ (nth 1 a)
+ (not a-look-ahead))
(setq a-follow (nth 3 a))
(parser--debug
diff --git a/parser.el b/parser.el
index 61df8fd..d4a110b 100644
--- a/parser.el
+++ b/parser.el
@@ -29,6 +29,10 @@
nil
"Generated F-sets for grammar.")
+(defvar parser--f-free-sets
+ nil
+ "Generated e-free F-sets for grammar.")
+
(defvar parser--look-ahead-number
nil
"Current look-ahead number used.")
@@ -68,7 +72,8 @@
(defun parser--clear-cache ()
"Clear cache."
- (setq parser--f-sets nil))
+ (setq parser--f-sets nil)
+ (setq parser--f-free-sets nil))
(defun parser--distinct (elements)
"Return distinct of ELEMENTS."
@@ -658,8 +663,13 @@
(let ((productions (parser--get-grammar-productions))
(k parser--look-ahead-number))
(let ((i-max (length productions)))
+
;; Generate F-sets only once per grammar
- (unless parser--f-sets
+ (unless (or
+ (and (not disallow-e-first)
+ parser--f-sets)
+ (and disallow-e-first
+ parser--f-free-sets))
(let ((f-sets (make-hash-table :test 'equal))
(i 0))
(while (< i i-max)
@@ -695,6 +705,8 @@
(puthash production-lhs (nreverse f-p-set) f-set))))
(puthash i f-set f-sets)
(setq i (+ i 1))))
+ (if disallow-e-first
+ (setq parser--f-free-sets f-sets))
(setq parser--f-sets f-sets)))
(parser--debug
@@ -723,7 +735,10 @@
((parser--valid-non-terminal-p symbol)
(parser--debug
(message "non-terminal symbol: %s" symbol))
- (let ((symbol-f-set (gethash symbol (gethash (1- i-max)
parser--f-sets))))
+ (let ((symbol-f-set))
+ (if disallow-e-first
+ (setq symbol-f-set (gethash symbol (gethash (1-
i-max) parser--f-free-sets)))
+ (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)
diff --git a/test/parser-test.el b/test/parser-test.el
index 7cb3ee8..681709c 100644
--- a/test/parser-test.el
+++ b/test/parser-test.el
@@ -313,6 +313,14 @@
(parser--e-free-first 'S)))
(message "Passed empty-free-first 2 with complex grammar")
+ (parser--set-look-ahead-number 1)
+ (parser--process-grammar)
+ (should
+ (equal
+ '((c))
+ (parser--e-free-first '(S b a))))
+ (message "Passed empty-free-first 1 with complex grammar")
+
(message "Passed tests for (parser--empty-free-first)"))
(defun parser-test--valid-grammar-p ()
- [elpa] externals/parser-generator bdbedf4 078/434: Suffixes in LR-items that only contain e-identifier are now set as nil, (continued)
- [elpa] externals/parser-generator bdbedf4 078/434: Suffixes in LR-items that only contain e-identifier are now set as nil, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 0e075d7 081/434: Fixed issue with algorithm 5.9, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator fe6037b 088/434: Generating valid GOTO-table, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator d5284b5 091/434: Added algorithm 5.10, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 0304b78 092/434: Added a unit-test to invalidate LR-items, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 69bfe16 006/434: Removed white-space, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 1613e2e 096/434: Byte-compilation and unit tests working after refactor, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 31c7ba7 098/434: Work on function that generates all possible look-aheads, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 53980d4 102/434: More documentation, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 882d725 105/434: Added TODO item, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 65d9ce2 106/434: Fixed a bug with E-FREE-FIRST function and function that validates a set of LR-items,
ELPA Syncer <=
- [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