regast 0.1.0

Regular expressions with first-class syntax and parse trees
Documentation
use regast::{Backend, PtKind, Regast, Span};

#[test]
fn finds_leftmost_longest_match_with_absolute_spans() {
    let tree = Regast::new("(a|ab)")
        .unwrap()
        .find_parse("zababa")
        .unwrap()
        .unwrap();
    assert_eq!(tree.flatten(), "ab");
    assert_eq!(tree.match_span(), Span::new(1, 3));
    assert_eq!(tree.group_all(1)[0].span, Span::new(1, 3));
    assert!(matches!(
        tree.walk()
            .find(|node| matches!(node.kind, PtKind::AltTaken { .. }))
            .unwrap()
            .kind,
        PtKind::AltTaken { arm: 1 }
    ));
}

#[test]
fn anchors_use_full_input_boundaries_during_search() {
    assert!(
        Regast::new("^ab")
            .unwrap()
            .find_parse("zab")
            .unwrap()
            .is_none()
    );

    let start = Regast::new("^ab")
        .unwrap()
        .find_parse("abz")
        .unwrap()
        .unwrap();
    assert_eq!(start.match_span(), Span::new(0, 2));

    let end = Regast::new("ab$")
        .unwrap()
        .find_parse("zab")
        .unwrap()
        .unwrap();
    assert_eq!(end.match_span(), Span::new(1, 3));

    let empty_end = Regast::new("$").unwrap().find_parse("é").unwrap().unwrap();
    assert_eq!(empty_end.match_span(), Span::new(2, 2));
}

#[test]
fn alternate_backends_preserve_search_and_parse_semantics() {
    for backend in [Backend::Antimirov, Backend::TaggedNfa] {
        let regex = Regast::builder("^a|ab+$").backend(backend).build().unwrap();
        assert!(regex.is_match("a"));
        assert!(!regex.is_match("zab"));
        let tree = regex.find_parse("zabbb").unwrap().unwrap();
        assert_eq!(tree.flatten(), "abbb");
        assert_eq!(tree.match_span(), Span::new(1, 5));

        let anchored = Regast::builder("^([ab]+)$")
            .backend(backend)
            .build()
            .unwrap()
            .parse("abba")
            .unwrap();
        assert_eq!(anchored.flatten(), "abba");
        assert_eq!(anchored.group_all(1)[0].span, Span::new(0, 4));
    }
}