[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/parser-generator e89a740 138/434: Fixed bug with goto-t
From: |
ELPA Syncer |
Subject: |
[elpa] externals/parser-generator e89a740 138/434: Fixed bug with goto-table generation were tokens were strings |
Date: |
Mon, 29 Nov 2021 15:59:27 -0500 (EST) |
branch: externals/parser-generator
commit e89a7406c2f126c1b36673ef57c7344fbd358a18
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>
Fixed bug with goto-table generation were tokens were strings
---
parser-generator-lr.el | 11 ++++--
test/parser-generator-lr-test.el | 79 +++++++++++++++++++++++++++++++++++++++-
2 files changed, 85 insertions(+), 5 deletions(-)
diff --git a/parser-generator-lr.el b/parser-generator-lr.el
index 7b79eed..09fd2c4 100644
--- a/parser-generator-lr.el
+++ b/parser-generator-lr.el
@@ -436,7 +436,7 @@
(lr-item-suffix-rest (cdr lr-item-suffix)))
;; (a) If [A -> a . XiB, u] is in V(X1,...,Xi-1)
- (when (eq lr-item-suffix-first x)
+ (when (equal lr-item-suffix-first x)
;; Add [A -> aXi . B, u] to V(X1,...,Xi)
(let ((combined-prefix (append lr-item-prefix (list x))))
@@ -581,7 +581,8 @@
(let ((goto-table-length (length goto-table))
(goto-index 0)
(searching-match t)
- (next-index))
+ (next-index)
+ (possible-look-aheads))
(while (and
searching-match
@@ -589,6 +590,7 @@
(let ((goto-item (nth goto-index goto-table)))
(let ((goto-item-look-ahead (car goto-item))
(goto-item-next-index (car (cdr goto-item))))
+ (push goto-item-look-ahead possible-look-aheads)
(when (equal goto-item-look-ahead a)
(setq next-index goto-item-next-index)
@@ -598,9 +600,10 @@
(unless next-index
(error (format
- "In shift, found no goto-item for %s in index
%s"
+ "In shift, found no goto-item for %s in index
%s, expected one of %s"
a
- table-index)))
+ table-index
+ possible-look-aheads)))
(push a pushdown-list)
(push next-index pushdown-list)
diff --git a/test/parser-generator-lr-test.el b/test/parser-generator-lr-test.el
index df52e7f..71017fa 100644
--- a/test/parser-generator-lr-test.el
+++ b/test/parser-generator-lr-test.el
@@ -103,6 +103,43 @@
(message "Passed LR-items for example 5.30")
+ ;; Example 5.30, p. 389 but with terminals as strings
+ (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)
+
+ (parser-generator-lr--reset)
+ (parser-generator-lr--generate-goto-tables)
+
+ ;; (message "GOTO-table: %s" (parser-generator--hash-to-list
parser-generator-lr--goto-tables))
+ ;; (message "LR-items: %s" (parser-generator--hash-to-list
parser-generator-lr--items))
+
+ (should
+ (equal
+ '((0 ((S 1)))
+ (1 (("a" 2)))
+ (2 ((S 3)))
+ (3 (("a" 4) ("b" 5)))
+ (4 ((S 6)))
+ (5 nil)
+ (6 (("a" 4) ("b" 7)))
+ (7 nil))
+ (parser-generator--hash-to-list parser-generator-lr--goto-tables)))
+
+ (should
+ (equal
+ '((0 ((S nil (S "a" S "b") ("a")) (S nil (S "a" S "b") (e)) (S nil nil
("a")) (S nil nil (e)) (Sp nil (S) (e))))
+ (1 ((S (S) ("a" S "b") ("a")) (S (S) ("a" S "b") (e)) (Sp (S) nil (e))))
+ (2 ((S (S "a") (S "b") ("a")) (S (S "a") (S "b") (e)) (S nil (S "a" S
"b") ("a")) (S nil (S "a" S "b") ("b")) (S nil nil ("a")) (S nil nil ("b"))))
+ (3 ((S (S) ("a" S "b") ("a")) (S (S) ("a" S "b") ("b")) (S (S "a" S)
("b") ("a")) (S (S "a" S) ("b") (e))))
+ (4 ((S (S "a") (S "b") ("a")) (S (S "a") (S "b") ("b")) (S nil (S "a" S
"b") ("a")) (S nil (S "a" S "b") ("b")) (S nil nil ("a")) (S nil nil ("b"))))
+ (5 ((S (S "a" S "b") nil ("a")) (S (S "a" S "b") nil (e))))
+ (6 ((S (S) ("a" S "b") ("a")) (S (S) ("a" S "b") ("b")) (S (S "a" S)
("b") ("a")) (S (S "a" S) ("b") ("b"))))
+ (7 ((S (S "a" S "b") nil ("a")) (S (S "a" S "b") nil ("b")))))
+ (parser-generator--hash-to-list parser-generator-lr--items)))
+
+ (message "Passed LR-items for example 5.30 but with tokens as strings")
+
(message "Passed tests for (parser-r--generate-goto-tables)"))
(defun parser-generator-lr-test--items-for-prefix ()
@@ -263,8 +300,48 @@
(should-error
(parser-generator-lr--parse))
+ ;; Test with terminals as strings here
- ;; TODO Test with terminals as strings here
+ (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)
+ (parser-generator-lr--reset)
+
+ (setq
+ parser-generator-lex-analyzer--function
+ (lambda (index length)
+ (let* ((string '(("a" 1 . 2) ("a" 2 . 3) ("b" 3 . 4) ("b" 4 . 5)))
+ (string-length (length string))
+ (max-index (+ index length))
+ (tokens))
+ (while (and
+ (< index string-length)
+ (< index max-index))
+ (push (nth index string) tokens)
+ (setq index (1+ index)))
+ (nreverse tokens))))
+
+ (should
+ (equal
+ '(2 2 2 1 1)
+ (parser-generator-lr--parse)))
+
+ (setq
+ parser-generator-lex-analyzer--function
+ (lambda (index length)
+ (let* ((string '(("a" 1 . 2) ("a" 2 . 3) ("b" 3 . 4) ("b" 4 . 5) ("b" 5 .
6)))
+ (string-length (length string))
+ (max-index (+ index length))
+ (tokens))
+ (while (and
+ (< index string-length)
+ (< index max-index))
+ (push (nth index string) tokens)
+ (setq index (1+ index)))
+ (nreverse tokens))))
+
+ (should-error
+ (parser-generator-lr--parse))
(message "Passed tests for (parser-generator-lr--parse)"))
- [elpa] externals/parser-generator d435e50 122/434: Passing unit test for LR-parse, (continued)
- [elpa] externals/parser-generator d435e50 122/434: Passing unit test for LR-parse, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator a31da28 173/434: Updated Parser WIP items, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator aaec6fa 189/434: Work on e-free first tests, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 922033f 198/434: Various stuff, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator fe10d4a 196/434: Passed tests for first 3 and first 4 of complex grammar, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 4cba5aa 203/434: Made new TODO items, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator ef60d96 204/434: Added failing test for new function the generates grammar prefixes, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 76e30f1 210/434: Sorted lines in test file, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator e88abf0 117/434: More work on parser, added error-handling, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 8328ab3 130/434: Added unit test for failing LRk Grammar Parse, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator e89a740 138/434: Fixed bug with goto-table generation were tokens were strings,
ELPA Syncer <=
- [elpa] externals/parser-generator c667e18 121/434: Work on shift action in parsing algorithm, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator fab7e46 128/434: Fixed link to LRk grammar, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator bd06863 132/434: LR-parser now uses lex-analyzer for parsing, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator d14d427 140/434: Moved more about lex-analysis to separate document, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 1613e89 146/434: Added lex-analyzer get function, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 5c8a7a5 147/434: Preparations for SDT support, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 0e54a88 148/434: Optimized away one global variable, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 60e9c8a 153/434: Preparations for translation-support in LR-parser, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 7ba32ff 154/434: Only save translation if it produces anything, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator f621e77 161/434: Preparations for testing incremental parse, ELPA Syncer, 2021/11/29