From d2108f0f97ea1f72f3186012000a2ea52e070f66 Mon Sep 17 00:00:00 2001 From: greg Date: Wed, 29 Jul 2015 00:52:17 -0700 Subject: [PATCH] First pass at evaluation Very incomplete --- src/evaluate.rs | 25 +++++++++++++++++++++++++ src/main.rs | 13 +++++++------ src/parser.rs | 3 ++- 3 files changed, 34 insertions(+), 7 deletions(-) create mode 100644 src/evaluate.rs diff --git a/src/evaluate.rs b/src/evaluate.rs new file mode 100644 index 0000000..1a9e9c5 --- /dev/null +++ b/src/evaluate.rs @@ -0,0 +1,25 @@ +use parser::AST; +use parser::AST::*; + +pub fn evaluate(ast: AST) -> String { + match reduce(ast) { + None => return "error".to_string(), + Some(DoNothing) => "".to_string(), + Some(Number(n)) => return format!("{}", n), + Some(LangString(s)) => return format!("\"{}\"", s), + _ => return "not implemented".to_string() + } +} + +fn reduce(ast: AST) -> Option { + match ast { + Statements(stmts) => { + let mut reduction = Some(DoNothing); + for stmt in stmts.into_iter() { + reduction = reduce(stmt); + } + reduction + }, + other_ast => Some(other_ast) + } +} diff --git a/src/main.rs b/src/main.rs index 6d9f223..453c08e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,9 +5,11 @@ use std::process; use tokenizer::tokenize; use parser::{parse, ParseResult}; +use evaluate::evaluate; mod tokenizer; mod parser; +mod evaluate; fn main() { @@ -39,14 +41,13 @@ fn repl() { println!("Tokens: {:?}", tokens); match parse(tokens) { - ParseResult::Ok(ast) => println!("AST: {:?}", ast), + ParseResult::Ok(ast) => { + println!("AST: {:?}", ast); + let eval = evaluate(ast); + println!("{}", eval); + }, ParseResult::Err(err) => println!("Error: {}", err) } - - /* - let eval = evaluate(&ast); - println!("{}", eval); - */ }, Err(err) => { println!("Error: {}", err); diff --git a/src/parser.rs b/src/parser.rs index fa27649..7002281 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -13,7 +13,8 @@ pub enum AST { Binding(String, Box), Statements(Vec), IfStatement(Box, Box, Option>), - WhileStatement(Box, Box) + WhileStatement(Box, Box), + DoNothing } pub enum ParseResult {