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 に答える