1 /// Copyright: Copyright (c) 2021 Andrey Penechko.
2 /// License: $(WEB boost.org/LICENSE_1_0.txt, Boost License 1.0).
3 /// Authors: Andrey Penechko.
4 module vox.fe.ast.token;
5 
6 import vox.utils : gatherEnumStrings;
7 
8 struct Token {
9 	TokenType type;
10 	TokenIndex index;
11 }
12 
13 struct TokenIndex
14 {
15 	uint index = uint.max;
16 	alias index this;
17 	bool isValid() { return index != uint.max; }
18 }
19 
20 immutable string[] tokStrings = gatherEnumStrings!TokenType();
21 
22 enum TokenType TYPE_TOKEN_FIRST = TokenType.TYPE_NORETURN;
23 enum TokenType TYPE_TOKEN_LAST = TokenType.TYPE_TYPE;
24 
25 alias TT = TokenType;
26 enum TokenType : ubyte {
27 	@("#soi") SOI,
28 	@("#eoi") EOI,
29 	@(null)   INVALID,
30 
31 	@("&")    AND,
32 	@("&&")   AND_AND,
33 	@("&=")   AND_EQUAL,
34 	@("@")    AT,
35 	@("\\")   BACKSLASH,
36 	@(":")    COLON,
37 	@(",")    COMMA,
38 	@(".")    DOT,
39 	@("..")   DOT_DOT,
40 	@("...")  DOT_DOT_DOT,
41 	@("=")    EQUAL,
42 	@("==")   EQUAL_EQUAL,
43 	@(">")    MORE,
44 	@(">=")   MORE_EQUAL,
45 	@(">>")   MORE_MORE,
46 	@(">>=")  MORE_MORE_EQUAL,
47 	@(">>>")  MORE_MORE_MORE,
48 	@(">>>=") MORE_MORE_MORE_EQUAL,
49 	@("<")    LESS,
50 	@("<=")   LESS_EQUAL,
51 	@("<<")   LESS_LESS,
52 	@("<<=")  LESS_LESS_EQUAL,
53 	@("-")    MINUS,
54 	@("-=")   MINUS_EQUAL,
55 	@("--")   MINUS_MINUS,
56 	@("!")    NOT,
57 	@("!=")   NOT_EQUAL,
58 	@("|")    OR,
59 	@("|=")   OR_EQUAL,
60 	@("||")   OR_OR,
61 	@("%")    PERCENT,
62 	@("%=")   PERCENT_EQUAL,
63 	@("+")    PLUS,
64 	@("+=")   PLUS_EQUAL,
65 	@("++")   PLUS_PLUS,
66 	@("?")    QUESTION,
67 	@(";")    SEMICOLON,
68 	@("/")    SLASH,
69 	@("/=")   SLASH_EQUAL,
70 	@("*")    STAR,
71 	@("*=")   STAR_EQUAL,
72 	@("~")    TILDE,
73 	@("~=")   TILDE_EQUAL,
74 	@("^")    XOR,
75 	@("^=")   XOR_EQUAL,
76 
77 	@("(")    LPAREN,
78 	@(")")    RPAREN,
79 	@("[")    LBRACKET,
80 	@("]")    RBRACKET,
81 	@("{")    LCURLY,
82 	@("}")    RCURLY,
83 
84 
85 	@("#if")      HASH_IF,              // #if
86 	@("#version") HASH_VERSION,         // #version
87 	@("#inline")  HASH_INLINE,          // #inline
88 	@("#assert")  HASH_ASSERT,          // #assert
89 	@("#foreach") HASH_FOREACH,         // #foreach
90 
91 	@("alias")    ALIAS_SYM,            // alias
92 	@("break")    BREAK_SYM,            // break
93 	@("continue") CONTINUE_SYM,         // continue
94 	@("do")       DO_SYM,               // do
95 	@("else")     ELSE_SYM,             // else
96 	@("function") FUNCTION_SYM,         // function
97 	@("if")       IF_SYM,               // if
98 	@("import")   IMPORT_SYM,           // import
99 	@("module")   MODULE_SYM,           // module
100 	@("return")   RETURN_SYM,           // return
101 	@("struct")   STRUCT_SYM,           // struct
102 	@("union")    UNION_SYM,            // union
103 	@("while")    WHILE_SYM,            // while
104 	@("for")      FOR_SYM,              // for
105 	@("switch")   SWITCH_SYM,           // switch
106 	@("cast")     CAST,                 // cast
107 	@("enum")     ENUM,                 // enum
108 
109 	@("#special_kw") SPECIAL_KW,        // __FILE__, __LINE__, __FUNCTION_NAME__, __MODULE_NAME__
110 
111 	@("#id")      IDENTIFIER,           // [a-zA-Z_] [a-zA-Z_0-9]*
112 	@("$id")      CASH_IDENTIFIER,      // $ [a-zA-Z_0-9]*
113 
114 	// ----------------------------------------
115 	// list of basic types. The order is the same as in `enum BasicType`
116 
117 	@("auto") TYPE_AUTO,                // auto
118 	@("noreturn") TYPE_NORETURN,        // noreturn
119 	@("void") TYPE_VOID,                // void
120 	@("bool") TYPE_BOOL,                // bool
121 	@("null") NULL,                     // null
122 	@("i8")   TYPE_I8,                  // i8
123 	@("i16")  TYPE_I16,                 // i16
124 	@("i32")  TYPE_I32,                 // i32
125 	@("i64")  TYPE_I64,                 // i64
126 
127 	@("u8")   TYPE_U8,                  // u8
128 	@("u16")  TYPE_U16,                 // u16
129 	@("u32")  TYPE_U32,                 // u32
130 	@("u64")  TYPE_U64,                 // u64
131 
132 	@("f32")  TYPE_F32,                 // f32
133 	@("f64")  TYPE_F64,                 // f64
134 
135 	@("$alias") TYPE_ALIAS,             // $alias
136 	@("$type")  TYPE_TYPE,              // $type
137 	// ----------------------------------------
138 
139 	@("isize") TYPE_ISIZE,              // isize
140 	@("usize") TYPE_USIZE,              // usize
141 
142 	@("true")  TRUE_LITERAL,            // true
143 	@("false") FALSE_LITERAL,           // false
144 	@("#int_dec_lit") INT_DEC_LITERAL,  // 0|([1-9][0-9_]*)
145 	@("#int_hex_lit") INT_HEX_LITERAL,  // ("0x"|"0X")[0-9A-Fa-f_]+
146 	@("#int_bin_lit") INT_BIN_LITERAL,  // ("0b"|"0B")[01_]+
147 	@("#float_dec_lit") FLOAT_DEC_LITERAL,
148 	@("#str_lit") STRING_LITERAL,
149 	@("#char_lit") CHAR_LITERAL,
150 
151 	@("#comm") COMMENT,                 // // /*
152 }