Add Boucher's `lalr-scm' as the `(system base lalr)' module.
[bpt/guile.git] / test-suite / lalr / test-lr-script-expression.scm
CommitLineData
1b101522
LC
1;;; test-lr-script-expression.scm --
2;;
3;;Parse scripts, each line an expression.
4;;
5
6(load "common-test.scm")
7
8(define (doit . tokens)
9 (let ((parser (lalr-parser (expect: 0)
10 (N O C T (left: A) (left: M) (nonassoc: U))
11
12 (script (lines) : (reverse $1))
13
14 (lines (lines line) : (cons $2 $1)
15 (line) : (list $1))
16
17 (line (T) : #\newline
18 (E T) : $1
19 (error T) : (list 'error-clause $2))
20
21 (E (N) : $1
22 (E A E) : ($2 $1 $3)
23 (E M E) : ($2 $1 $3)
24 (A E (prec: U)) : ($1 $2)
25 (O E C) : $2))))
26 (parser (make-lexer tokens) error-handler)))
27
28;;; --------------------------------------------------------------------
29;;; Correct input
30
31(check
32 (doit (make-lexical-token 'T #f #\newline))
33 => '(#\newline))
34
35(check
36 (doit (make-lexical-token 'N #f 1)
37 (make-lexical-token 'T #f #\newline))
38 => '(1))
39
40(check
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))
45 => '(3))
46
47(check
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))
54 => '(7))
55
56(check
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))
65 => '(9))
66
67(check
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)
76
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))
81 => '(9 4/5))
82
83;;; --------------------------------------------------------------------
84
85(check
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)
94
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)
100 4/5))
101
102(check
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))))
107 (cons r *error*))
108 => '(#f (error-handler "Syntax error: unexpected end of input")))
109
110(check
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))))
115 (cons r *error*))
116 => '(((error-clause #f))
117 (error-handler "Syntax error: unexpected token : " . T)))
118
119;;; end of file