1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
| #ifndef TOKEN_HPP
| #define TOKEN_HPP
| #include <cstdint>
| #include <string>
| #include <unordered_map>
|
| namespace Tokens {
| enum class Type : std::uint8_t {
| ParserOpenTag,
| ParserCloseTag,
| ParserIfStatement, // if
| FileClose,
| Identifier,
| StringLiteral,
| IntLiteral,
| DoubleLiteral,
| BooleanLiteral,
| LeftParenthesis, // (
| RightParenthesis, // )
| Comma, // ,
| Semicolon, // ;
| Variable, // $variable
| VariableSign, // $ variable start sign
| StringDeclaration, // string $variable
| IntDeclaration, // int $variable
| DoubleDeclaration, // double $variable
| BooleanDeclaration, // bool $variable
| FunctionDeclaration, // function fn_name
| FunctionCall, // fn_name(args)
| Return, // return
| Equals, // =
| Plus, // +
| Minus, // -
| Multiply, // *
| Divide, // /
| Modulo, // %
| GreaterThan, // >
| LessThan, // <
| GreaterThanOrEqual, // >=
| LessThanOrEqual, // <=
| NotEqual, // !=
| Equal, // ==
| Not, // !
| And, // &&
| Or, // ||
| LeftBracket, // [
| RightBracket, // ]
| LeftCurlyBracket, // {
| RightCurlyBracket, // }
| EndOfFile, // \0
| EndOfLine, // \n
| Comment, // #
| Unknown // Unknown
| };
|
| const static std::unordered_map<Tokens::Type, std::string> tokenTypeNames = {
| { Tokens::Type::ParserOpenTag, "ParserOpenTag" },
| { Tokens::Type::ParserCloseTag, "ParserCloseTag" },
| { Tokens::Type::ParserIfStatement, "ParserIfStatement" },
| { Tokens::Type::FileClose, "FileClose" },
| { Tokens::Type::Identifier, "Identifier" },
| { Tokens::Type::StringLiteral, "StringLiteral" },
| { Tokens::Type::IntLiteral, "IntLiteral" },
| { Tokens::Type::DoubleLiteral, "DoubleLiteral" },
| { Tokens::Type::BooleanLiteral, "BooleanLiteral" },
| { Tokens::Type::LeftParenthesis, "LeftParenthesis" },
| { Tokens::Type::RightParenthesis, "RightParenthesis" },
| { Tokens::Type::Comma, "Comma" },
| { Tokens::Type::Semicolon, "Semicolon" },
| { Tokens::Type::Variable, "Variable" },
| { Tokens::Type::VariableSign, "VariableSign" },
| { Tokens::Type::StringDeclaration, "StringDeclaration" },
| { Tokens::Type::IntDeclaration, "IntDeclaration" },
| { Tokens::Type::DoubleDeclaration, "DoubleDeclaration" },
| { Tokens::Type::BooleanDeclaration, "BooleanDeclaration" },
| { Tokens::Type::FunctionDeclaration, "FunctionDeclaration" },
| { Tokens::Type::FunctionCall, "FunctionCall" },
| { Tokens::Type::Return, "Return" },
| { Tokens::Type::Equals, "Equals" },
| { Tokens::Type::Plus, "Plus" },
| { Tokens::Type::Minus, "Minus" },
| { Tokens::Type::Multiply, "Multiply" },
| { Tokens::Type::Divide, "Divide" },
| { Tokens::Type::Modulo, "Modulo" },
| { Tokens::Type::GreaterThan, "GreaterThan" },
| { Tokens::Type::LessThan, "LessThan" },
| { Tokens::Type::GreaterThanOrEqual, "GreaterThanOrEqual" },
| { Tokens::Type::LessThanOrEqual, "LessThanOrEqual" },
| { Tokens::Type::NotEqual, "NotEqual" },
| { Tokens::Type::Equal, "Equal" },
| { Tokens::Type::Not, "Not" },
| { Tokens::Type::And, "And" },
| { Tokens::Type::Or, "Or" },
| { Tokens::Type::LeftBracket, "LeftBracket" },
| { Tokens::Type::RightBracket, "RightBracket" },
| { Tokens::Type::LeftCurlyBracket, "LeftCurlyBracket" },
| { Tokens::Type::RightCurlyBracket, "RightCurlyBracket" },
| { Tokens::Type::EndOfFile, "EndOfFile" },
| { Tokens::Type::EndOfLine, "EndOfLine" },
| { Tokens::Type::Comment, "Comment" },
| { Tokens::Type::Unknown, "Unknown" }
| };
|
| struct TokenPos {
| size_t start;
| size_t end;
| };
|
| struct Token {
| Tokens::Type type;
| std::string lexeme;
| std::string file;
| int lineNumber;
| size_t columnNumber;
| TokenPos pos;
|
| [[nodiscard]] std::string getTokenName() const { return tokenTypeNames.at(type); }
| };
| } // namespace Tokens
| #endif // TOKEN_HPP
|
|