1 ;;; test-lr-script-expression.scm --
3 ;;Parse scripts, each line an expression.
6 (load "common-test.scm")
8 (define (doit . tokens)
9 (let ((parser (lalr-parser (expect: 0)
10 (N O C T (left: A) (left: M) (nonassoc: U))
12 (script (lines) : (reverse $1))
14 (lines (lines line) : (cons $2 $1)
19 (error T) : (list 'error-clause $2))
24 (A E (prec: U)) : ($1 $2)
26 (parser (make-lexer tokens) error-handler)))
28 ;;; --------------------------------------------------------------------
32 (doit (make-lexical-token 'T #f #\newline))
36 (doit (make-lexical-token 'N #f 1)
37 (make-lexical-token 'T #f #\newline))
41 (doit (make-lexical-token 'N #f 1)
42 (make-lexical-token 'A #f +)
43 (make-lexical-token 'N #f 2)
44 (make-lexical-token 'T #f #\newline))
48 (doit (make-lexical-token 'N #f 1)
49 (make-lexical-token 'A #f +)
50 (make-lexical-token 'N #f 2)
51 (make-lexical-token 'M #f *)
52 (make-lexical-token 'N #f 3)
53 (make-lexical-token 'T #f #\newline))
57 (doit (make-lexical-token 'O #f #\()
58 (make-lexical-token 'N #f 1)
59 (make-lexical-token 'A #f +)
60 (make-lexical-token 'N #f 2)
61 (make-lexical-token 'C #f #\))
62 (make-lexical-token 'M #f *)
63 (make-lexical-token 'N #f 3)
64 (make-lexical-token 'T #f #\newline))
68 (doit (make-lexical-token 'O #f #\()
69 (make-lexical-token 'N #f 1)
70 (make-lexical-token 'A #f +)
71 (make-lexical-token 'N #f 2)
72 (make-lexical-token 'C #f #\))
73 (make-lexical-token 'M #f *)
74 (make-lexical-token 'N #f 3)
75 (make-lexical-token 'T #f #\newline)
77 (make-lexical-token 'N #f 4)
78 (make-lexical-token 'M #f /)
79 (make-lexical-token 'N #f 5)
80 (make-lexical-token 'T #f #\newline))
83 ;;; --------------------------------------------------------------------
86 ;;Successful error recovery.
87 (doit (make-lexical-token 'O #f #\()
88 (make-lexical-token 'N #f 1)
89 (make-lexical-token 'A #f +)
90 (make-lexical-token 'N #f 2)
91 (make-lexical-token 'M #f *)
92 (make-lexical-token 'N #f 3)
93 (make-lexical-token 'T #f #\newline)
95 (make-lexical-token 'N #f 4)
96 (make-lexical-token 'M #f /)
97 (make-lexical-token 'N #f 5)
98 (make-lexical-token 'T #f #\newline))
99 => '((error-clause #f)
103 ;;Unexpected end of input.
104 (let ((r (doit (make-lexical-token 'N #f 1)
105 (make-lexical-token 'A #f +)
106 (make-lexical-token 'N #f 2))))
108 => '(#f (error-handler "Syntax error: unexpected end of input")))
111 ;;Unexpected end of input.
112 (let ((r (doit (make-lexical-token 'N #f 1)
113 (make-lexical-token 'A #f +)
114 (make-lexical-token 'T #f #\newline))))
116 => '(((error-clause #f))
117 (error-handler "Syntax error: unexpected token : " . T)))