Recreando la función Eval

Estoy tratando de duplicar la función eval en racket sin recurrir a la función eval incorporada. Actualmente estoy usando un analizador y lexer matemático simple

$(define simple-math-lexer
       (lexer
        ((re-+ number10) (token-NUM (string->number lexeme)))
        ("-" (token--))
        ("+" (token-+))
        ;; recursively calls the lexer which effectively skips whitespace
        (whitespace (simple-math-lexer input-port))
        ((eof) (token-EOF))))

(define simple-math-parser
       (parser
        (start exp)
        (end EOF)
        (error void)
        (tokens a b)
        (precs (left - +))
        (grammar
         (exp ((NUM) $1)
              ((+ exp exp) (+ $2 $3))
              ((- exp exp) (- $2 $3))))))

por el momento no estoy seguro de cómo implementaría la multiplicación para el analizador. Cualquier sugerencia o enlace para ayudar sería apreciada.

preguntado el 03 de mayo de 12 a las 15:05

1 Respuestas

Deberías publicar un SSCCE. Con la poca información proporcionada en la pregunta, puedo sugerir lo siguiente:

  • Separe la evaluación del análisis, un evaluador debe recibir una lista de símbolos listos para ser evaluados, aquí parece que está mezclando las fases de análisis y evaluación
  • Simplemente agregue otro caso, de la misma manera que está manejando la suma y la resta, podría incluir la multiplicación: ((* exp exp) (* $2 $3))

SICP es un muy buen libro para comenzar a escribir su propio evaluador en Scheme.

contestado el 03 de mayo de 12 a las 18:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.