Add boilerplate for evaluation
Just wires everything up, doesn't actually evaluate yet
This commit is contained in:
parent
6da20cbfaf
commit
1c23329656
30
src/evaluator.rs
Normal file
30
src/evaluator.rs
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
use parser::AST;
|
||||||
|
|
||||||
|
struct Evaluator {
|
||||||
|
ast: AST
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Evaluator {
|
||||||
|
pub fn run(&mut self) -> String {
|
||||||
|
while self.ast.can_reduce() {
|
||||||
|
self.ast.reduce();
|
||||||
|
}
|
||||||
|
|
||||||
|
format!("{}", self.ast)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AST {
|
||||||
|
fn can_reduce(&self) -> bool {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
|
fn reduce(&mut self) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn evaluate(ast: AST) -> String {
|
||||||
|
let mut ev = Evaluator { ast: ast };
|
||||||
|
ev.run()
|
||||||
|
}
|
14
src/main.rs
14
src/main.rs
@ -14,6 +14,9 @@ mod tokenizer;
|
|||||||
use parser::{ParseResult, parse};
|
use parser::{ParseResult, parse};
|
||||||
mod parser;
|
mod parser;
|
||||||
|
|
||||||
|
use evaluator::{evaluate};
|
||||||
|
mod evaluator;
|
||||||
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let args: Vec<String> = std::env::args().collect();
|
let args: Vec<String> = std::env::args().collect();
|
||||||
@ -63,5 +66,14 @@ fn repl_handler(input: &str, state: &mut InterpreterState) -> String {
|
|||||||
if state.show_parse {
|
if state.show_parse {
|
||||||
println!("Parse: {:?}", parse(tokenize(input)))
|
println!("Parse: {:?}", parse(tokenize(input)))
|
||||||
}
|
}
|
||||||
format!("{:?}", parse(tokenize(input)))
|
|
||||||
|
let parse_result = parse(tokenize(input));
|
||||||
|
match parse_result {
|
||||||
|
Ok(ast) => {
|
||||||
|
format!("{}", evaluate(ast))
|
||||||
|
},
|
||||||
|
Err(err) => {
|
||||||
|
format!("Parse error: {:?}", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
use std::iter::Peekable;
|
use std::iter::Peekable;
|
||||||
use std::vec::IntoIter;
|
use std::vec::IntoIter;
|
||||||
|
use std::fmt;
|
||||||
|
|
||||||
use tokenizer::Token;
|
use tokenizer::Token;
|
||||||
|
|
||||||
@ -10,6 +11,12 @@ pub enum AST {
|
|||||||
Name(String),
|
Name(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl fmt::Display for AST {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
write!(f, "{}", "GENERIC DISPLAY")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct ParseError {
|
pub struct ParseError {
|
||||||
err: String
|
err: String
|
||||||
|
Loading…
Reference in New Issue
Block a user