0

以前、これと同様の質問をして、元の質問を解決してもらいました。他のエラーによって隠されていた追加の問題が発生しました。「if」ステートメントのようなステートメントは正しく機能しますが、「while」ステートメントは機能しません。「stmt」を評価するときは、環境を更新する必要があります。これは、次のような私の「if」ステートメントに対して適切に機能します。

exec :: Env -> Stmt -> Env
exec env (If c t e) = 
    exec env ( if eval env c == BoolLit True then t else e )

evalは次のようになります。

eval :: Env -> Expr -> Expr
eval _ (IntLit i) = IntLit i
eval _ (BoolLit b) = BoolLit b
eval env (Var n) = lookupVar env n
eval env (BinOp op a b) = primEval op (eval env a) (eval env b)

解析されるファイルは次のようになります。

x = 1; c = 0;
if (x < 2) c = c + 1; else ;

whileステートメントを機能させるための私の試みは、次のように行われます。

exec env (While c t) = exec env ( if eval env c == BoolLit True then t)

ただし、これにより')'で解析エラーが発生します。解析されるファイル内のwhileステートメントの予想される形式は次のとおりです。

x = 1; c = 1;
while (x < 10)
{
  c = c * x;
  x = x + 1;
}
c

この予想される形式に基づいて適切な環境を返す方法を理解しようとしています。Haskellのwhileステートメントに同様の構造がすでに存在する場合は簡単ですが、私が知っているこのような構造は存在しません。

4

1 に答える 1

4

関数に句がありませelseん。おそらく次のようになります。

exec env (While c t) = if eval env c == BoolLit True then exec env t else env

実際に機能させるには、つまり、本体を複数回実行します。

exec env (While c t) = if   eval env c == BoolLit True 
                       then exec (exec env t) (While c t)
                       else env
于 2012-10-14T15:16:21.270 に答える