Воссоздание функции Eval

Я пытаюсь продублировать функцию eval в рэкете, не вызывая встроенную функцию eval. В настоящее время я использую простой математический лексер и парсер

$(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))))))

на данный момент я не уверен, как реализовать умножение для парсера. Любые предложения или ссылки на помощь будут оценены.


person Razed    schedule 03.05.2012    source источник


Ответы (1)


Вы должны опубликовать SSCCE. С небольшой информацией, представленной в вопросе, я могу предложить:

  • Отделите оценку от синтаксического анализа, оценщик должен получить список символов, готовых к оценке, здесь кажется, что вы смешиваете этапы синтаксического анализа и оценки.
  • Просто добавьте еще один случай, так же, как вы обрабатываете сложение и вычитание, вы можете включить умножение: ((* exp exp) (* $2 $3))

SICP — очень хорошая книга для начала написания собственного оценщика на Scheme.

person Óscar López    schedule 03.05.2012