summaryrefslogtreecommitdiff
path: root/test-suite/lalr/test-lr-error-recovery-02.scm
diff options
context:
space:
mode:
Diffstat (limited to 'test-suite/lalr/test-lr-error-recovery-02.scm')
-rw-r--r--test-suite/lalr/test-lr-error-recovery-02.scm51
1 files changed, 51 insertions, 0 deletions
diff --git a/test-suite/lalr/test-lr-error-recovery-02.scm b/test-suite/lalr/test-lr-error-recovery-02.scm
new file mode 100644
index 000000000..a82498b50
--- /dev/null
+++ b/test-suite/lalr/test-lr-error-recovery-02.scm
@@ -0,0 +1,51 @@
+;;; test-lr-error-recovery-02.scm --
+;;
+;;Test error recovery policy when the synchronisation terminal has the
+;;same category of the lookahead that raises the error.
+;;
+
+(load "common-test.scm")
+
+(define (doit . tokens)
+ (let ((parser (lalr-parser (expect: 0)
+ (A B C)
+ (alphas (alpha) : $1
+ (alphas alpha) : $2)
+ (alpha (A B) : (list $1 $2)
+ (C) : $1
+ (error C) : 'error-form))))
+ (parser (make-lexer tokens) error-handler)))
+
+;;; --------------------------------------------------------------------
+;;; No error, just grammar tests.
+
+(check
+ (doit (make-lexical-token 'A #f 1)
+ (make-lexical-token 'B #f 2))
+ => '(1 2))
+
+(check
+ (doit (make-lexical-token 'C #f 3))
+ => '3)
+
+;;; --------------------------------------------------------------------
+;;; Successful error recovery.
+
+(check
+ ;;Error, recovery, end-of-input.
+ (let ((r (doit (make-lexical-token 'A #f 1)
+ (make-lexical-token 'C #f 3))))
+ (cons r *error*))
+ => '(error-form (error-handler "Syntax error: unexpected token : " . C)))
+
+(check
+ ;;Error, recovery, correct parse of "A B".
+ (let ((r (doit (make-lexical-token 'A #f 1)
+ (make-lexical-token 'C #f 3)
+ (make-lexical-token 'A #f 1)
+ (make-lexical-token 'B #f 2))))
+ (cons r *error*))
+ => '((1 2)
+ (error-handler "Syntax error: unexpected token : " . C)))
+
+;;; end of file