UNB/ CS/ David Bremner/ teaching/ cs4613/ lectures/ lecture2/ snippet-033.rkt
#lang plait
(define-type AE
  [Num (n : Number)]
  [Add (l : AE) (r : AE)]
  [Sub (l : AE) (r : AE)]
  [Mul (l : AE) (r : AE)])
(define (parse-sx sx)
  (local  [(define (rec fn) (parse-sx (fn (s-exp->list sx))))]
    (cond
      [(s-exp-match? `NUMBER sx)
         (Num (s-exp->number sx))]
      [(s-exp-match? `(+ ANY ANY) sx)
       (Add (rec second) (rec third))]
      [(s-exp-match? `(- ANY ANY) sx)
       (Sub (rec second) (rec third))]
      [(s-exp-match? `(* ANY ANY) sx)
       (Mul (rec second) (rec third))]
      [else (error 'parse-sx (to-string sx))])))

;; parses a string containing an AE expression to an AE
(define (read-ae)
  (parse-sx (read)))