iowo/src/lexer.rs

59 lines
1.2 KiB
Rust
Raw Normal View History

2023-11-15 10:55:14 +01:00
use logos::Logos;
#[derive(Logos, Debug, PartialEq)]
#[logos(skip r"[\s]+")]
pub enum Token<'a> {
#[regex("[\\w]+", |lex| lex.slice())]
Word(&'a str),
#[regex("[\\d]+", priority = 2, callback = |lex| lex.slice().parse::<i64>().unwrap())]
IntLiteral(i64),
#[regex("[\\d]+.[\\d]+", |lex| lex.slice().parse::<f64>().unwrap())]
FloatLiteral(f64),
#[regex(r#""([^"\\]|\\["\\bnfrt]|u[a-fA-F0-9]{4})*""#, |lex| lex.slice().to_owned())]
StringLiteral(String),
#[token("def")]
Define,
#[token("type")]
Type,
#[token("->")]
RightArrow,
#[token("|")]
Pipe,
#[token("[")]
BracketOpening,
#[token("]")]
BracketClosing,
#[token("(")]
ParensOpening,
#[token(")")]
ParensClosing,
#[token("{")]
BraceOpening,
#[token("}")]
BraceClosing,
#[token("+")]
Plus,
#[token("-")]
Minus,
#[token("*")]
Multiply,
#[token("/")]
Divide,
#[token("%")]
Percent,
#[token("&")]
Ampersand,
#[token(":")]
Colon,
#[token(";")]
Semicolon,
#[token(".")]
Dot,
#[token(",")]
Comma,
#[token("!")]
ExclaimationMark,
#[token("?")]
QuestionMark,
}