我问了一个类似于此前的问题,并解决了原来的问题。我遇到了另一个被其他错误隐藏的问题。我能够使“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语句已经存在类似的结构,那将会很简单,但是我所知道的并不存在这样的结构。
答案 0 :(得分: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