1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- ;;; test-lr-associativity-02.scm --
- ;;
- ;;Show how to use left and right associativity. Notice that the
- ;;terminal M is declared as left associative; this influences the
- ;;binding of values to the $n symbols in the semantic clauses. The
- ;;semantic clause in the rule:
- ;;
- ;; (E M E M E) : (list $1 $2 (list $3 $4 $5))
- ;;
- ;;looks like it is right-associated, but the result is left-associated
- ;;because we have declared M as "left:".
- ;;
- (load "common-test.scm")
- (define (doit . tokens)
- (let ((parser (lalr-parser
- (expect: 0)
- (N (left: A)
- (left: M)
- (nonassoc: U))
- (E (N) : $1
- (E A E) : (list $1 $2 $3)
- (E M E) : (list $1 $2 $3)
- (E M E M E) : (list $1 $2 (list $3 $4 $5))
- (A E (prec: U)) : (list '- $2)))))
- (parser (make-lexer tokens) error-handler)))
- ;;; --------------------------------------------------------------------
- ;;; Single operator.
- (check
- (doit (make-lexical-token 'N #f 1))
- => 1)
- (check
- (doit (make-lexical-token 'N #f 1)
- (make-lexical-token 'A #f '+)
- (make-lexical-token 'N #f 2))
- => '(1 + 2))
- (check
- (doit (make-lexical-token 'N #f 1)
- (make-lexical-token 'M #f '*)
- (make-lexical-token 'N #f 2))
- => '(1 * 2))
- (check
- (doit (make-lexical-token 'A #f '-)
- (make-lexical-token 'N #f 1))
- => '(- 1))
- ;;; --------------------------------------------------------------------
- ;;; Precedence.
- (check
- (doit (make-lexical-token 'N #f 1)
- (make-lexical-token 'A #f '+)
- (make-lexical-token 'N #f 2)
- (make-lexical-token 'M #f '*)
- (make-lexical-token 'N #f 3))
- => '(1 + (2 * 3)))
- (check
- (doit (make-lexical-token 'N #f 1)
- (make-lexical-token 'M #f '*)
- (make-lexical-token 'N #f 2)
- (make-lexical-token 'A #f '+)
- (make-lexical-token 'N #f 3))
- => '((1 * 2) + 3))
- ;;; --------------------------------------------------------------------
- ;;; Associativity.
- (check
- (doit (make-lexical-token 'N #f 1)
- (make-lexical-token 'A #f '+)
- (make-lexical-token 'N #f 2)
- (make-lexical-token 'A #f '+)
- (make-lexical-token 'N #f 3))
- => '((1 + 2) + 3))
- (check
- (doit (make-lexical-token 'N #f 1)
- (make-lexical-token 'M #f '*)
- (make-lexical-token 'N #f 2)
- (make-lexical-token 'M #f '*)
- (make-lexical-token 'N #f 3))
- => '((1 * 2) * 3))
- ;;; end of file
|