1

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

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

4

1 回答 1

2

您应该发布SSCCE。根据问题中提供的少量信息,我可以建议:

  • 将评估与解析分开,评估者应该收到准备评估的符号列表,这里似乎您正在混合解析和评估阶段
  • 只需添加另一种情况,就像您处理加法和减法一样,您可以包括乘法:((* exp exp) (* $2 $3))

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

于 2012-05-03T15:03:02.287 回答