Merge branch 'master' into wip-manual-2
[bpt/guile.git] / test-suite / lalr / test-lr-associativity-01.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 right associative; this influences the
5 ;;binding of values to the $n symbols in the semantic clauses. The
6 ;;semantic 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 (left: A)
20 (right: M)
21 (nonassoc: U))
22 (E (N) : $1
23 (E A E) : (list $1 $2 $3)
24 (E M E) : (list $1 $2 $3)
25 (E M E M E) : (list $1 $2 (list $3 $4 $5))
26 (A E (prec: U)) : (list '- $2)))))
27 (parser (make-lexer tokens) error-handler)))
28
29 ;;; --------------------------------------------------------------------
30 ;;; Single operator.
31
32 (check
33 (doit (make-lexical-token 'N #f 1))
34 => 1)
35
36 (check
37 (doit (make-lexical-token 'N #f 1)
38 (make-lexical-token 'A #f '+)
39 (make-lexical-token 'N #f 2))
40 => '(1 + 2))
41
42 (check
43 (doit (make-lexical-token 'N #f 1)
44 (make-lexical-token 'M #f '*)
45 (make-lexical-token 'N #f 2))
46 => '(1 * 2))
47
48 (check
49 (doit (make-lexical-token 'A #f '-)
50 (make-lexical-token 'N #f 1))
51 => '(- 1))
52
53 ;;; --------------------------------------------------------------------
54 ;;; Precedence.
55
56 (check
57 (doit (make-lexical-token 'N #f 1)
58 (make-lexical-token 'A #f '+)
59 (make-lexical-token 'N #f 2)
60 (make-lexical-token 'M #f '*)
61 (make-lexical-token 'N #f 3))
62 => '(1 + (2 * 3)))
63
64 (check
65 (doit (make-lexical-token 'N #f 1)
66 (make-lexical-token 'M #f '*)
67 (make-lexical-token 'N #f 2)
68 (make-lexical-token 'A #f '+)
69 (make-lexical-token 'N #f 3))
70 => '((1 * 2) + 3))
71
72 ;;; --------------------------------------------------------------------
73 ;;; Associativity.
74
75 (check
76 (doit (make-lexical-token 'N #f 1)
77 (make-lexical-token 'A #f '+)
78 (make-lexical-token 'N #f 2)
79 (make-lexical-token 'A #f '+)
80 (make-lexical-token 'N #f 3))
81 => '((1 + 2) + 3))
82
83 (check
84 (doit (make-lexical-token 'N #f 1)
85 (make-lexical-token 'M #f '*)
86 (make-lexical-token 'N #f 2)
87 (make-lexical-token 'M #f '*)
88 (make-lexical-token 'N #f 3))
89 => '(1 * (2 * 3)))
90
91 ;;; end of file