Advertisement
Guest User

Untitled

a guest
Mar 21st, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 3.33 KB | None | 0 0
  1. (define-type ExprC
  2.   [numC (n : number)]
  3.   [idC (s : symbol)]
  4.   [plusC (l : ExprC) (r : ExprC)]
  5.   [multC (l : ExprC) (r : ExprC)]
  6.   [consC (l : ExprC) (r : ExprC)]
  7.   [firstC (p : ExprC)]
  8.   [restC (p : ExprC)]
  9.   [empty?C (e : ExprC)]
  10.   [letrecC (s : (listof symbol)) (rhs : (listof ExprC)) (body : ExprC)]
  11.   [ifC (test-expr : ExprC) (then-expr :  ExprC) (else-expr : ExprC)]
  12.   [lamC (par : symbol) (body : ExprC)]
  13.   [appC (fun : ExprC) (arg : ExprC)]
  14.   [emptyC])
  15.  
  16. ; Représentation des valeurs
  17. (define-type Value
  18.   [numV (n : number)]
  19.   [closV (arg : symbol) (body : ExprC) (env : Env)]
  20.   [suspendV (body : ExprC) (env : Env) (mem : (boxof (optionof Value)))]
  21.   [consV (l : Value) (r : Value)]
  22.   [emptyV]
  23.   [undefV])
  24.  
  25. ; Représentation des liaisons
  26. (define-type Binding
  27.   [bind (name : symbol) (val : (boxof Value))])
  28.  
  29. ; Manipulation de l'environnement
  30. (define-type-alias Env (listof Binding))
  31. (define mt-env empty)
  32. (define extend-env cons)
  33.  
  34. ;;;;;;;;;;;;;;;;;;;;;;
  35. ; Analyse syntaxique ;
  36. ;;;;;;;;;;;;;;;;;;;;;;
  37.  
  38. (define (parse [s : s-expression]) : ExprC
  39.   (cond
  40.     [(s-exp-match? `empty s) (emptyC)]
  41.     [(s-exp-match? `NUMBER s) (numC (s-exp->number s))]
  42.     [(s-exp-match? `SYMBOL s) (idC (s-exp->symbol s))]
  43.     [(s-exp-match? '{empty? ANY} s)
  44.      (let ([sl (s-exp->list s)])
  45.        (empty?C (parse (second sl))))]
  46.     [(s-exp-match? '{list ANY ...} s)
  47.      (let ([sl (s-exp->list s)])
  48.        (let ([arg (rest sl)])
  49.          (if (empty? arg)
  50.              (emptyC)
  51.              (foldr consC (emptyC) (map parse arg)))))]
  52.     [(s-exp-match? '{cons ANY ANY} s)
  53.      (let ([sl (s-exp->list s)])
  54.        (consC (parse (second sl)) (parse (third sl))))]
  55.     [(s-exp-match? '{first ANY} s)
  56.      (let ([sl (s-exp->list s)])
  57.        (firstC (parse (second sl))))]
  58.     [(s-exp-match? '{rest ANY} s)
  59.      (let ([sl (s-exp->list s)])
  60.        (restC (parse (second sl))))]
  61.     [(s-exp-match? '{+ ANY ANY} s)
  62.      (let ([sl (s-exp->list s)])
  63.        (plusC (parse (second sl)) (parse (third sl))))]
  64.     [(s-exp-match? '{* ANY ANY} s)
  65.      (let ([sl (s-exp->list s)])
  66.        (multC (parse (second sl)) (parse (third sl))))]
  67.     [(s-exp-match? '{- ANY ANY} s)
  68.      (let ([sl (s-exp->list s)])
  69.        (plusC (parse (second sl)) (multC (numC -1) (parse (third sl)))))]
  70.     [(s-exp-match? '{let {[SYMBOL ANY]} ANY} s)
  71.      (let ([sl (s-exp->list s)])
  72.        (let ([subst (s-exp->list (first (s-exp->list (second sl))))])
  73.          (appC (lamC (s-exp->symbol (first subst)) (parse (third sl))) (parse (second subst)))))]
  74.     [(s-exp-match? '{letrec {[SYMBOL ANY] [SYMBOL ANY] ...} ANY} s)
  75.      (let ([sl (s-exp->list s)])
  76.        (let ([subst (s-exp->list (second sl))])
  77.          (letrecC (map s-exp->symbol (map (lambda (x) (first (s-exp->list x))) subst)) (map parse (map (lambda (x) (second (s-exp->list x))) subst)) (parse (third sl)))))]
  78.     [(s-exp-match? '{if ANY ANY ANY} s)
  79.      (let ([sl (s-exp->list s)])
  80.        (ifC (parse (second sl)) (parse (third sl)) (parse (fourth sl))))]
  81.     [(s-exp-match? '{lambda {SYMBOL} ANY} s)
  82.      (let ([sl (s-exp->list s)])
  83.        (let ([sll (s-exp->list (second sl))])
  84.          (lamC (s-exp->symbol (first sll)) (parse (third sl)))))]
  85.     [(s-exp-match? '{ANY ANY} s)
  86.      (let ([sl (s-exp->list s)])
  87.        (appC (parse (first sl)) (parse (second sl))))]
  88.     [else (error 'parse "invalid input")]))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement