use logos::Logos;
use std::fmt;
#[derive(Logos, Clone, Debug, PartialEq)]
#[logos(skip r"[ \t\f]+")] #[logos(skip r"//[^\n]*")] #[logos(skip r"/\*([^*]|\*[^/])*\*/")] pub enum Token {
#[token("def")]
Def,
#[token("if")]
If,
#[token("elif")]
Elif,
#[token("else")]
Else,
#[token("for")]
For,
#[token("while")]
While,
#[token("return")]
Return,
#[token("struct")]
Struct,
#[token("class")]
Class,
#[token("const")]
Const,
#[token("import")]
Import,
#[token("as")]
As,
#[token("match")]
Match,
#[token("lambda")]
Lambda,
#[token("or")]
Or,
#[token("and")]
And,
#[token("not")]
Not,
#[token("async")]
Async,
#[token("await")]
Await,
#[token("unsafe")]
Unsafe,
#[token("safe")]
Safe,
#[token("in")]
In,
#[token("true")]
True,
#[token("false")]
False,
#[token("asm")]
Asm,
#[token("comptime")]
Comptime,
#[token("impl")]
Impl,
#[token("mut")]
Mut,
#[token("enum")]
Enum,
#[token("let")]
Let,
#[token("int")]
TypeInt,
#[token("float")]
TypeFloat,
#[token("bool")]
TypeBool,
#[token("string")]
TypeString,
#[token("void")]
TypeVoid,
#[token("auto")]
TypeAuto,
#[regex(r"[a-zA-Z_][a-zA-Z0-9_]*", |lex| lex.slice().to_string())]
Ident(String),
#[regex(r"[0-9]+", |lex| lex.slice().parse().ok())]
IntLit(i64),
#[regex(r"[0-9]+\.[0-9]+", |lex| lex.slice().parse().ok())]
FloatLit(f64),
#[regex(r#""([^"\\]|\\.)*""#, |lex| lex.slice().to_string())]
StringLit(String),
#[token("+")]
Plus,
#[token("-")]
Minus,
#[token("*")]
Star,
#[token("/")]
Slash,
#[token("%")]
Percent,
#[token("=")]
Eq,
#[token("+=")]
PlusEq,
#[token("-=")]
MinusEq,
#[token("*=")]
StarEq,
#[token("/=")]
SlashEq,
#[token("==")]
EqEq,
#[token("!=")]
NotEq,
#[token("<")]
Lt,
#[token(">")]
Gt,
#[token("<=")]
LtEq,
#[token(">=")]
GtEq,
#[token("->")]
Arrow,
#[token("::")]
ColonColon,
#[token("..")]
DotDot,
#[token("(")]
LParen,
#[token(")")]
RParen,
#[token("{")]
LBrace,
#[token("}")]
RBrace,
#[token("[")]
LBracket,
#[token("]")]
RBracket,
#[token(":")]
Colon,
#[token(";")]
Semi,
#[token(",")]
Comma,
#[token(".")]
Dot,
#[regex(r"\n[ \t]*")]
Newline,
Indent,
Dedent,
Error,
}
impl fmt::Display for Token {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{:?}", self)
}
}