prefer compilers earlier in list
[bpt/guile.git] / test-suite / lalr / test-lr-associativity-04.scm
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