197 lines
5.7 KiB
Rust
197 lines
5.7 KiB
Rust
use std::fmt;
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
|
pub struct Token {
|
|
pub token_type: TokenType,
|
|
pub lexeme: String,
|
|
pub line: usize,
|
|
}
|
|
|
|
impl Token {
|
|
pub(crate) fn new(tokentype: TokenType, lexeme: String, line: usize) -> Self {
|
|
Self {
|
|
token_type: tokentype,
|
|
lexeme,
|
|
line,
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(Debug, PartialEq, Clone, Hash)]
|
|
pub enum TokenType {
|
|
Any,
|
|
Bang,
|
|
BangEqual,
|
|
BitAnd,
|
|
Pipe,
|
|
BitXor,
|
|
Bool,
|
|
Char,
|
|
Colon,
|
|
ColonColon,
|
|
Comma,
|
|
DateTime,
|
|
Dot,
|
|
Else,
|
|
Eof,
|
|
Eol,
|
|
Equal,
|
|
EqualEqual,
|
|
Error,
|
|
F32,
|
|
F64,
|
|
False,
|
|
Fn,
|
|
For,
|
|
Greater,
|
|
GreaterEqual,
|
|
GreaterGreater,
|
|
Hash,
|
|
Hex,
|
|
I32,
|
|
I64,
|
|
Identifier,
|
|
If,
|
|
In,
|
|
Indent,
|
|
Integer,
|
|
SignedInteger,
|
|
UnsignedInteger,
|
|
LeftBrace,
|
|
LeftBracket,
|
|
LeftParen,
|
|
Less,
|
|
LessEqual,
|
|
LessLess,
|
|
Let,
|
|
ListType,
|
|
MapType,
|
|
LogicalAnd,
|
|
LogicalOr,
|
|
Minus,
|
|
Not,
|
|
FloatingPoint,
|
|
Object,
|
|
Plus,
|
|
Print,
|
|
Question,
|
|
Range,
|
|
Return,
|
|
RightParen,
|
|
RightBrace,
|
|
RightBracket,
|
|
Semicolon,
|
|
SingleRightArrow,
|
|
Slash,
|
|
Star,
|
|
StringType,
|
|
True,
|
|
U32,
|
|
U64,
|
|
Unknown,
|
|
Void,
|
|
While,
|
|
ObjectType(String),
|
|
}
|
|
|
|
impl fmt::Display for TokenType {
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
match self {
|
|
TokenType::Any => write!(f, "any"),
|
|
TokenType::StringType => write!(f, "string"),
|
|
TokenType::DateTime => write!(f, "datetime"),
|
|
TokenType::Char => write!(f, "char"),
|
|
TokenType::I32 => write!(f, "i32"),
|
|
TokenType::I64 => write!(f, "i64"),
|
|
TokenType::U32 => write!(f, "u32"),
|
|
TokenType::U64 => write!(f, "u64"),
|
|
TokenType::F32 => write!(f, "f32"),
|
|
TokenType::F64 => write!(f, "f64"),
|
|
TokenType::Bool => write!(f, "bool"),
|
|
TokenType::Bang => write!(f, "!"),
|
|
TokenType::BangEqual => write!(f, "!="),
|
|
TokenType::BitAnd => write!(f, "&"),
|
|
TokenType::Pipe => write!(f, "|"),
|
|
TokenType::BitXor => write!(f, "^"),
|
|
TokenType::Colon => write!(f, ":"),
|
|
TokenType::ColonColon => write!(f, "::"),
|
|
TokenType::Comma => write!(f, ","),
|
|
TokenType::FloatingPoint => write!(f, "float"),
|
|
TokenType::MapType => write!(f, "map"),
|
|
TokenType::ListType => write!(f, "list"),
|
|
TokenType::Dot => write!(f, "."),
|
|
TokenType::Else => write!(f, "else"),
|
|
TokenType::Eof => write!(f, "EOF"),
|
|
TokenType::Eol => write!(f, "EOL"),
|
|
TokenType::Equal => write!(f, "="),
|
|
TokenType::EqualEqual => write!(f, "=="),
|
|
TokenType::Error => write!(f, "error"),
|
|
TokenType::False => write!(f, "false"),
|
|
TokenType::Fn => write!(f, "fn"),
|
|
TokenType::For => write!(f, "for"),
|
|
TokenType::Greater => write!(f, ">"),
|
|
TokenType::GreaterEqual => write!(f, ">="),
|
|
TokenType::GreaterGreater => write!(f, ">>"),
|
|
TokenType::Hash => write!(f, "#"),
|
|
TokenType::Hex => write!(f, "0x"),
|
|
TokenType::If => write!(f, "if"),
|
|
TokenType::Identifier => write!(f, "identifier"),
|
|
TokenType::In => write!(f, "in"),
|
|
TokenType::Indent => write!(f, "indent"),
|
|
TokenType::Integer => write!(f, "integer"),
|
|
TokenType::LeftBrace => write!(f, "{{"),
|
|
TokenType::LeftBracket => write!(f, "["),
|
|
TokenType::LeftParen => write!(f, "("),
|
|
TokenType::Less => write!(f, "<"),
|
|
TokenType::LessEqual => write!(f, "<="),
|
|
TokenType::LessLess => write!(f, "<<"),
|
|
TokenType::Let => write!(f, "let"),
|
|
TokenType::LogicalAnd => write!(f, "&&"),
|
|
TokenType::LogicalOr => write!(f, "||"),
|
|
TokenType::Minus => write!(f, "-"),
|
|
TokenType::Not => write!(f, "not"),
|
|
TokenType::Object => write!(f, "object"),
|
|
TokenType::ObjectType(_) => write!(f, "object"),
|
|
TokenType::Plus => write!(f, "+"),
|
|
TokenType::Print => write!(f, "print"),
|
|
TokenType::Question => write!(f, "?"),
|
|
TokenType::Range => write!(f, ".."),
|
|
TokenType::Return => write!(f, "return"),
|
|
TokenType::RightParen => write!(f, ")"),
|
|
TokenType::RightBrace => write!(f, "}}"),
|
|
TokenType::RightBracket => write!(f, "]"),
|
|
TokenType::Semicolon => write!(f, ";"),
|
|
TokenType::SingleRightArrow => write!(f, "->"),
|
|
TokenType::Slash => write!(f, "/"),
|
|
TokenType::Star => write!(f, "*"),
|
|
TokenType::True => write!(f, "true"),
|
|
TokenType::Unknown => write!(f, "?"),
|
|
TokenType::Void => write!(f, "()"),
|
|
TokenType::While => write!(f, "while"),
|
|
TokenType::SignedInteger => write!(f, "i32/64"),
|
|
TokenType::UnsignedInteger => write!(f, "u32/64"),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl Eq for TokenType {}
|
|
|
|
impl TokenType {
|
|
pub(crate) fn is_type(&self) -> bool {
|
|
matches!(
|
|
self,
|
|
TokenType::I32
|
|
| TokenType::I64
|
|
| TokenType::U32
|
|
| TokenType::U64
|
|
| TokenType::F32
|
|
| TokenType::F64
|
|
| TokenType::StringType
|
|
| TokenType::DateTime
|
|
| TokenType::Object
|
|
| TokenType::ListType
|
|
| TokenType::MapType
|
|
| TokenType::Char
|
|
)
|
|
}
|
|
}
|