dsl: fixed expression handling

This commit is contained in:
🪞👃🪞 2025-07-31 22:33:59 +03:00
parent 9e0b7be9a9
commit 643658ab16
6 changed files with 384 additions and 270 deletions

View file

@ -0,0 +1,97 @@
use crate::*;
macro_rules!is_some(($exp:expr, $val:expr)=>{assert_eq!($exp, Ok(Some($val)))};);
macro_rules!is_none(($exp:expr)=>{assert_eq!($exp, Ok(None))};);
macro_rules!is_err(($exp:expr)=>{assert!($exp.is_err())};
($exp:expr, $err:expr)=>{assert_eq!($exp, Err($err))};);
#[test] fn test_exp () -> Result<(), DslError> {
let e0 = DslError::Unexpected('a');
let e1 = DslError::Unexpected('(');
let e2 = DslError::Unexpected('b');
let e3 = DslError::Unexpected('d');
let check = |src: &str, key, exp, head, tail|{
assert_eq!(src.key(), key, "{src}");
assert_eq!(src.exp(), exp, "{src}");
assert_eq!(src.head(), head, "{src}");
assert_eq!(src.tail(), tail, "{src}");
};
check("a", Ok(Some("a")), Err(e0), Ok(Some("a")), Ok(None));
check("(a)", Err(e1), Ok(Some("a")), Ok(Some("(a)")), Ok(None));
check("a b c", Err(e2), Err(e0), Ok(Some("a")), Ok(Some("b c")));
check("(a b c)", Err(e1), Ok(Some("a b c")), Ok(Some("(a b c)")), Ok(None));
check("(a b c) d e f", Err(e1), Err(e3), Ok(Some("(a b c)")), Ok(Some("d e f")));
check("a (b c d) e f", Err(e1), Err(e0), Ok(Some("a")), Ok(Some("(b c d) e f")));
assert!(is_whitespace(' '));
assert!(!is_key_start(' '));
assert!(is_key_start('f'));
is_some!(key_seek_start("foo"), 0);
is_some!(key_seek_start("foo "), 0);
is_some!(key_seek_start(" foo "), 1);
is_some!(key_seek_length(&" foo "[1..]), 3);
is_some!(key_seek("foo"), (0, 3));
is_some!(key_peek("foo"), "foo");
is_some!(key_seek("foo "), (0, 3));
is_some!(key_peek("foo "), "foo");
is_some!(key_seek(" foo "), (1, 3));
is_some!(key_peek(" foo "), "foo");
is_err!("(foo)".key());
is_err!("foo".exp());
is_some!("(foo)".exp(), "foo");
is_some!("(foo)".head(), "(foo)");
is_none!("(foo)".tail());
is_some!("(foo bar baz)".exp(), "foo bar baz");
is_some!("(foo bar baz)".head(), "(foo bar baz)");
is_none!("(foo bar baz)".tail());
is_some!("(foo bar baz)".exp().head(), "foo");
is_some!("(foo bar baz)".exp().tail(), "bar baz");
is_some!("(foo bar baz)".exp().tail().head(), "bar");
is_some!("(foo bar baz)".exp().tail().tail(), "baz");
is_err!("foo".exp());
is_some!("foo".key(), "foo");
is_some!(" foo".key(), "foo");
is_some!(" foo ".key(), "foo");
is_some!(" foo ".head(), "foo");
//assert_eq!(" foo ".head().head(), Ok(None));
is_none!(" foo ".head().tail());
is_none!(" foo ".tail());
is_none!(" foo ".tail().head());
is_none!(" foo ".tail().tail());
assert_eq!(" foo bar ".head(), Ok(Some("foo")));
//assert_eq!(" foo bar ".head().head(), Ok(None));
assert_eq!(" foo bar ".head().tail(), Ok(None));
assert_eq!(" foo bar ".tail(), Ok(Some(" bar ")));
assert_eq!(" foo bar ".tail().head(), Ok(Some("bar")));
assert_eq!(" foo bar ".tail().tail(), Ok(None));
assert_eq!(" (foo) ".head(), Ok(Some("(foo)")));
//assert_eq!(" (foo) ".head().head(), Ok(Some("foo")));
//assert_eq!(" (foo) ".head().head().head(), Ok(None));
assert_eq!(" (foo) ".tail(), Ok(None));
assert_eq!(" (foo) (bar) ".head(), Ok(Some("(foo)")));
//assert_eq!(" (foo) (bar) ".head().head(), Ok(Some("foo")));
//assert_eq!(" (foo) (bar) ".head().head().head(), Ok(None));
is_some!(" (foo) (bar) ".tail(), " (bar) ");
is_some!(" (foo) (bar) ".tail().head(), "(bar)");
is_some!(" (foo) (bar) ".tail().head().head(), "(bar)");
is_some!(" (foo) (bar) ".tail().head().exp(), "bar");
is_some!(" (foo) (bar) ".tail().head().exp().head(), "bar");
is_some!(" (foo bar baz) ".head(), "(foo bar baz)");
is_some!(" (foo bar baz) ".head().head(), "(foo bar baz)");
is_some!(" (foo bar baz) ".exp(), "foo bar baz");
is_some!(" (foo bar baz) ".exp().head(), "foo");
is_some!(" (foo bar baz) ".exp().tail(), "bar baz");
is_some!(" (foo bar baz) ".exp().tail().head(), "bar");
is_some!(" (foo bar baz) ".exp().tail().tail(), "baz");
is_none!(" (foo bar baz) ".tail());
Ok(())
}