153 lines
3.9 KiB
Rust
153 lines
3.9 KiB
Rust
use std::fmt;
|
|
|
|
#[derive(Clone, Debug, PartialEq, Hash, Eq)]
|
|
pub enum Token {
|
|
Error(char),
|
|
Name { name: String },
|
|
UpName { name: String },
|
|
DiscardName { name: String },
|
|
Int { value: String },
|
|
String { value: String },
|
|
// Groupings
|
|
LeftParen, // (
|
|
RightParen, // )
|
|
LeftSquare, // [
|
|
RightSquare, // }
|
|
LeftBrace, // {
|
|
RightBrace, // }
|
|
// Int Operators
|
|
Plus,
|
|
Minus,
|
|
Star,
|
|
Slash,
|
|
Less,
|
|
Greater,
|
|
LessEqual,
|
|
GreaterEqual,
|
|
Percent,
|
|
// ByteString Operators
|
|
PlusDot, // '+.'
|
|
MinusDot, // '-.'
|
|
StarDot, // '*.'
|
|
SlashDot, // '/.'
|
|
LessDot, // '<.'
|
|
GreaterDot, // '>.'
|
|
LessEqualDot, // '<=.'
|
|
GreaterEqualDot, // '>=.'
|
|
// Other Punctuation
|
|
Colon,
|
|
Comma,
|
|
Hash, // '#'
|
|
Bang, // '!'
|
|
Equal,
|
|
EqualEqual, // '=='
|
|
NotEqual, // '!='
|
|
Vbar, // '|'
|
|
VbarVbar, // '||'
|
|
AmperAmper, // '&&'
|
|
Pipe, // '|>'
|
|
Dot, // '.'
|
|
RArrow, // '->'
|
|
DotDot, // '..'
|
|
EndOfFile,
|
|
// Docs/Extra
|
|
Comment,
|
|
DocComment,
|
|
ModuleComment,
|
|
EmptyLine,
|
|
NewLine,
|
|
// Keywords (alphabetically):
|
|
As,
|
|
Assert,
|
|
Check,
|
|
Const,
|
|
Fn,
|
|
If,
|
|
Else,
|
|
Is,
|
|
Let,
|
|
Opaque,
|
|
Pub,
|
|
Use,
|
|
Test,
|
|
Todo,
|
|
Type,
|
|
When,
|
|
}
|
|
|
|
impl fmt::Display for Token {
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
let s = match self {
|
|
Token::Error(c) => {
|
|
write!(f, "\"{}\"", c)?;
|
|
return Ok(());
|
|
}
|
|
Token::Name { name } => name,
|
|
Token::UpName { name } => name,
|
|
Token::DiscardName { name } => name,
|
|
Token::Int { value } => value,
|
|
Token::String { value } => value,
|
|
Token::LeftParen => "(",
|
|
Token::RightParen => ")",
|
|
Token::LeftSquare => "[",
|
|
Token::RightSquare => "]",
|
|
Token::LeftBrace => "{",
|
|
Token::RightBrace => "}",
|
|
Token::Plus => "+",
|
|
Token::Minus => "-",
|
|
Token::Star => "*",
|
|
Token::Slash => "/",
|
|
Token::Less => "<",
|
|
Token::Greater => ">",
|
|
Token::LessEqual => "<=",
|
|
Token::GreaterEqual => ">=",
|
|
Token::Percent => "%",
|
|
Token::PlusDot => "+.",
|
|
Token::MinusDot => "-.",
|
|
Token::StarDot => "*.",
|
|
Token::SlashDot => "/.",
|
|
Token::LessDot => "<.",
|
|
Token::GreaterDot => ">.",
|
|
Token::LessEqualDot => "<=.",
|
|
Token::GreaterEqualDot => ">=.",
|
|
Token::Colon => ":",
|
|
Token::Comma => ",",
|
|
Token::Hash => "#",
|
|
Token::Bang => "!",
|
|
Token::Equal => "=",
|
|
Token::EqualEqual => "==",
|
|
Token::NotEqual => "!=",
|
|
Token::Vbar => "|",
|
|
Token::VbarVbar => "||",
|
|
Token::AmperAmper => "&&",
|
|
Token::Pipe => "|>",
|
|
Token::Dot => ".",
|
|
Token::RArrow => "->",
|
|
Token::DotDot => "..",
|
|
Token::EndOfFile => "EOF",
|
|
Token::Comment => "//",
|
|
Token::DocComment => "///",
|
|
Token::ModuleComment => "////",
|
|
Token::EmptyLine => "EMPTYLINE",
|
|
Token::NewLine => "NEWLINE",
|
|
Token::As => "as",
|
|
Token::Assert => "assert",
|
|
Token::Check => "check",
|
|
Token::When => "when",
|
|
Token::Is => "is",
|
|
Token::Const => "const",
|
|
Token::Fn => "fn",
|
|
Token::If => "if",
|
|
Token::Else => "else",
|
|
Token::Use => "import",
|
|
Token::Let => "let",
|
|
Token::Opaque => "opaque",
|
|
Token::Pub => "pub",
|
|
Token::Todo => "todo",
|
|
Token::Type => "type",
|
|
Token::Test => "test",
|
|
};
|
|
write!(f, "\"{}\"", s)
|
|
}
|
|
}
|