use logos::Logos;
use crate::diagnostics::parse::LexError;
#[derive(logos_display::Display, logos_display::Debug, Logos, PartialEq, Eq, Clone, Copy)]
#[logos(error(LexError, LexError::from_lexer))]
#[logos(skip r"[ \t\r\n\f]+", skip r"//[^/\n]*", skip r"\/\*(.|\n)*\*\/")]
pub enum Token {
#[token("(")]
LParen,
#[token(")")]
RParen,
#[token("{")]
LBrace,
#[token("}")]
RBrace,
#[token("[")]
LSquareBracket,
#[token("]")]
RSquareBracket,
#[token("<")]
Less,
#[token(">")]
Greater,
#[token("=")]
Eq,
#[token("!")]
Bang,
#[token(":")]
Colon,
#[token(".")]
Dot,
#[token(",")]
Comma,
#[token(";")]
Semicolon,
#[token("+")]
Plus,
#[token("-")]
Minus,
#[token("*")]
Star,
#[token("/")]
Slash,
#[token("<=")]
EqLess,
#[token(">=")]
EqGreater,
#[token("==")]
EqEq,
#[token("!=")]
BangEq,
#[token("in")]
In,
#[token("if")]
If,
#[token("else")]
Else,
#[token("while")]
While,
#[token("for")]
For,
#[token("struct")]
Struct,
#[token("pub")]
Pub,
#[token("sym")]
Sym,
#[token("df")]
Df,
#[token("let")]
Let,
#[token("return")]
Return,
#[token("and")]
And,
#[token("or")]
Or,
#[token("true")]
True,
#[token("false")]
False,
#[regex(r#""[^"]*""#)]
Str,
#[regex(r"0|[1-9]\d*(\.\d+)?")]
Num,
#[regex(r"[\p{XID_Start}_]\p{XID_Continue}*")]
Ident,
}