rust
```cargo
[dependencies]
chumsky = { version = "0.9.2" }
```
use chumsky::prelude::*;
use std::ops::Range;
#[derive(Debug)]
pub enum Token {
LetterA,
LetterB,
}
fn main() {
let source = "abba";
let result = letters().parse(source);
dbg!(&result);
}
fn letters() -> impl Parser<char, Vec<(Token, Range<usize>)>, Error = Simple<char>> {
letter1().or(letter2()).repeated()
}
fn letter1() -> impl Parser<char, (Token, Range<usize>), Error = Simple<char>> {
just("a").map_with_span(|_, span| (Token::LetterA, span))
}
fn letter2() -> impl Parser<char, (Token, Range<usize>), Error = Simple<char>> {
just("b").map_with_span(|_, span| (Token::LetterB, span))
}
results start
-
Individual Token are created with their spans in
[TODO: Code shorthand span ]
and
[TODO: Code shorthand span ]
then assembled into
a Vec in
[TODO: Code shorthand span ]