diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib.rs | 1 | ||||
-rw-r--r-- | src/parse/mod.rs | 3 | ||||
-rw-r--r-- | src/parse/parsetree.rs | 40 | ||||
-rw-r--r-- | src/parse/util.rs | 11 |
4 files changed, 55 insertions, 0 deletions
@@ -1 +1,2 @@ pub mod sexp; +pub mod parse; diff --git a/src/parse/mod.rs b/src/parse/mod.rs new file mode 100644 index 0000000..0da7a30 --- /dev/null +++ b/src/parse/mod.rs @@ -0,0 +1,3 @@ + +pub mod parsetree; +pub mod util; diff --git a/src/parse/parsetree.rs b/src/parse/parsetree.rs new file mode 100644 index 0000000..8887200 --- /dev/null +++ b/src/parse/parsetree.rs @@ -0,0 +1,40 @@ + +use nom::{ + IResult, + Parser, +}; + + +#[derive(Debug,PartialEq)] +pub enum Token { + ParOpen, + ParClose, + Num(i32), + Sym(String), + Whitespace(String), +} + +fn parse_token(s: &str) -> IResult<&str, Token> { + todo!() +} + +#[cfg(test)] +mod private_parsing_tests { + use super::{*, Token::*}; + use crate::parse::util::*; + + #[test] + fn test_parse_token() { + assert_eq!(parse_token("()"), Ok((")", ParOpen))); + assert_eq!(parse_token(")"), Ok(("", ParClose))); + + assert_eq!(parse_token(" \t\n"), Ok(("", whitespace(" \t\n")))); + + assert_eq!(parse_token("1 23"), Ok((" 23", Num(1)))); + assert_eq!(parse_token("23"), Ok(("", Num(23)))); + + assert_eq!(parse_token("Nil a"), Ok((" a", sym("Nil")))); + assert_eq!(parse_token("a"), Ok(("", sym("a")))); + } + +} diff --git a/src/parse/util.rs b/src/parse/util.rs new file mode 100644 index 0000000..864005a --- /dev/null +++ b/src/parse/util.rs @@ -0,0 +1,11 @@ + +use crate::parse::parsetree::Token::*; +use crate::parse::parsetree::Token; + +pub fn sym(s: &str) -> Token { + Sym(s.to_string()) +} + +pub fn whitespace(s: &str) -> Token { + Whitespace(s.to_string()) +} |