diff --git a/src/lib.rs b/src/lib.rs index 2a06ac5..cc0e2cb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,8 +2,8 @@ pub mod token; pub mod expression; pub mod binding; -pub mod lex; -pub mod parse; -pub mod print; +pub mod read; pub mod eval; +pub mod print; + pub mod repl; diff --git a/src/read.rs b/src/read.rs new file mode 100644 index 0000000..2d971e1 --- /dev/null +++ b/src/read.rs @@ -0,0 +1,34 @@ +mod lex; +mod parse; + +use crate::expression::Expression; +use parse::parse; + +impl std::str::FromStr for Expression { + type Err = parse::Error; + + fn from_str(s: &str) -> Result { + parse(lex::TokenSource::new(std::io::Cursor::new(s))) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn expressions_can_be_read_from_string() { + let expr = "x - y".parse::().unwrap(); + assert_eq!( + expr, + Expression::difference( + Expression::Symbol('x'), + Expression::Symbol('y'))); + } + + #[test] + fn reading_string_with_invalid_syntax_yields_error() { + let result = "(x + 1".parse::(); + assert!(matches!(result, Err(parse::Error::InvalidSyntax))); + } +} diff --git a/src/lex.rs b/src/read/lex.rs similarity index 100% rename from src/lex.rs rename to src/read/lex.rs diff --git a/src/parse.rs b/src/read/parse.rs similarity index 95% rename from src/parse.rs rename to src/read/parse.rs index 2ea0c8f..dffe876 100644 --- a/src/parse.rs +++ b/src/read/parse.rs @@ -1,7 +1,6 @@ use crate::token::Token; use crate::expression::Expression; use crate::binding::{Binding, Power}; -use crate::lex::TokenSource; #[derive(Debug)] pub enum Error { @@ -18,14 +17,6 @@ impl std::fmt::Display for Error { } } -impl std::str::FromStr for Expression { - type Err = Error; - - fn from_str(s: &str) -> Result { - parse(TokenSource::new(std::io::Cursor::new(s))) - } -} - pub fn parse(input: I) -> Result where I: Iterator> { @@ -502,20 +493,4 @@ mod tests { let result = parse(tokens.into_iter().map(|t| Ok(t))); std::assert_matches!(result, Err(Error::InvalidSyntax)); } - - #[test] - fn expressions_can_be_read_from_string() { - let expr = "x - y".parse::().unwrap(); - assert_eq!( - expr, - Expression::difference( - Expression::Symbol('x'), - Expression::Symbol('y'))); - } - - #[test] - fn reading_string_with_invalid_syntax_yields_error() { - let result = "(x + 1".parse::(); - assert!(matches!(result, Err(Error::InvalidSyntax))); - } }