diff options
| author | Mel <einebeere@gmail.com> | 2021-11-21 19:44:47 +0100 |
|---|---|---|
| committer | Mel <einebeere@gmail.com> | 2021-11-21 19:44:47 +0100 |
| commit | 4e9d846fbd51cec9e8d931c4aa3f399668ac316e (patch) | |
| tree | cda2e8645662b6c083add5ac87a279381eec054f /src/main.rs | |
| parent | abaa72af8a1be00f3f84d7771a7994bfbbccf719 (diff) | |
| download | rabbithole-4e9d846fbd51cec9e8d931c4aa3f399668ac316e.tar.zst rabbithole-4e9d846fbd51cec9e8d931c4aa3f399668ac316e.zip | |
Basic errors for parsing.
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/src/main.rs b/src/main.rs index 0df0483..63f2347 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,10 +1,12 @@ -use std::{env, fs, path::Path}; +use std::{env, fs, path::Path, process::exit}; +mod error; mod interpret; mod lex; mod parse; mod types; +use error::RHError; use lex::lexer::Lexer; use interpret::walker::Walker; @@ -27,7 +29,7 @@ fn file(filename: impl AsRef<Path>) { let lexer = Lexer::new(&contents); let mut parser = Parser::new(lexer); - let node = parser.parse().expect("Failed parsing."); + let node = handle_error(parser.parse(), &contents); let mut walker = Walker::root(); walker.walk(&node); @@ -52,9 +54,19 @@ fn repl() { let lexer = Lexer::new(input_buffer.trim()); let mut parser = Parser::new(lexer); - let node = parser.expression().expect("Failed parsing."); + let node = handle_error(parser.expression(), &input_buffer); let result = walker.walk_expression(&node).expect("Failed interpreting."); println!("🥕: {:?}\n", result); } } + +fn handle_error<T>(result: Result<T, RHError>, source: &str) -> T { + match result { + Ok(x) => x, + Err(error) => { + print!("{}", error.hydrate_source(&source)); + exit(1); + } + } +} |
