define-module for elisp special modules
[bpt/guile.git] / test-suite / lalr / test-lr-associativity-03.scm
CommitLineData
1b101522
LC
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