prefer compilers earlier in list
[bpt/guile.git] / test-suite / lalr / test-lr-associativity-03.scm
1 ;;; test-lr-associativity-01.scm --
2 ;;
3 ;;Show how to use left and right associativity. Notice that the
4 ;;terminal M is declared as non-associative; this influences the binding
5 ;;of values to the $n symbols in the semantic clauses. The semantic
6 ;;clause in the rule:
7 ;;
8 ;; (E M E M E) : (list $1 $2 (list $3 $4 $5))
9 ;;
10 ;;looks like it is right-associated, and it is because we have declared
11 ;;M as "right:".
12 ;;
13
14 (load "common-test.scm")
15
16 (define (doit . tokens)
17 (let ((parser (lalr-parser
18 (expect: 0)
19 (N (nonassoc: A)
20 (nonassoc: M))
21 (E (N) : $1
22 (E A E) : (list $1 $2 $3)
23 (E A E A E) : (list (list $1 $2 $3) $4 $5)
24 (E M E) : (list $1 $2 $3)
25 (E M E M E) : (list $1 $2 (list $3 $4 $5))))))
26 (parser (make-lexer tokens) error-handler)))
27
28 ;;; --------------------------------------------------------------------
29 ;;; Single operator.
30
31 (check
32 (doit (make-lexical-token 'N #f 1))
33 => 1)
34
35 (check
36 (doit (make-lexical-token 'N #f 1)
37 (make-lexical-token 'A #f '+)
38 (make-lexical-token 'N #f 2))
39 => '(1 + 2))
40
41 (check
42 (doit (make-lexical-token 'N #f 1)
43 (make-lexical-token 'M #f '*)
44 (make-lexical-token 'N #f 2))
45 => '(1 * 2))
46
47 ;;; --------------------------------------------------------------------
48 ;;; Precedence.
49
50 (check
51 (doit (make-lexical-token 'N #f 1)
52 (make-lexical-token 'A #f '+)
53 (make-lexical-token 'N #f 2)
54 (make-lexical-token 'M #f '*)
55 (make-lexical-token 'N #f 3))
56 => '(1 + (2 * 3)))
57
58 (check
59 (doit (make-lexical-token 'N #f 1)
60 (make-lexical-token 'M #f '*)
61 (make-lexical-token 'N #f 2)
62 (make-lexical-token 'A #f '+)
63 (make-lexical-token 'N #f 3))
64 => '((1 * 2) + 3))
65
66 ;;; --------------------------------------------------------------------
67 ;;; Associativity.
68
69 (check
70 (doit (make-lexical-token 'N #f 1)
71 (make-lexical-token 'A #f '+)
72 (make-lexical-token 'N #f 2)
73 (make-lexical-token 'A #f '+)
74 (make-lexical-token 'N #f 3))
75 => '((1 + 2) + 3))
76
77 (check
78 (doit (make-lexical-token 'N #f 1)
79 (make-lexical-token 'M #f '*)
80 (make-lexical-token 'N #f 2)
81 (make-lexical-token 'M #f '*)
82 (make-lexical-token 'N #f 3))
83 => '(1 * (2 * 3)))
84
85 ;;; end of file