[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/parser-generator 84ffb4e 181/434: f-set max index is no
From: |
ELPA Syncer |
Subject: |
[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 |
Date: |
Mon, 29 Nov 2021 15:59:36 -0500 (EST) |
branch: externals/parser-generator
commit 84ffb4e5ea1e18b0c6ca902db370b8202c6f3e45
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>
f-set max index is now set depending on if all non-terminals have been
expanded or not
---
parser-generator.el | 57 +++++++++++++++++++++++++++++--------------
test/parser-generator-test.el | 17 -------------
2 files changed, 39 insertions(+), 35 deletions(-)
diff --git a/parser-generator.el b/parser-generator.el
index 6b3dcae..bb77a76 100644
--- a/parser-generator.el
+++ b/parser-generator.el
@@ -30,10 +30,18 @@
nil
"Generated F-sets for grammar.")
+(defvar parser-generator--f-sets-max-index
+ nil
+ "Max index for generated F-sets for grammar.")
+
(defvar parser-generator--f-free-sets
nil
"Generated e-free F-sets for grammar.")
+(defvar parser-generator--f-free-sets-max-index
+ nil
+ "Max index for generated e-free F-sets for grammar.")
+
(defvar parser-generator--look-ahead-number
nil
"Current look-ahead number used.")
@@ -588,13 +596,14 @@
parser-generator--f-free-sets)
(let ((productions (parser-generator--get-grammar-productions))
(k parser-generator--look-ahead-number))
- (let ((i-max (* 2 (length productions)))
- (disallow-set '(nil t)))
+ (let ((disallow-set '(nil t))
+ (expanded-all nil))
(dolist (disallow-e-first disallow-set)
(let ((f-sets (make-hash-table :test 'equal))
(i 0))
- (while (< i i-max)
+ (while (not expanded-all)
(parser-generator--debug (message "i = %s" i))
+ (setq expanded-all t)
(let ((f-set (make-hash-table :test 'equal)))
;; Iterate all productions, set F_i
@@ -611,7 +620,8 @@
(let ((f-p-set))
(dolist (rhs-p production-rhs)
(let ((rhs-string rhs-p))
- (let ((rhs-leading-terminals
+ (let ((rhs-leading-terminals)
+ (f-set-return
(parser-generator--f-set
rhs-string
`(
@@ -620,6 +630,10 @@
,f-sets
,disallow-e-first)
'(("" t 0)))))
+ (unless (nth 0 f-set-return)
+ (setq expanded-all nil))
+ (setq rhs-leading-terminals
+ (nth 1 f-set-return))
(parser-generator--debug
(message
"Leading %d terminals at index %s (%s) -> %s =
%s"
@@ -662,8 +676,11 @@
(puthash i f-set f-sets)
(setq i (+ i 1))))
(if disallow-e-first
- (setq parser-generator--f-free-sets f-sets)
- (setq parser-generator--f-sets f-sets)))))
+ (progn
+ (setq parser-generator--f-free-sets f-sets)
+ (setq parser-generator--f-free-sets-max-index (1- i)))
+ (setq parser-generator--f-sets f-sets)
+ (setq parser-generator--f-sets-max-index (1- i))))))
(parser-generator--debug
(message "Generated F-sets")))))
@@ -682,7 +699,8 @@
(k (nth 0 state))
(i (nth 1 state))
(f-sets (nth 2 state))
- (disallow-e-first (nth 3 state)))
+ (disallow-e-first (nth 3 state))
+ (expanded-all t))
(parser-generator--debug
(message "disallow-e-first: %s" disallow-e-first)
(message "input-tape-length: %s" input-tape-length)
@@ -706,7 +724,8 @@
(when (parser-generator--valid-e-p leading-terminals)
(setq e-first-p t))
- (parser-generator--debug (message "e-first-p: %s" e-first-p))
+ (parser-generator--debug
+ (message "e-first-p: %s" e-first-p))
;; If leading terminal is the e-identifier and we have input-tape
left, disregard it
(when (and
@@ -745,10 +764,11 @@
((equal rhs-type 'NON-TERMINAL)
(if (> i 0)
(let ((sub-terminal-sets
- (gethash rhs-element
- (gethash
- (1- i)
- f-sets))))
+ (gethash
+ rhs-element
+ (gethash
+ (1- i)
+ f-sets))))
(if sub-terminal-sets
(progn
(parser-generator--debug
@@ -782,7 +802,7 @@
(when (and
disallow-e-first
(= leading-terminals-count
0))
- (setq
alternative-all-leading-terminals-p nil)))
+ (setq
alternative-all-leading-terminals-p nil)))
(let ((sub-rhs-leading-terminals
(append
@@ -817,7 +837,9 @@
(setq leading-terminals-count k))))
(parser-generator--debug
(message "Found no subsets for %s %s" rhs-element
(1- i)))
+ (setq expanded-all nil)
(setq all-leading-terminals-p nil)))
+ (setq expanded-all nil)
(setq all-leading-terminals-p nil)))
((equal rhs-type 'E-IDENTIFIER)
@@ -843,7 +865,7 @@
(unless (listp leading-terminals)
(setq leading-terminals (list leading-terminals)))
(push leading-terminals f-set))))))
- f-set))
+ (list expanded-all f-set)))
;; Algorithm 5.5, p. 357
(defun parser-generator--first (β &optional disallow-e-first)
@@ -854,7 +876,6 @@
(error "Invalid sentential form β! %s" β))
(let ((productions (parser-generator--get-grammar-productions))
(k parser-generator--look-ahead-number))
- (let ((i-max (* 2 (length productions))))
;; Generate F-sets only once per grammar
(parser-generator--generate-f-sets)
@@ -900,8 +921,8 @@
(if (and
disallow-e-first
(= first-length 0))
- (setq symbol-f-set (gethash symbol (gethash (1-
i-max) parser-generator--f-free-sets)))
- (setq symbol-f-set (gethash symbol (gethash (1-
i-max) parser-generator--f-sets))))
+ (setq symbol-f-set (gethash symbol (gethash
parser-generator--f-free-sets-max-index parser-generator--f-free-sets)))
+ (setq symbol-f-set (gethash symbol (gethash
parser-generator--f-sets-max-index parser-generator--f-sets))))
(parser-generator--debug
(message "symbol-f-set: %s" symbol-f-set))
(if (not symbol-f-set)
@@ -935,7 +956,7 @@
(push first first-list))))))
(setq first-list (sort first-list 'parser-generator--sort-list))
- first-list))))
+ first-list)))
;; Definition at p. 343
(defun parser-generator--follow (β)
diff --git a/test/parser-generator-test.el b/test/parser-generator-test.el
index d9b6ba1..aa42d97 100644
--- a/test/parser-generator-test.el
+++ b/test/parser-generator-test.el
@@ -148,7 +148,6 @@
(parser-generator-set-grammar '((S) (a) ((S a)) S))
(parser-generator-set-look-ahead-number 1)
(parser-generator-process-grammar)
-
(should
(equal
'((a))
@@ -158,7 +157,6 @@
(parser-generator-set-grammar '((S) (a) ((S a)) S))
(parser-generator-set-look-ahead-number 1)
(parser-generator-process-grammar)
-
(should
(equal
'((a))
@@ -168,7 +166,6 @@
(parser-generator-set-grammar '((S) (a) ((S a)) S))
(parser-generator-set-look-ahead-number 2)
(parser-generator-process-grammar)
-
(should
(equal
'((a a))
@@ -178,7 +175,6 @@
(parser-generator-set-grammar '((S) (a) ((S a)) S))
(parser-generator-set-look-ahead-number 2)
(parser-generator-process-grammar)
-
(should
(equal
'((a))
@@ -188,7 +184,6 @@
(parser-generator-set-grammar '((S) ("a" "b" "c") ((S ("a" "b" "c"))) S))
(parser-generator-set-look-ahead-number 2)
(parser-generator-process-grammar)
-
(should
(equal
'(("a" "b"))
@@ -198,7 +193,6 @@
(parser-generator-set-grammar '((S) ("a" b "c") ((S ("a" b "c"))) S))
(parser-generator-set-look-ahead-number 3)
(parser-generator-process-grammar)
-
(should
(equal
'(("a" b "c"))
@@ -208,7 +202,6 @@
(parser-generator-set-grammar '((S A) (b) ((S A) (A b)) S))
(parser-generator-set-look-ahead-number 2)
(parser-generator-process-grammar)
-
(should
(equal
'((b))
@@ -218,7 +211,6 @@
(parser-generator-set-grammar '((S A) ("a" "b") ((S A) (A ("b" "a"))) S))
(parser-generator-set-look-ahead-number 2)
(parser-generator-process-grammar)
-
(should
(equal
'(("b" "a"))
@@ -228,7 +220,6 @@
(parser-generator-set-grammar '((S A) ("a" "b" "c" "d") ((S A) (A ("b" "a"
"c" "d"))) S))
(parser-generator-set-look-ahead-number 3)
(parser-generator-process-grammar)
-
(should
(equal
'(("b" "a" "c"))
@@ -238,7 +229,6 @@
(parser-generator-set-grammar '((S A B) ("c" "d") ((S A) (A B) (B "c" "d"))
S))
(parser-generator-set-look-ahead-number 1)
(parser-generator-process-grammar)
-
(should
(equal
'(("c") ("d"))
@@ -248,7 +238,6 @@
(parser-generator-set-grammar '((S A B) (a c d f) ((S (A a)) (A B) (B (c f)
d)) S))
(parser-generator-set-look-ahead-number 2)
(parser-generator-process-grammar)
-
(should
(equal
'((c f) (d a))
@@ -258,7 +247,6 @@
(parser-generator-set-grammar '((S A B) ("a" "c" "d" "m") ((S A) (A (B "a"
"m")) (B "c" "d")) S))
(parser-generator-set-look-ahead-number 3)
(parser-generator-process-grammar)
-
(should
(equal
'(("c" "a" "m") ("d" "a" "m"))
@@ -268,7 +256,6 @@
(parser-generator-set-grammar '((S A B C) (a b c) ((S (A B)) (A (B a) e) (B
(C b) C) (C c e)) S))
(parser-generator-set-look-ahead-number 1)
(parser-generator-process-grammar)
-
(should
(equal
'((a) (b) (c) (e))
@@ -279,7 +266,6 @@
(parser-generator-set-grammar '((S A B C) (a b c) ((S (A B)) (A (B a) e) (B
(C b) C) (C c e)) S))
(parser-generator-set-look-ahead-number 2)
(parser-generator-process-grammar)
-
(should
(equal
'((a b) (a c) (a) (b a) (b) (c a) (c) (c b) (e))
@@ -289,7 +275,6 @@
(parser-generator-set-grammar '((S A B C) (a b c) ((S (A B)) (A (B a) e) (B
(C b) C) (C c e)) S))
(parser-generator-set-look-ahead-number 3)
(parser-generator-process-grammar)
-
(should
(equal
'((a) (a b) (a c) (a c b) (b a) (b a b) (b a c) (b) (c a) (c a b) (c a c)
(c b) (c) (c b a) (e))
@@ -313,8 +298,6 @@
'((a) (e))
(parser-generator--first 'S)))
(message "Passed first 5 with complex grammar with starting e-identifier
variant 2")
-
- ;; TODO Fix i-max so it automatically is the highest needed number
(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 53c09f7 119/434: Added hash-table for productions indexed by production-number, (continued)
- [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, 2021/11/29
- [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 <=
- [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
- [elpa] externals/parser-generator 870eca2 232/434: Reduced depth of GOTO-table to always use one symbol, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 5b45b2b 235/434: Improved comments, ELPA Syncer, 2021/11/29