diff --git a/src/main.rs b/src/main.rs index 0916f22..65d41e3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,13 +2,15 @@ use crate::init_tracing::init_telemetry; use crate::init_tracing::shutdown_telemetry; use ::organic::parser::document; +use organic::parser::sexp::sexp; mod init_tracing; const TEST_DOC: &'static str = include_str!("../toy_language.txt"); fn main() -> Result<(), Box> { init_telemetry()?; - let parsed = document(TEST_DOC); + // let parsed = document(TEST_DOC); + let parsed = sexp(TEST_DOC); println!("{}\n\n\n", TEST_DOC); println!("{:#?}", parsed); shutdown_telemetry()?; diff --git a/src/parser/sexp.rs b/src/parser/sexp.rs index 25a866a..ea4a5a6 100644 --- a/src/parser/sexp.rs +++ b/src/parser/sexp.rs @@ -124,7 +124,7 @@ fn quoted_atom<'s>(input: &'s str) -> Res<&'s str, Token<'s>> { let (remaining, _) = tag(r#"""#)(input)?; let (remaining, _) = escaped( take_till1(|c| match c { - '\\' | '"' | ')' => true, + '\\' | '"' => true, _ => false, }), '\\', @@ -215,4 +215,40 @@ mod tests { r#""foo""# ) } + + #[test] + fn quoted_containing_paren() { + let input = r#" (foo "b(a)r" baz ) "#; + let (remaining, parsed) = sexp_with_padding(input).expect("Parse the input"); + assert_eq!(remaining, ""); + assert!(match parsed { + Token::List(_) => true, + _ => false, + }); + let children = match parsed { + Token::List(children) => children, + _ => panic!("Should be a list."), + }; + assert_eq!( + match children.first() { + Some(Token::Atom(body)) => *body, + _ => panic!("First child should be an atom."), + }, + r#"foo"# + ); + assert_eq!( + match children.iter().nth(1) { + Some(Token::Atom(body)) => *body, + _ => panic!("Second child should be an atom."), + }, + r#""b(a)r""# + ); + assert_eq!( + match children.iter().nth(2) { + Some(Token::Atom(body)) => *body, + _ => panic!("Third child should be an atom."), + }, + r#"baz"# + ); + } } diff --git a/toy_language.txt b/toy_language.txt index 8f7fcaf..cdc3bc8 100644 --- a/toy_language.txt +++ b/toy_language.txt @@ -1,3 +1,5 @@ -| foo | bar | -|-----+-------| -| baz | lorem | +(org-data nil + (section + (:begin 1 :end 9 :contents-begin 1 :contents-end 9 :post-blank 0 :post-affiliated 1 :parent #0) + (diary-sexp + (:value "%%(foo)" :begin 1 :end 9 :post-blank 0 :post-affiliated 1 :parent #1))))