branch: externals/parser-generator
commit 8e462cf976986db5226252f90e089da0971481f0
Author: Christian Johansson <[email protected]>
Commit: Christian Johansson <[email protected]>
Validated generated action and goto-tables after precedence modification
---
parser-generator-lr.el | 1 -
parser-generator.el | 2 +-
test/parser-generator-lr-test.el | 60 ++++++++++++++++++++++++++--------------
3 files changed, 41 insertions(+), 22 deletions(-)
diff --git a/parser-generator-lr.el b/parser-generator-lr.el
index deedd45..6e4efb4 100644
--- a/parser-generator-lr.el
+++ b/parser-generator-lr.el
@@ -1801,7 +1801,6 @@
parser-generator-lex-analyzer--index
possible-look-aheads))
- ;; Maybe push both tokens here?
(push (car a-full) pushdown-list)
(push next-index pushdown-list)
(parser-generator-lex-analyzer--pop-token))))))
diff --git a/parser-generator.el b/parser-generator.el
index 3f7af8e..f92cb19 100644
--- a/parser-generator.el
+++ b/parser-generator.el
@@ -17,7 +17,7 @@
(defvar
parser-generator--debug
- t
+ nil
"Whether to print debug messages or not.")
(defvar
diff --git a/test/parser-generator-lr-test.el b/test/parser-generator-lr-test.el
index 7fb3b84..61904bc 100644
--- a/test/parser-generator-lr-test.el
+++ b/test/parser-generator-lr-test.el
@@ -125,6 +125,7 @@
(setq
parser-generator--context-sensitive-attributes
'(%prec))
+ (parser-generator-set-look-ahead-number 1)
(parser-generator-set-grammar
'(
(Sp S A B)
@@ -136,7 +137,6 @@
(B (a b c %prec FIRST))
)
Sp))
- (parser-generator-set-look-ahead-number 1)
(parser-generator-process-grammar)
(should-error
(parser-generator-lr-generate-parser-tables))
@@ -183,33 +183,53 @@
b-precedence))
(t nil))))))
(parser-generator-lr-generate-parser-tables)
- ;; TODO Verify generated action-table here
(should
(equal
- '(1 2 3)
+ '((0 ((A 1) (B 2) (S 3) (a 4))) (1 ((c 7))) (2 nil) (3 nil) (4 ((b 5))) (5
((c 6))) (6 nil) (7 nil))
(parser-generator-lr--get-expanded-goto-tables)))
(should
(equal
'((0 (((a) shift))) (1 (((c) shift))) (2 ((($) reduce 2))) (3 ((($)
accept))) (4 (((b) shift))) (5 (((c) shift))) (6 ((($) reduce 4))) (7 ((($)
reduce 1))))
(parser-generator-lr--get-expanded-action-tables)))
- (message "Grammar not conflicting anymore")
- (error "Quit here")
+ (message "Grammar not conflicting anymore solution #1")
- (let ((table-lr-items
- (parser-generator-lr--generate-goto-tables)))
- (parser-generator-lr--generate-action-tables
- table-lr-items)
- (should
- (equal
- '((0 (((a) shift)))
- (1 (((c) shift)))
- (2 ((($) reduce 2)))
- (3 ((($) accept)))
- (4 (((b) shift)))
- (5 (((c) shift)))
- (6 ((($) reduce 4)))
- (7 ((($) reduce 1))))
- (parser-generator-lr--get-expanded-action-tables))))
+ ;; Make a new context-sensitive precedence that
+ ;; makes production 1 take precedence over production 4
+ (parser-generator-set-grammar
+ '(
+ (Sp S A B)
+ (a b c)
+ (
+ (Sp S)
+ (S (A c) B)
+ (A (a b %prec FIRST))
+ (B (a b c))
+ )
+ Sp))
+ (parser-generator-process-grammar)
+ (parser-generator-lr-generate-parser-tables)
+ (should
+ (equal
+ '((0 ((A 1) (B 2) (S 3) (a 4))) (1 ((c 7))) (2 nil) (3 nil) (4 ((b 5))) (5
((c 6))) (6 nil) (7 nil))
+ (parser-generator-lr--get-expanded-goto-tables)))
+ (should
+ (equal
+ '((0 (((a) shift))) (1 (((c) shift))) (2 ((($) reduce 2))) (3 ((($)
accept))) (4 (((b) shift))) (5 (((c) reduce 3))) (6 ((($) reduce 4))) (7 ((($)
reduce 1))))
+ (parser-generator-lr--get-expanded-action-tables)))
+ (message "Grammar not conflicting anymore solution #2")
+ ;; Parse "a b c"
+ ;; stack 0
+ ;; a -> action shift, goto 4
+ ;; stack a 4
+ ;; b -> action shift, goto 5
+ ;; stack a 4 b 5
+ ;; c -> reduce 3 -> pop 4 = A, goto 1
+ ;; stack 0 A 1
+ ;; c -> shift, goto 7
+ ;; stack 0 A 1 c 7
+ ;; $ -> reduce 1 -> pop 4 = S, goto 3
+ ;; stack 0 S 3
+ ;; $ -> accept
(message "Passed tests for (parser-generator-lr--generate-action-tables)"))