重新创建Eval函数

时间:2012-05-03 14:52:11

标签: parsing scheme eval racket multiplication

我试图在不调用内置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))))))

此刻我不确定如何为解析器实现乘法。 任何建议或帮助链接将不胜感激。

1 个答案:

答案 0 :(得分:2)

您应该发布SSCCE。由于问题中提供的信息很少,我可以建议:

  • 将评估与解析分开,评估者应该收到一份准备好评估的符号列表,这里看来你正在混合解析和评估阶段
  • 只需添加另一个案例,就像处理加法和减法一样,您可以包含乘法:((* exp exp) (* $2 $3))

SICP是一本非常好的书,可以帮助您开始如何在Scheme中编写自己的评估者。