skylang/src/lex/tok.rs

107 lines
2.1 KiB
Rust

#![allow(unused)]
use logos::Logos;
use logos::Lexer;
use core::iter::Peekable;
pub use Token::*;
#[derive(Debug, Logos, PartialEq, Eq)]
#[logos(skip r"[ \t\n\f]+")]
pub enum Token {
// SINGLE CHARACTER TOKENS
#[token(";")]
Semicolon, // ;
#[token("=")]
Equal, // =
#[token("(")]
LeftParen, // (
#[token(")")]
RightParen, // )
#[token("{")]
LeftBrace, // {
#[token("}")]
RightBrace, // }
#[token(",")]
Comma, // ,
#[token(".")]
Dot, // .
#[token("-")]
Minus, // -
#[token("+")]
Plus, // +
#[token("/")]
Slash, // /
#[token("*")]
Star, // *
#[token("%")]
Percent, // %
#[token("!")]
Bang, // !
#[token(":")]
Colon, // :
#[token("<")]
Less, // <
#[token(">")]
Greater, // >
#[token("|")]
Pipe, // |
// KEYWORDS
#[token("fnaf")]
Fnaf, // fnaf
#[token("let")]
Let, // let
#[token("if")]
If, // if
#[token("else")]
Else, // else
#[token("while")]
While, // while
#[token("elif")]
Elif, // elif
#[token("return")]
Return, // return
#[token("for")]
For, // for
#[token("in")]
In, // in
#[token("break")]
Break, // break
#[token("continue")]
Continue, // continue
// TWO CHARACTER TOKENS
#[token("==")]
EqualEqual, // ==
#[token("!=")]
BangEqual, // !=
#[token("<=")]
LessEqual, // <=
#[token(">=")]
GreaterEqual, // >=
// LITERALS
#[regex(r#"("[^"]*")|('[^']*')"#)]
String, // A string literal.
#[regex("[0-9]+", |lex| lex.slice().parse().ok())]
Number(u64), // An integer.
#[regex(r#"[^[0-9]^"^-^[ \t\n\f]^\.^=^(^)^{^}.^,^;^[+-/*%]]+[^"^-^=^\..^[ \t\n\f]^(^)^{^}^,^;^[+-/*%]]*"#)]
Identifier, // An identifier.
#[token("true")]
True, // true
#[token("false")]
False, // false
#[token("none")]
Null, // none
}
pub fn lex_str(this: &str) -> Vec<(Token, &str)> {
let mut buf = Vec::new();
let mut lexer = Token::lexer(this);
while let Some(Ok(token)) = lexer.next() {
buf.push((token, lexer.slice()));
}
buf
}