Advertisement
cardel

Ejemplo clase 20 Abril FLP

Apr 20th, 2017
365
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 4.02 KB | None | 0 0
  1. #lang eopl
  2.  
  3. (define lexica
  4. '((white-sp
  5.    (whitespace) skip)
  6.   (comment
  7.    ("%" (arbno (not #\newline))) skip)
  8.   (number
  9.    (digit (arbno digit)) number)
  10.   (texto
  11.    (letter (arbno (or letter digit))) string)
  12.   (number
  13.    ("-" digit (arbno digit)) number)))
  14.  
  15.  
  16. (define gramatica
  17.   '(
  18.     (programa (expresion) un-programa)
  19.     (expresion (number) numero-lit)
  20.     (expresion ("\"" texto "\"") texto-lit)
  21.     (expresion (primitiva "[" (separated-list expresion ";") "]") primitiva-exp)
  22.     (expresion (texto) identificador)
  23.     (primitiva ("+") primitiva-sum)
  24.     (primitiva ("-") primitiva-resta)
  25.     (primitiva ("*") primitiva-mult)
  26.     (primitiva ("/") primitiva-div)
  27.     (primitiva ("concat") primitiva-concat)
  28.     (primitiva ("length") primitiva-lenght)
  29.     ;;Viene lo nuevo
  30.     (expresion ("Si"  expresion  "entonces" expresion "sino" expresion "fin") cond-exp)
  31.     ;;Variables locales
  32.     (expresion ("declarar" (separated-list texto "=" expresion ";") "haga" expresion "fin") variableLocal-exp)
  33.     ;;Procedimientosx
  34.     (expresion ("procedimiento" "[" (separated-list texto ";") "]" "haga" expresion "fin") procedimiento-exp)
  35.     ;evaluar procedimiento
  36.     (expresion ("evaluar" texto "enviando" "[" (separated-list expresion ";") "]" "fin") evaluacion-exp)
  37.   )
  38.   )
  39.  
  40.  
  41. ;Construidos automáticamente:
  42.  
  43. (sllgen:make-define-datatypes lexica gramatica)
  44.  
  45. (define show-the-datatypes
  46.   (lambda () (sllgen:list-define-datatypes lexica gramatica)))
  47.  
  48. ;*******************************************************************************************
  49. ;Parser, Scanner, Interfaz
  50.  
  51. ;El FrontEnd (Análisis léxico (scanner) y sintáctico (parser) integrados)
  52.  
  53. (define scan&parse
  54.   (sllgen:make-string-parser lexica gramatica))
  55.  
  56. ;El Analizador Léxico (Scanner)
  57.  
  58. (define just-scan
  59.   (sllgen:make-string-scanner lexica gramatica))
  60.  
  61. ;El Interpretador (FrontEnd + Evaluación + señal para lectura )
  62.  
  63. (define interpretador
  64.   (sllgen:make-rep-loop "--> "
  65.     (lambda (pgm) (evaluar-programa  pgm))
  66.     (sllgen:make-stream-parser
  67.       lexica
  68.       gramatica)))
  69.  
  70. (define evaluar-programa
  71.   (lambda (pgm)
  72.     (cases programa pgm
  73.       (un-programa (exp) (evaluar-expresion exp (ambienteInicial))
  74.     ))))
  75.  
  76. (define evaluar-expresion
  77.   (lambda (expr amb)
  78.     (cases expresion expr
  79.       (numero-lit (numerito) numerito)
  80.       (texto-lit (textico) textico)
  81.       (primitiva-exp (prim lexp) "primitiva")
  82.       (identificador (id) (evaluar-expresion (buscarVariable (string->symbol id) amb) amb))
  83.       (else "jaja")
  84.     )))
  85.  
  86.  
  87. ;Definición de ambiente
  88. ;<ambiente>: (vacio) '()
  89. ;           (extendido) (lista-simbolos) (lista-expresiones) ;<ambiente>
  90. (define-datatype ambiente ambiente?
  91.   (ambiente-vacio)
  92.   (ambiente-extendido
  93.    (ids (list-of symbol?))
  94.    (valores (list-of expresion?))
  95.    (amb ambiente?)
  96.    )
  97.   )
  98.  
  99. ;;Definir un ambiente inicial
  100. ;Defina un ambiente inicial con los simbolos ("a" "b" "c") con valores ((numero-lit 1) (numero-lit 2) (numero-lit 3)), modifique evaluar-expresion para que se acepte
  101.  
  102. (define ambienteInicial
  103.   (lambda ()
  104.     (ambiente-extendido
  105.      '(a b c)
  106.      (list (numero-lit 1) (numero-lit 2) (numero-lit 3))
  107.      (ambiente-vacio))))
  108.  
  109. (define buscarVariable
  110.   (lambda (variable amb)
  111.     (cases ambiente amb
  112.       (ambiente-vacio () (eopl:error "No encontré la variable"))
  113.       (ambiente-extendido
  114.        (lids lvalores ambanterior)
  115.        (let
  116.          ( (pos (buscarSimbolo variable lids 1)))
  117.          (cond
  118.            [ (not (zero? pos)) (buscarValor pos lvalores)]
  119.            [else (buscarVariable variable ambanterior)]
  120.            )
  121.          )
  122.        )
  123.       )
  124.     )
  125.   )
  126.  
  127.  
  128.            
  129.  
  130.  
  131. (define buscarSimbolo
  132.   (lambda (sim listS acc)
  133.     (cond
  134.       [(null? listS) 0]
  135.       [(eqv? sim (car listS)) acc]
  136.       [else (buscarSimbolo sim (cdr listS) (+ 1 acc))]
  137.       )
  138.     )
  139.   )
  140.  
  141. (define buscarValor
  142.   (lambda (pos lValores)
  143.     (cond
  144.       [(= 1 pos) (car lValores)]
  145.       [else (buscarValor (- pos 1) (cdr lValores))]
  146.       )
  147.     )
  148.   )
  149.  
  150. (interpretador)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement