protokit_textformat 0.2.0

Usable protocol buffers
Documentation
use logos::Logos;

#[repr(u8)]
#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Logos)]
#[logos(subpattern idt = r"[_a-zA-Z][_0-9a-zA-Z]*")]
#[logos(subpattern extidt = r"(?&idt)(\.(?&idt))*")]
#[logos(subpattern dec = r"[1-9][0-9]*")]
#[logos(subpattern oct = r"0[0-9]*")]
#[logos(subpattern dig = r"[0-9]+")]
#[logos(subpattern hex = r"0x[0-9a-fA-F][0-9a-fA-F]?")]
#[logos(subpattern exp = r"[eE][+-]?[0-9]+")]
#[logos(skip r"[ \t\n\f]+")]
pub enum Token {
    #[regex(r"#[^\n]+", logos::skip)]
    Comment,

    #[regex("(?&idt)")]
    Ident,

    #[regex(r"\[(?&extidt)(/(?&extidt))?\]")]
    ExtIdent,

    #[regex("(?&dec)", priority = 3)]
    DecLit,
    #[regex("(?&hex)", priority = 2)]
    HexLit,
    #[regex("(?&oct)", priority = 2)]
    OctLit,

    #[regex(r"(?&dig)(.(?&dig))?([eE][+-]?(?&dig))?", priority = 1)]
    FltLit,

    #[regex(r#""([^"\\]|\\.)*"|'([^'\\]|\\.)*'"#)]
    StrLit,

    #[token("{")]
    LBrace,
    #[token("}")]
    RBrace,

    #[token("[")]
    LBracket,
    #[token("]")]
    RBracket,

    #[token("<")]
    LAngle,
    #[token(">")]
    RAngle,

    #[token(";")]
    Semi,
    #[token(":")]
    Colon,

    #[token(",")]
    Comma,
    #[token("-")]
    Minus,

    Error,

    StartOfFile,
    EndOfFile,
}

#[cfg(test)]
mod test {
    use logos::Lexer;

    use crate::lex::Token;

    #[test]
    fn test_lex_any() {
        let txt = "[a/a.a] { }";
        let mut lex = Lexer::<Token>::new(txt);
        assert_eq!(lex.next(), Some(Ok(Token::ExtIdent)));
        assert_eq!(lex.slice(), "[a/a.a]");
    }
}