[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/parser-generator bbdbd18 269/434: Started on test for L
From: |
ELPA Syncer |
Subject: |
[elpa] externals/parser-generator bbdbd18 269/434: Started on test for LR Parse k=0 |
Date: |
Mon, 29 Nov 2021 15:59:55 -0500 (EST) |
branch: externals/parser-generator
commit bbdbd187c8e8aa8ea2b54ba07eb08bd772d1a9c5
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>
Started on test for LR Parse k=0
---
test/parser-generator-lr-test.el | 285 ++++++++++++++++++++++++++++++++++++++-
1 file changed, 284 insertions(+), 1 deletion(-)
diff --git a/test/parser-generator-lr-test.el b/test/parser-generator-lr-test.el
index 88c4900..573297c 100644
--- a/test/parser-generator-lr-test.el
+++ b/test/parser-generator-lr-test.el
@@ -718,6 +718,288 @@
(message "Passed tests for (parser-generator-lr--parse-k-2)"))
+(defun parser-generator-lr-test-parse-k-0 ()
+ "Test `parser-generator-lr-parse' with k = 0."
+ (message "Started tests for (parser-generator-lr-parse) k = 0")
+
+ ;; https://en.wikipedia.org/wiki/LR_parser#Constructing_LR(0)_parsing_tables
+ ;; (0) S → E eof
+ ;; (1) E → E * B
+ ;; (2) E → E + B
+ ;; (3) E → B
+ ;; (4) B → 0
+ ;; (5) B → 1
+
+ (parser-generator-set-grammar
+ '((S E B) ("*" "+" "0" "1") ((S E) (E (E "*" B) (E "+" B) (B)) (B ("0")
("1"))) S))
+ (parser-generator-set-look-ahead-number 0)
+ (parser-generator-process-grammar)
+
+ (let ((lr-items (parser-generator-lr--generate-goto-tables)))
+ (parser-generator--debug
+ (message
+ "LR-items: %s"
+ (parser-generator--hash-to-list
+ lr-items)))
+
+ ;; Item set 0
+ ;; S → • E eof
+ ;; + E → • E * B
+ ;; + E → • E + B
+ ;; + E → • B
+ ;; + B → • 0
+ ;; + B → • 1
+
+ ;; Item set 1
+ ;; B → 0 •
+
+ ;; Item set 2
+ ;; B → 1 •
+
+ ;; Item set 3
+ ;; S → E • eof
+ ;; E → E • * B
+ ;; E → E • + B
+
+ ;; Item set 4
+ ;; E → B •
+
+ ;; Item set 5
+ ;; E → E * • B
+ ;; + B → • 0
+ ;; + B → • 1
+
+ ;; Item set 6
+ ;; E → E + • B
+ ;; + B → • 0
+ ;; + B → • 1
+
+ ;; Item set 7
+ ;; E → E * B •
+
+ ;; Item set 8
+ ;; E → E + B •
+
+ (should
+ (equal
+ '((0 (
+ ((S) nil (E $))
+ ((E) nil (E "*" B))
+ ((E) nil (E "+" B))
+ ((E) nil (B))
+ ((B) nil ("0"))
+ ((B) nil ("1"))
+ ))
+ (1 (((B) ("0") nil)))
+ (2 (((B) ("1") nil)))
+ (3 (
+ ((S) (E) ($))
+ ((E) (E) ("*" B))
+ ((E) (E) ("+" B))
+ ))
+ (4 (((E) (B) nil)))
+ (5 (
+ ((E) (E "*") (B))
+ ((B) nil ("1"))
+ ))
+ (6 (
+ ((E) (E "+") (B))
+ ((B) nil ("0"))
+ ((B) nil ("1"))
+ ))
+ (7 (((E) (E "*" B) nil)))
+ (8 (((E) (E "+" B) nil))))
+ (parser-generator--hash-to-list
+ lr-items)))
+ (message "Passed LR-items k = 0")
+
+ ;; TODO Replace all below
+
+ (parser-generator--debug
+ (message "GOTO-tables k = 2: %s"
+ (parser-generator--hash-to-list
+ parser-generator-lr--goto-tables
+ t)))
+
+ ;; state | a | b | c | $ | S | R | T
+ ;; -------+-----+-----+-----+-----+-----+-----+-----
+ ;; 1 | 2 | | | | 10 | 8 |
+ ;; -------+-----+-----+-----+-----+-----+-----+-----
+ ;; 2 | | 3 | | | | |
+ ;; -------+-----+-----+-----+-----+-----+-----+-----
+ ;; 3 | 4 | | 5 | | | | 7
+ ;; -------+-----+-----+-----+-----+-----+-----+-----
+ ;; 4 | 4 | | 5 | | | | 6
+ ;; -------+-----+-----+-----+-----+-----+-----+-----
+ ;; 5 | | | | | | |
+ ;; -------+-----+-----+-----+-----+-----+-----+-----
+ ;; 6 | | | | | | |
+ ;; -------+-----+-----+-----+-----+-----+-----+-----
+ ;; 7 | | | | | | |
+ ;; -------+-----+-----+-----+-----+-----+-----+-----
+ ;; 8 | 2 | | | | 9 | 8 |
+ ;; -------+-----+-----+-----+-----+-----+-----+-----
+ ;; 9 | | | | | | |
+ ;; -------+-----+-----+-----+-----+-----+-----+-----
+ ;; 10 | | | | | | |
+
+ (should
+ (equal
+ '((0 ((R 1) (S 2) (a 3)))
+ (1 ((R 1) (S 9) (a 3)))
+ (2 nil)
+ (3 ((b 4)))
+ (4 ((T 5) (a 6) (c 7)))
+ (5 nil)
+ (6 ((T 8) (a 6) (c 7)))
+ (7 nil)
+ (8 nil)
+ (9 nil))
+ (parser-generator--hash-to-list
+ parser-generator-lr--goto-tables)))
+ (message "Passed GOTO-tables k = 2")
+
+ ;; state | aa | ab | ac | a$ | ba | bb | bc | b$ | ca | cb | cc | c$ | $$
+ ;; ------+----+----+----+----+----+----+----+----+----+----+----+----+----
+ ;; 1 | | S | | | | | | | | | | |
+ ;; ------+----+----+----+----+----+----+----+----+----+----+----+----+----
+ ;; 2 | | | | | S | | S | S | | | | |
+ ;; ------+----+----+----+----+----+----+----+----+----+----+----+----+----
+ ;; 3 | S | R | S | S | | | | | S | | | S | R
+ ;; ------+----+----+----+----+----+----+----+----+----+----+----+----+----
+ ;; 4 | S | R | S | S | | | | | S | | | S | R
+ ;; ------+----+----+----+----+----+----+----+----+----+----+----+----+----
+ ;; 5 | | R | | | | | | | | | | | R
+ ;; ------+----+----+----+----+----+----+----+----+----+----+----+----+----
+ ;; 6 | | R | | | | | | | | | | | R
+ ;; ------+----+----+----+----+----+----+----+----+----+----+----+----+----
+ ;; 7 | | R | | | | | | | | | | | R
+ ;; ------+----+----+----+----+----+----+----+----+----+----+----+----+----
+ ;; 8 | | S | | | | | | | | | | | R
+ ;; ------+----+----+----+----+----+----+----+----+----+----+----+----+----
+ ;; 9 | | | | | | | | | | | | | R
+ ;; ------+----+----+----+----+----+----+----+----+----+----+----+----+----
+ ;; 10 | | | | | | | | | | | | | A
+
+ (parser-generator-lr--generate-action-tables
+ lr-items)
+ (parser-generator--debug
+ (message
+ "Action-tables k = 2: %s"
+ (parser-generator--hash-to-list parser-generator-lr--action-tables)))
+
+ (should
+ (equal
+ '(
+ (0 (((a b) shift)))
+ (1 ((($ $) reduce 2) ((a b) shift)))
+ (2 ((($ $) accept)))
+ (3 (((b $) shift) ((b c) shift) ((b a) shift)))
+ (4 ((($ $) reduce 6) ((a b) reduce 6) ((a $) shift) ((a c) shift) ((a
a) shift) ((c a) shift) ((c $) shift)))
+ (5 ((($ $) reduce 3) ((a b) reduce 3)))
+ (6 ((($ $) reduce 6) ((a b) reduce 6) ((a $) shift) ((a c) shift) ((a
a) shift) ((c a) shift) ((c $) shift)))
+ (7 ((($ $) reduce 5) ((a b) reduce 5)))
+ (8 ((($ $) reduce 4) ((a b) reduce 4)))
+ (9 ((($ $) reduce 1)))
+ )
+ (parser-generator--hash-to-list
+ parser-generator-lr--action-tables)))
+ (message "Passed ACTION-tables k = 2")
+
+ )
+
+ (let ((buffer (generate-new-buffer "*a*")))
+ (switch-to-buffer buffer)
+ (kill-region (point-min) (point-max))
+ (insert "abac")
+
+ (parser-generator-set-grammar
+ '((Sp S R T) ("a" "b" "c") ((Sp S) (S (R S) (R)) (R ("a" "b" T)) (T ("a"
T) ("c") (e))) Sp))
+ (parser-generator-set-look-ahead-number 2)
+ (parser-generator-process-grammar)
+ (parser-generator-lr-generate-parser-tables)
+
+ ;; Setup lex-analyzer
+ (setq
+ parser-generator-lex-analyzer--function
+ (lambda (index)
+ (with-current-buffer buffer
+ (when (<= (+ index 1) (point-max))
+ (let ((start index)
+ (end (+ index 1)))
+ (let ((token (buffer-substring-no-properties start end)))
+ `(,token ,start . ,end)))))))
+ (setq
+ parser-generator-lex-analyzer--get-function
+ (lambda (token)
+ (with-current-buffer buffer
+ (let ((start (car (cdr token)))
+ (end (cdr (cdr token))))
+ (when (<= end (point-max))
+ (buffer-substring-no-properties start end))))))
+
+ (should
+ (equal
+ '(5 4 3 2)
+ (parser-generator-lr-parse)))
+
+ (message "Passed parse with k = 0 # 1")
+
+ (switch-to-buffer buffer)
+ (kill-region (point-min) (point-max))
+ (insert "aba")
+
+ (should
+ (equal
+ '(6 4 3 2)
+ (parser-generator-lr-parse)))
+
+ (message "Passed parse with k = 0 # 2")
+
+ (kill-buffer))
+
+ (let ((buffer (generate-new-buffer "*a*")))
+ (switch-to-buffer buffer)
+ (kill-region (point-min) (point-max))
+ (insert "abac")
+
+ (parser-generator-set-grammar
+ '((Sp S R T) ("a" "b" "c") ((Sp S) (S (R S) (R)) (R ("a" "b" T
(lambda(args) (list "begin" (nth 2 args) "end")))) (T ("a" T (lambda(args)
"test")) ("c") (e))) Sp))
+ (parser-generator-set-look-ahead-number 2)
+ (parser-generator-process-grammar)
+ (parser-generator-lr-generate-parser-tables)
+
+ ;; Setup lex-analyzer
+ (setq
+ parser-generator-lex-analyzer--function
+ (lambda (index)
+ (with-current-buffer buffer
+ (when (<= (+ index 1) (point-max))
+ (let ((start index)
+ (end (+ index 1)))
+ (let ((token (buffer-substring-no-properties start end)))
+ `(,token ,start . ,end)))))))
+ (setq
+ parser-generator-lex-analyzer--get-function
+ (lambda (token)
+ (with-current-buffer buffer
+ (let ((start (car (cdr token)))
+ (end (cdr (cdr token))))
+ (when (<= end (point-max))
+ (buffer-substring-no-properties start end))))))
+
+ (should
+ (equal
+ '("begin" "test" "end")
+ (parser-generator-lr-translate)))
+
+ (message "Passed translation k=0")
+
+ (kill-buffer))
+
+
+ (message "Passed tests for (parser-generator-lr--parse-k-0)"))
+
(defun parser-generator-lr-test-translate ()
"Test `parser-generator-lr-translate'."
(message "Started tests for (parser-generator-lr-translate)")
@@ -905,7 +1187,8 @@
(parser-generator-lr-test--generate-action-tables)
(parser-generator-lr-test-parse)
(parser-generator-lr-test-translate)
- (parser-generator-lr-test-parse-k-2))
+ (parser-generator-lr-test-parse-k-2)
+ (parser-generator-lr-test-parse-k-0))
(provide 'parser-generator-lr-test)
- [elpa] externals/parser-generator 640feed 216/434: Passing all tests for canonical LRk Parser with k = 1, (continued)
- [elpa] externals/parser-generator 640feed 216/434: Passing all tests for canonical LRk Parser with k = 1, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator e5aa179 218/434: Some fixes for LRk parser k > 1, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 2a9a23e 219/434: More debugging, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator ddd5967 221/434: Passed test for nested translations, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator bc817d1 224/434: Passing all tests for k=1 again, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator b2f1d7a 236/434: More debugging k > 1, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 16f6586 242/434: Fixed bug in lr-item generation were look-ahead was disregarded, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 36701c0 238/434: Optimized closure algorithm to only use possible next-symbols instead of iterating all symbols, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 3e096f7 258/434: Improved translation handling for each production, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 96cd5de 259/434: Improved validation of grammar structure, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator bbdbd18 269/434: Started on test for LR Parse k=0,
ELPA Syncer <=
- [elpa] externals/parser-generator 56363c1 263/434: Fixed last TODO items, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 175a579 275/434: Passed test for generation action-table LR(0) grammar, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator ecbbf21 290/434: Added test for exported translator, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator cecf8fd 287/434: More TODO items, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 688e685 291/434: Lex-analyzer index is now buffer-local variable, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 0702765 293/434: Added incremental unit test for exported parser/translator, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 552c0c5 304/434: Using better hash-key for goto-tables generation, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator d0d3201 299/434: FIRST calculation now handles cyclic productions, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 5145cda 306/434: Improved hash-key integrity for LRk Parser, ELPA Syncer, 2021/11/29
- [elpa] externals/parser-generator 2227cae 313/434: Moved validation of valid lr-item set to generation of goto-tables, ELPA Syncer, 2021/11/29