(define shift? (lambda (expr-stack next-token) (let ((stack-top (top-minus expr-stack 0))) (cond ((or (operator? stack-top) (member stack-top '($ lparen))) (or (number? next-token) (equal? next-token 'lparen))) ((number? stack-top) (let ((stack-second (top-minus expr-stack 1))) (cond ((operator? next-token) (or (not (operator? stack-second)) (lower-precedence? stack-second next-token))) ((equal? next-token 'rparen) (equal? stack-second 'lparen)) (else #F)))) (else #F))))) |