diff --git a/src/evaluate.rs b/src/evaluate.rs index acaae4b..4c05d8b 100644 --- a/src/evaluate.rs +++ b/src/evaluate.rs @@ -1,4 +1,5 @@ use std::collections::HashMap; +use std::clone::Clone; use parser::AST; use parser::AST::*; @@ -67,6 +68,17 @@ fn reduce(evr: EvalResult) -> EvalResult { } }, + WhileStatement(condition, body) => { + let (continue_loop, env) = reduce((*condition.clone(), env)); + match continue_loop { + Null => (DoNothing, env), + _ => { + let (_, new_env) = reduce((*body.clone(), env)); + reduce((WhileStatement(condition, body), new_env)) + } + } + }, + BinOp(op, lhs, rhs) => { let (reduced_lhs, new_env) = reduce((*lhs, env)); let (reduced_rhs, new_env2) = reduce((*rhs, new_env)); diff --git a/src/parser.rs b/src/parser.rs index 961d741..997d44c 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -4,7 +4,7 @@ use std::iter::Peekable; use tokenizer::{Token, Kw}; use tokenizer::Token::*; -#[derive(Debug)] +#[derive(Debug, Clone)] pub enum AST { Null, Name(String),