diff options
Diffstat (limited to 'test-suite/lalr/test-lr-script-expression.scm')
-rw-r--r-- | test-suite/lalr/test-lr-script-expression.scm | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/test-suite/lalr/test-lr-script-expression.scm b/test-suite/lalr/test-lr-script-expression.scm new file mode 100644 index 000000000..8cf1a9bf2 --- /dev/null +++ b/test-suite/lalr/test-lr-script-expression.scm @@ -0,0 +1,119 @@ +;;; test-lr-script-expression.scm -- +;; +;;Parse scripts, each line an expression. +;; + +(load "common-test.scm") + +(define (doit . tokens) + (let ((parser (lalr-parser (expect: 0) + (N O C T (left: A) (left: M) (nonassoc: U)) + + (script (lines) : (reverse $1)) + + (lines (lines line) : (cons $2 $1) + (line) : (list $1)) + + (line (T) : #\newline + (E T) : $1 + (error T) : (list 'error-clause $2)) + + (E (N) : $1 + (E A E) : ($2 $1 $3) + (E M E) : ($2 $1 $3) + (A E (prec: U)) : ($1 $2) + (O E C) : $2)))) + (parser (make-lexer tokens) error-handler))) + +;;; -------------------------------------------------------------------- +;;; Correct input + +(check + (doit (make-lexical-token 'T #f #\newline)) + => '(#\newline)) + +(check + (doit (make-lexical-token 'N #f 1) + (make-lexical-token 'T #f #\newline)) + => '(1)) + +(check + (doit (make-lexical-token 'N #f 1) + (make-lexical-token 'A #f +) + (make-lexical-token 'N #f 2) + (make-lexical-token 'T #f #\newline)) + => '(3)) + +(check + (doit (make-lexical-token 'N #f 1) + (make-lexical-token 'A #f +) + (make-lexical-token 'N #f 2) + (make-lexical-token 'M #f *) + (make-lexical-token 'N #f 3) + (make-lexical-token 'T #f #\newline)) + => '(7)) + +(check + (doit (make-lexical-token 'O #f #\() + (make-lexical-token 'N #f 1) + (make-lexical-token 'A #f +) + (make-lexical-token 'N #f 2) + (make-lexical-token 'C #f #\)) + (make-lexical-token 'M #f *) + (make-lexical-token 'N #f 3) + (make-lexical-token 'T #f #\newline)) + => '(9)) + +(check + (doit (make-lexical-token 'O #f #\() + (make-lexical-token 'N #f 1) + (make-lexical-token 'A #f +) + (make-lexical-token 'N #f 2) + (make-lexical-token 'C #f #\)) + (make-lexical-token 'M #f *) + (make-lexical-token 'N #f 3) + (make-lexical-token 'T #f #\newline) + + (make-lexical-token 'N #f 4) + (make-lexical-token 'M #f /) + (make-lexical-token 'N #f 5) + (make-lexical-token 'T #f #\newline)) + => '(9 4/5)) + +;;; -------------------------------------------------------------------- + +(check + ;;Successful error recovery. + (doit (make-lexical-token 'O #f #\() + (make-lexical-token 'N #f 1) + (make-lexical-token 'A #f +) + (make-lexical-token 'N #f 2) + (make-lexical-token 'M #f *) + (make-lexical-token 'N #f 3) + (make-lexical-token 'T #f #\newline) + + (make-lexical-token 'N #f 4) + (make-lexical-token 'M #f /) + (make-lexical-token 'N #f 5) + (make-lexical-token 'T #f #\newline)) + => '((error-clause #f) + 4/5)) + +(check + ;;Unexpected end of input. + (let ((r (doit (make-lexical-token 'N #f 1) + (make-lexical-token 'A #f +) + (make-lexical-token 'N #f 2)))) + (cons r *error*)) + => '(#f (error-handler "Syntax error: unexpected end of input"))) + +(check + ;;Unexpected end of input. + (let ((r (doit (make-lexical-token 'N #f 1) + (make-lexical-token 'A #f +) + (make-lexical-token 'T #f #\newline)))) + (cons r *error*)) + => '(((error-clause #f)) + (error-handler "Syntax error: unexpected token : " . T))) + +;;; end of file |