| 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 |