Advertisement
cardel

Ejemplos de clase

Mar 5th, 2018
340
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 4.36 KB | None | 0 0
  1. #lang eopl
  2.  
  3. ;; <programa> = <expresion>  (program)
  4. ;; <expresion> = <identificador>  (id-exp)
  5. ;; <expresion> = "(" <identificador> <operacion> <identificador> ")"  (op-exp)
  6. ;; <operacion> = "+" (sum-op)
  7. ;; <operacion> = "-" (res-op)
  8. ;;<operacion>  = "/" (div-op)
  9. ;; <operador> = "*"  (mul-op)
  10.  
  11.  
  12. (define especificacionLexica
  13.   '(
  14.     (espacioBlanco (whitespace) skip)
  15.     (comentario ("//" (arbno (not #\newline))) skip)
  16.     (identificador (letter (arbno (or digit letter))) symbol)
  17.     (palabra  ("\"" (or letter digit) (arbno (or digit letter)) "\"") string)
  18.     (numero (digit (arbno digit)) number)
  19.     )
  20.   )
  21.  
  22. (define especificacionGramatical
  23.   '(
  24.     (programa (expresion) program)
  25.     (expresion (identificador) id-exp)
  26.     (expresion ( "(" identificador operador identificador ")") op-exp)
  27.     (operador ("+") sum-op)
  28.     (operador ("-") res-op)
  29.     (operador ("/") div-op)
  30.     (operador ("*") mul-op)
  31.     )
  32.   )
  33.  
  34. ;Construidos automáticamente:
  35.  
  36. (sllgen:make-define-datatypes especificacionLexica especificacionGramatical)
  37.  
  38. (define show-the-datatypes
  39.   (lambda () (sllgen:list-define-datatypes especificacionLexica especificacionGramatical)))
  40. ;Parser, Scanner, Interfaz
  41.  
  42. ;El FrontEnd (Análisis léxico (scanner) y sintáctico (parser) integrados)
  43.  
  44. (define scan&parse
  45.   (sllgen:make-string-parser especificacionLexica especificacionGramatical))
  46.  
  47. ;El Analizador Léxico (Scanner)
  48.  
  49. (define just-scan
  50.   (sllgen:make-string-scanner especificacionLexica especificacionGramatical))
  51.  
  52. ;El Interpretador (FrontEnd + Evaluación + señal para lectura )
  53.  
  54. (define interpretador
  55.   (sllgen:make-rep-loop "--> "
  56.     (lambda (pgm) (evaluarPrograma  pgm))
  57.     (sllgen:make-stream-parser
  58.       especificacionLexica
  59.       especificacionGramatical)))
  60.  
  61. (define evaluarPrograma
  62.   (lambda (x)
  63.     (cases programa x
  64.       (program (exp)
  65.                (evaluarExpresion exp)
  66.       )
  67.     )
  68.   ))
  69.  
  70. (define evaluarExpresion
  71.   (lambda (exp)
  72.     (cases expresion exp
  73.       (id-exp (dato) (apply-env (init-env) dato))
  74.       (op-exp (id1 op id2)
  75.               (let
  76.                   ((a (apply-env (init-env) id1))
  77.                    (b (apply-env (init-env) id2))
  78.                    )
  79.                 (evaluarOperador a op b)
  80.                 )
  81.               )
  82.       )
  83.     )
  84.   )
  85.  
  86. (define evaluarOperador
  87.   (lambda (a op b)
  88.     (cases operador op
  89.       (sum-op () (+ a b))
  90.       (res-op () (- a b))
  91.       (div-op () (/ a b))
  92.       (mul-op () (* a b))
  93.       )
  94.     )
  95.   )
  96.  
  97. ;;Ambientes
  98.  
  99. ; Ambiente inicial
  100. (define init-env
  101.   (lambda ()
  102.     (extend-env
  103.      '(i v x)
  104.      '(1 5 10)
  105.      (empty-env))))
  106. ;definición del tipo de dato ambiente
  107. (define-datatype environment environment?
  108.   (empty-env-record)
  109.   (extended-env-record (syms (list-of symbol?))
  110.                        (vals (list-of scheme-value?))
  111.                        (env environment?)))
  112.  
  113. (define scheme-value? (lambda (v) #t))
  114.  
  115. ;empty-env:      -> enviroment
  116. ;función que crea un ambiente vacío
  117. (define empty-env  
  118.   (lambda ()
  119.     (empty-env-record)))       ;llamado al constructor de ambiente vacío
  120.  
  121.  
  122. ;extend-env: <list-of symbols> <list-of numbers> enviroment -> enviroment
  123. ;función que crea un ambiente extendido
  124. (define extend-env
  125.   (lambda (syms vals env)
  126.     (extended-env-record syms vals env)))
  127.  
  128. ;función que busca un símbolo en un ambiente
  129. (define apply-env
  130.   (lambda (env sym)
  131.     (cases environment env
  132.       (empty-env-record ()
  133.                         (eopl:error 'apply-env "No binding for ~s" sym))
  134.       (extended-env-record (syms vals env)
  135.                            (let ((pos (list-find-position sym syms)))
  136.                              (if (number? pos)
  137.                                  (list-ref vals pos)
  138.                                  (apply-env env sym)))))))
  139. ;****************************************************************************************
  140. ;Funciones Auxiliares
  141.  
  142. ; funciones auxiliares para encontrar la posición de un símbolo
  143. ; en la lista de símbolos de unambiente
  144.  
  145. (define list-find-position
  146.   (lambda (sym los)
  147.     (list-index (lambda (sym1) (eqv? sym1 sym)) los)))
  148.  
  149. (define list-index
  150.   (lambda (pred ls)
  151.     (cond
  152.       ((null? ls) #f)
  153.       ((pred (car ls)) 0)
  154.       (else (let ((list-index-r (list-index pred (cdr ls))))
  155.               (if (number? list-index-r)
  156.                 (+ list-index-r 1)
  157.                 #f))))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement