微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

语言实现中If表达式的解析或定义错误

如何解决语言实现中If表达式的解析或定义错误

我正在尝试实现 if 语句,以便我可以将它们写成以下形式

google

出于某种原因,我在实现时遇到了问题,我不确定是解析、评估还是 if (x < 10)-> x := x + 1 [] (x > 10)-> x := x * 2 fi 本身的定义。

If..Fi

我认为可能是评估部分,因为在我的脑海中,逻辑是这样工作的,如果我在 data HStatement = Eval HVal | Print HVal | Do HVal [HStatement] | If HVal [HStatement] [HStatement] parseIf :: Parser HStatement parseIf = do string "if" <|> string "[]" spaces string "(" cond <- try (spaces *> parseVals) string ")->" spaces expr <- try (spaces *> many1 parseStatements) alt <- try (spaces *> many parseStatements <* spaces <* string "if") return $ If cond expr alt parseStatements :: Parser HStatement parseStatements = try (parseIf ) <|> try (parseDo <* spaces) <|> try (parsePrint) <|> try (parseEvalHVal) evalStatement_ :: Env -> HStatement -> IOThrowsError () evalStatement_ env (Do cond expr) = evalVal env cond >>= \x -> case x of HBool False -> return () HBool True -> do traverse_ (evalStatement_ env) expr evalStatement_ env (Do cond expr) evalStatement_ env (Skip skip) = return () evalStatement_ env (Print (HString val)) = getvar env val >>= \x -> liftIO $ putStrLn $ show x evalStatement_ env (Print val) = liftIO $ putStrLn $ show val evalStatement_ env (Eval val) = do result <- evalVal env val return () evalStatement_ env (If pred expr alt) = evalVal env pred >>= \p -> case p of HBool False -> do liftIO $ putStrLn $ show alt traverse_ (evalStatement_ env) alt HBool True -> traverse_ (evalStatement_ env) expr 中评估 HVal 并且这是真的,那么我会立即评估第一个 Statement 列表,否则我评估第二个.问题在于,真正的守卫没有从所查看的 if 语句列表中返回,或者换句话说,在开头的示例中,程序不识别第二个条件,而是将其视为需要与 If HVal [HStatement] [HStatement] 表达式一起计算。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。