32-way branching in intmap.scm, not 16-way
[bpt/guile.git] / test-suite / lalr / test-lr-associativity-04.scm
CommitLineData
1b101522
LC
1;;; test-lr-associativity-04.scm --
2;;
3;;Show how to use associativity.
4;;
5
6(load "common-test.scm")
7
8(define (doit . tokens)
9 (let ((parser (lalr-parser
10 (expect: 0)
11 (N (left: A)
12 (left: M))
13 (E (N) : $1
14
15 (E A E) : (list $1 $2 $3)
16 (E A E A E) : (list (list $1 $2 $3) $4 $5)
17
18 (E M E) : (list $1 $2 $3)
19 (E M E M E) : (list $1 $2 (list $3 $4 $5))
20
21 (E A E M E) : (list $1 $2 $3 $4 $5)
22 (E M E A E) : (list $1 $2 $3 $4 $5)
23 ))))
24 (parser (make-lexer tokens) error-handler)))
25
26;;; --------------------------------------------------------------------
27;;; Single operator.
28
29(check
30 (doit (make-lexical-token 'N #f 1))
31 => 1)
32
33(check
34 (doit (make-lexical-token 'N #f 1)
35 (make-lexical-token 'A #f '+)
36 (make-lexical-token 'N #f 2))
37 => '(1 + 2))
38
39(check
40 (doit (make-lexical-token 'N #f 1)
41 (make-lexical-token 'M #f '*)
42 (make-lexical-token 'N #f 2))
43 => '(1 * 2))
44
45;;; --------------------------------------------------------------------
46;;; Precedence.
47
48(check
49 (doit (make-lexical-token 'N #f 1)
50 (make-lexical-token 'A #f '+)
51 (make-lexical-token 'N #f 2)
52 (make-lexical-token 'M #f '*)
53 (make-lexical-token 'N #f 3))
54 => '(1 + (2 * 3)))
55
56(check
57 (doit (make-lexical-token 'N #f 1)
58 (make-lexical-token 'M #f '*)
59 (make-lexical-token 'N #f 2)
60 (make-lexical-token 'A #f '+)
61 (make-lexical-token 'N #f 3))
62 => '((1 * 2) + 3))
63
64;;; --------------------------------------------------------------------
65;;; Associativity.
66
67(check
68 (doit (make-lexical-token 'N #f 1)
69 (make-lexical-token 'A #f '+)
70 (make-lexical-token 'N #f 2)
71 (make-lexical-token 'A #f '+)
72 (make-lexical-token 'N #f 3))
73 => '((1 + 2) + 3))
74
75(check
76 (doit (make-lexical-token 'N #f 1)
77 (make-lexical-token 'M #f '*)
78 (make-lexical-token 'N #f 2)
79 (make-lexical-token 'M #f '*)
80 (make-lexical-token 'N #f 3))
81 => '((1 * 2) * 3))
82
83;;; end of file