diff options
| author | Mel <einebeere@gmail.com> | 2021-10-22 00:24:46 +0200 |
|---|---|---|
| committer | Mel <einebeere@gmail.com> | 2021-10-22 00:24:46 +0200 |
| commit | ce9007bd5aefc37cf7e48eefc0fab4049c8a6b7d (patch) | |
| tree | 45addff80a470ecfb381afe17e93400766618b20 /src | |
| parent | a134a21ba621d4c5222ac91fcf4543fb8660dc0c (diff) | |
| download | rabbithole-ce9007bd5aefc37cf7e48eefc0fab4049c8a6b7d.tar.zst rabbithole-ce9007bd5aefc37cf7e48eefc0fab4049c8a6b7d.zip | |
Split execution modes
Diffstat (limited to 'src')
| -rw-r--r-- | src/interpret/walker.rs | 2 | ||||
| -rw-r--r-- | src/main.rs | 39 | ||||
| -rw-r--r-- | src/parse/parser.rs | 2 |
3 files changed, 33 insertions, 10 deletions
diff --git a/src/interpret/walker.rs b/src/interpret/walker.rs index 576cfb5..16f3f1c 100644 --- a/src/interpret/walker.rs +++ b/src/interpret/walker.rs @@ -46,7 +46,7 @@ impl Walker { Ok(result) } - fn walk_expression(&mut self, node: &Expression) -> Result<Value> { + pub fn walk_expression(&mut self, node: &Expression) -> Result<Value> { match node { Expression::Binary { left, op, right } => { let new_value = match op { diff --git a/src/main.rs b/src/main.rs index d433a16..e4dfc4f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,18 +1,41 @@ +use std::{env, fs, path::Path}; + mod interpret; mod lex; mod parse; -use std::io::{self, Write}; - use lex::lexer::Lexer; use interpret::walker::Walker; use parse::parser::Parser; - -const PROMPT: &'static str = "🐇: "; +use std::io::{self, Write}; fn main() { - let walker = Walker::new(); + let args: Vec<String> = env::args().collect(); + + if let Some(filename) = args.get(1) { + file(filename) + } else { + repl() + } +} + +fn file(filename: impl AsRef<Path>) { + let contents = fs::read_to_string(filename).expect("Failed reading file."); + + let lexer = Lexer::new(&contents); + let mut parser = Parser::new(lexer); + + let node = parser.parse().expect("Failed parsing."); + let mut walker = Walker::new(); + + walker.walk(&node); +} + +fn repl() { + const PROMPT: &'static str = "🐇: "; + + let mut walker = Walker::new(); let mut input_buffer; @@ -28,9 +51,9 @@ fn main() { let lexer = Lexer::new(input_buffer.trim()); let mut parser = Parser::new(lexer); - let node = parser.parse().expect("Failed parsing."); - let result = walker.walk(&node).expect("Failed interpreting."); + let node = parser.expression().expect("Failed parsing."); + let result = walker.walk_expression(&node).expect("Failed interpreting."); - println!("🥕: {}\n", result); + println!("🥕: {:?}\n", result); } } diff --git a/src/parse/parser.rs b/src/parse/parser.rs index 0e865da..41fd954 100644 --- a/src/parse/parser.rs +++ b/src/parse/parser.rs @@ -70,7 +70,7 @@ impl<T: Iterator<Item = Token>> Parser<T> { Ok(Statement::Expression(expression)) } - fn expression(&mut self) -> Result<Expression> { + pub fn expression(&mut self) -> Result<Expression> { self.assignment_expression() } |
