[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/parser-generator 60d9968 202/434: Fixed valid look-ahea
From: |
ELPA Syncer |
Subject: |
[elpa] externals/parser-generator 60d9968 202/434: Fixed valid look-ahead with k above 1 |
Date: |
Mon, 29 Nov 2021 15:59:41 -0500 (EST) |
branch: externals/parser-generator
commit 60d9968557248104b9263cc916a38e653a251b98
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>
Fixed valid look-ahead with k above 1
---
parser-generator-lr.el | 3 +++
parser-generator.el | 21 ++++++++++-------
test/parser-generator-test.el | 52 ++++++++++++++++++++++++++++++++++++++++++-
3 files changed, 67 insertions(+), 9 deletions(-)
diff --git a/parser-generator-lr.el b/parser-generator-lr.el
index 40481da..faec337 100644
--- a/parser-generator-lr.el
+++ b/parser-generator-lr.el
@@ -70,6 +70,7 @@
(when eff
;; Go through eff-items and see if any item is
a valid look-ahead of grammar
;; in that case save in action table a shift
action here
+ ;; TODO Verify that stuff like aeee is valid
look-ahead if look-ahead is 4
(let ((eff-index 0)
(eff-item)
(eff-length (length eff))
@@ -156,6 +157,8 @@
(table-lr-items (make-hash-table :test 'equal))
(e-list))
+ ;; TODO Verify what symbols should consist of if k > 1
+
(let ((e-list-index 0)
(e-list-length parser-generator--look-ahead-number))
(while (< e-list-index e-list-length)
diff --git a/parser-generator.el b/parser-generator.el
index 703f6fe..2157d04 100644
--- a/parser-generator.el
+++ b/parser-generator.el
@@ -103,7 +103,15 @@
(let ((terminals-max-index (1- (length terminals)))
(terminal-index)
(look-ahead-length)
- (look-ahead))
+ (look-ahead)
+ (e-list))
+
+ (let ((e-list-index 0)
+ (e-list-length parser-generator--look-ahead-number))
+ (while (< e-list-index e-list-length)
+ (push parser-generator--e-identifier e-list)
+ (setq e-list-index (1+ e-list-index))))
+
(while stack
(let ((item (pop stack)))
(setq terminal-index (nth 0 item))
@@ -130,15 +138,12 @@
(if look-ahead
(progn
- (when (= look-ahead-length k)
- (setq look-ahead-to-add (reverse look-ahead)))
-
- (when (= look-ahead-length (1- k))
+ (while (< look-ahead-length k)
(push parser-generator--e-identifier look-ahead)
- (setq look-ahead-to-add (reverse look-ahead))))
+ (setq look-ahead-length (1+ look-ahead-length)))
+ (setq look-ahead-to-add (reverse look-ahead)))
- (when (= k 1)
- (setq look-ahead-to-add `(,parser-generator--e-identifier))))
+ (setq look-ahead-to-add e-list))
(when (and look-ahead-to-add
(not (gethash look-ahead-to-add added-look-aheads)))
diff --git a/test/parser-generator-test.el b/test/parser-generator-test.el
index 7efe589..ec8e1b8 100644
--- a/test/parser-generator-test.el
+++ b/test/parser-generator-test.el
@@ -20,10 +20,18 @@
(should
(equal
+ nil
+ (parser-generator--valid-look-ahead-p '("a" "b"))))
+ (should
+ (equal
t
(parser-generator--valid-look-ahead-p "a")))
(should
(equal
+ nil
+ (parser-generator--valid-look-ahead-p "A")))
+ (should
+ (equal
t
(parser-generator--valid-look-ahead-p "b")))
(should
@@ -36,9 +44,51 @@
(parser-generator--valid-look-ahead-p "d")))
(should
(equal
+ nil
+ (parser-generator--valid-look-ahead-p 'f)))
+ (should
+ (equal
t
(parser-generator--valid-look-ahead-p 'e)))
+ (message "Passed with look-ahead number is 1")
+
+ ;; TODO Test with look-ahead number = 2 here
+
+ (parser-generator-set-look-ahead-number 2)
+ (parser-generator-set-grammar '((S A) ("a" "b") ((S A) (A ("b" "a"))) S))
+ (parser-generator-process-grammar)
+ (should
+ (equal
+ t
+ (parser-generator--valid-look-ahead-p '("a" "a"))))
+ (should
+ (equal
+ nil
+ (parser-generator--valid-look-ahead-p "a")))
+ (should
+ (equal
+ t
+ (parser-generator--valid-look-ahead-p '("b" "b"))))
+ (should
+ (equal
+ nil
+ (parser-generator--valid-look-ahead-p '("a" "c"))))
+ (should
+ (equal
+ nil
+ (parser-generator--valid-look-ahead-p '("a" "d"))))
+ (should
+ (equal
+ nil
+ (parser-generator--valid-look-ahead-p '(f e))))
+ (should
+ (equal
+ t
+ (parser-generator--valid-look-ahead-p '(e e))))
+
+ (message "Passed with look-ahead number is 2")
+
(message "Passed tests for (parser-generator--valid-look-ahead-p)"))
(defun parser-generator-test--get-grammar-look-aheads ()
@@ -59,7 +109,7 @@
(should
(equal
- '(("a" "a") ("a" "b") ("a" e) ("b" "a") ("b" "b") ("b" e))
+ '(("a" "a") ("a" "b") ("a" e) ("b" "a") ("b" "b") ("b" e) (e e))
(parser-generator--get-grammar-look-aheads)))
(message "Passed tests for (parser-generator--get-grammar-look-aheads)"))
- [elpa] externals/parser-generator 1b17ef8 159/434: Added another unit tests for translations, (continued)
- [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, 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 <=
- [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
- [elpa] externals/parser-generator c2d2d0d 239/434: Fixed FIRST calculating when building lr-item sets, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator a516e3f 234/434: Started on new test for LR(2) Parser, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 06c09bc 254/434: Removed commented-out code, ELPA Syncer, 2021/11/29