cardel

Interpretador

Oct 9th, 2021 (edited)
837
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 6.08 KB | None | 0 0
  1. #lang eopl
  2. (define lexica
  3.   '(
  4.     (espacio (whitespace) skip)
  5.     (numero (digit (arbno digit)) number)
  6.     (numero ("-" digit (arbno digit)) number)
  7.     (numero (digit (arbno digit) "." digit (arbno digit)) number)
  8.     (numero ("-" digit (arbno digit) "." digit (arbno digit)) number)
  9.     (comentario (";;" (arbno (not #\newline))) skip)
  10.     (identificador (letter (arbno (or letter "?" "!"))) symbol)
  11.     (cadena ("'" letter (arbno (or letter "?" "!")) "'") string)
  12.     )
  13.   )
  14.  
  15. (define gramatical
  16.   '(
  17.     (programa (expresion) a-programa)
  18.     (expresion (identificador) var-expresion)
  19.     (expresion (numero) num-exp)
  20.     (expresion (cadena) cadena-exp)
  21.     (expresion (expresion-primitiva) prim-expresion)
  22.     (expresion-primitiva (primitiva-unaria "[" expresion "]") prim-unaria)
  23.     (expresion-primitiva (primitiva-mult "[" (separated-list expresion ",") "]") prim-mult)
  24.     (expresion-primitiva (primitiva-par "[" expresion "," expresion "]") prim-pair)
  25.     ;(expresion (primitiva "[" expresion (arbno "," expresion) prim-expresion)
  26.     ;(expresion ("var" identificador declaracion ";") decl-vacia-exp )
  27.     ;(declaracion () declaracion-vacia)
  28.     ;(declaracion ("=" expresion) declaracion-no-vacia)
  29.     (primitiva-mult ("+") sum-prim)
  30.     (primitiva-mult ("-") menos-prim)
  31.     (primitiva-mult ("/") div-prim)
  32.     (primitiva-mult ("*") mul-prim)
  33.     (primitiva-mult ("&") concat-prim)
  34.     (primitiva-par ("%") mod-prim)
  35.     (primitiva-unaria ("inc") inc-prim)
  36.     (primitiva-unaria ("dec") dec-prim)
  37.     ))
  38.  
  39. ;;Definir los datatype (estructra AST)
  40. (sllgen:make-define-datatypes lexica gramatical)
  41.  
  42. (define scanner
  43.    (sllgen:make-string-scanner lexica gramatical))
  44.  
  45. (define parser
  46.   (sllgen:make-string-parser lexica gramatical))
  47.  
  48. (define interpretador
  49.   (sllgen:make-rep-loop
  50.            "x-x>"
  51.            (lambda (pgm) (evaluar-programa pgm))
  52.            (sllgen:make-stream-parser
  53.             lexica
  54.             gramatical
  55.             )
  56.            )
  57.   )
  58. ;Recibe un AST de programa y llama la función evaluar-expresion con la expresion interna
  59. (define evaluar-programa
  60.   (lambda (pgm)
  61.     (cases programa pgm
  62.       (a-programa (exp)
  63.                   (evaluar-expresion exp init-env)))))
  64.              
  65.            
  66. (define-datatype environment environment?
  67.   (empty-env)
  68.   (extend-env (lids (list-of symbol?))
  69.               (lvalue (list-of value?))
  70.               (old-env environment?)))
  71.  
  72. (define value?
  73.   (lambda (x)
  74.     (or (string? x) (number? x))))
  75.  
  76. (define apply-env
  77.   (lambda (env var)
  78.     (cases environment env
  79.       (empty-env () (eopl:error "No encuentro la variable" var))
  80.       (extend-env (lid lval old-env)
  81.                   (letrec
  82.                       (
  83.                        (buscar-posicion (lambda (lid var acc)
  84.                                           (cond
  85.                                             [(null? lid) -1]
  86.                                             [(equal? var (car lid)) acc]
  87.                                             [else (buscar-posicion (cdr lid) var (+ acc 1))]
  88.                                             )))
  89.                                            
  90.                        )
  91.                     (let
  92.                         (
  93.                          (posicion (buscar-posicion lid var 0))
  94.                          )
  95.                       (if
  96.                        (not (= posicion -1))
  97.                        (list-ref lval posicion)
  98.                        (apply-env old-env var))))))))
  99.                    
  100. (define init-env
  101.   (extend-env
  102.    '(x y z)
  103.    '(1 2 3)
  104.    (extend-env
  105.     '(a b c)
  106.     '(4 5 6)
  107.     (empty-env))
  108.    ))
  109.  
  110. ;;Esta función recibe un AST tipo expresión y lo procesa
  111. (define evaluar-expresion
  112.   (lambda (exp amb)
  113.     (cases expresion exp
  114.       (num-exp (dato) dato)
  115.       (cadena-exp (dato) dato)
  116.       (var-expresion (id) (apply-env amb id))
  117.       (prim-expresion (exp-prim)
  118.                       (cases expresion-primitiva exp-prim
  119.                         (prim-mult (prim lst)
  120.                                    (let
  121.                                        (
  122.                                         (lrands (map (lambda (x) (evaluar-expresion x amb)) lst))
  123.                                         )
  124.                                      (aplicar-primitiva prim lrands)
  125.                                      )
  126.                                    )                                  
  127.                         (prim-pair (prim exp1 exp2)
  128.                                    (let
  129.                                        (
  130.                                         (exp1E (evaluar-expresion exp1 amb))
  131.                                         (exp2E (evaluar-expresion exp2 amb))
  132.                                         )
  133.                                      (cases primitiva-par prim
  134.                                        (mod-prim () (modulo exp1E exp2E))
  135.                                        )
  136.                                      )
  137.                                    )
  138.                         (prim-unaria (prim exp)
  139.  
  140.                                      (let
  141.                                          (
  142.                                           (expE (evaluar-expresion exp amb))
  143.                                           )
  144.                                        (cases primitiva-unaria prim
  145.                                          (inc-prim () (+ expE 1))
  146.                                          (dec-prim () (- expE 1)))
  147.                                        )
  148.                                      )))
  149.      
  150.       )
  151.     )
  152.   )
  153.  
  154. (define aplicar-primitiva
  155.   (lambda (prim lrands)
  156.     (cases primitiva-mult prim
  157.       (sum-prim () (apply + lrands))
  158.       (menos-prim ()(apply - lrands))
  159.       (div-prim () (exact->inexact (apply / lrands)))
  160.       (mul-prim ()(apply * lrands))
  161.       (concat-prim () (apply string-append lrands) )      
  162.       )
  163.     )
  164.   )
  165.  
  166. (interpretador)
  167. ;
  168. ;(mod-prim () (modulo (car lrands) (cadr lrands))) ;;Operacion 2 argumentos
  169. ;(inc-prim () (+ (car lrands) 1)) ;;Operación recibe un argumento
  170. ;(dec-prim () (- (car lrands) 1)) ;;Operación recibe un argumento
  171.  
Add Comment
Please, Sign In to add comment