wip dreamberd lexer, parser and compiler
1use std::fmt::{self, Debug, Display, Formatter};
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
4pub enum TokenType {
5 FunctionDeclaration,
6 Identifier,
7 Lparen,
8 Rparen,
9 Arrow,
10 Lbrace,
11 Rbrace,
12 StringLiteral,
13 Eol,
14 EolDebug,
15 IntLiteral,
16 Primitive,
17 Comma,
18 BoolLiteral,
19 Return,
20 Not,
21 Equals,
22}
23
24#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
25pub struct Location {
26 pub line: u32,
27 pub col: u32,
28}
29
30impl Display for Location {
31 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
32 write!(f, "(line: {}, col: {})", self.line, self.col)
33 }
34}
35
36#[derive(Clone, PartialEq, Eq, PartialOrd, Ord)]
37pub struct Token {
38 pub ty: TokenType,
39 pub value: String,
40 pub location: Location,
41}
42
43impl Debug for Token {
44 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
45 match self.ty {
46 TokenType::FunctionDeclaration => write!(f, "FunctionDeclaration"),
47 TokenType::Identifier => write!(f, "Identifier({})", self.value.clone()),
48 TokenType::Lparen => write!(f, "Lparen"),
49 TokenType::Rparen => write!(f, "Rparen"),
50 TokenType::Arrow => write!(f, "Arrow"),
51 TokenType::Lbrace => write!(f, "Lbrace"),
52 TokenType::Rbrace => write!(f, "Rbrace"),
53 TokenType::StringLiteral => write!(f, "StringLiteral({:?})", self.value.clone()),
54 TokenType::Eol => write!(f, "Eol"),
55 TokenType::EolDebug => write!(f, "EolDebug"),
56 TokenType::IntLiteral => write!(f, "IntLiteral({})", self.value.clone()),
57 TokenType::Primitive => write!(f, "Primitive({})", self.value.clone()),
58 TokenType::Comma => write!(f, "Comma"),
59 TokenType::BoolLiteral => write!(f, "BoolLiteral({})", self.value.clone()),
60 TokenType::Return => write!(f, "Return"),
61 TokenType::Not => write!(f, "Not"),
62 TokenType::Equals => write!(f, "Equals"),
63 }
64 }
65}