1 /// Author: Aziz Köksal
2 /// License: GPL3
3 /// $(Maturity very high)
4 module dil.lexer.TokensEnum;
5
6 import common;
7
8 /// Enumeration of token kinds.
9 enum TOK : ushort
10 {
11 Invalid, /// Unitialized token.
12
13 Illegal, /// Unrecognized characters.
14 Comment, /// // /**/ /++/
15 Shebang, /// #!/bin/something
16 HashLine, /// #line
17 Filespec, /// "new/path"
18 Newline, /// \n
19 Empty, /// Special token with empty text.
20 LastWhitespace = Empty, /// End of whitespace tokens.
21
22 Identifier,
23 String,
24 Character,
25
26 SpecialID, /// __FILE__, __LINE__ etc.
27
28 // Number literals
29 Int32, Int64, UInt32, UInt64,
30 // Floating point number scanner relies on this order.
31 // FloatXY + 3 == IFloatXY
32 Float32, Float64, Float80,
33 IFloat32, IFloat64, IFloat80,
34
35 // Brackets
36 LParen,
37 RParen,
38 LBracket,
39 RBracket,
40 LBrace,
41 RBrace,
42
43 // Dots
44 Dot, Dot2, Dot3,
45
46 // Floating point number operators
47 Unordered,
48 UorE,
49 UorG,
50 UorGorE,
51 UorL,
52 UorLorE,
53 LorEorG,
54 LorG,
55
56 // Normal operators
57 Equal, Equal2, EqlGreater,
58 Exclaim, ExclaimEql,
59 Less, LessEql,
60 Greater, GreaterEql,
61 Less2, Less2Eql,
62 Greater2, Greater2Eql,
63 Greater3, Greater3Eql,
64 Pipe, PipeEql, Pipe2,
65 Amp, AmpEql, Amp2,
66 Plus, PlusEql, Plus2,
67 Minus, MinusEql, Minus2,
68 Slash, SlashEql,
69 Star, StarEql,
70 Percent, PercentEql,
71 Caret, CaretEql,
72 Caret2, Caret2Eql,
73 Tilde, TildeEql,
74
75 Colon,
76 Semicolon,
77 Question,
78 Comma,
79 Dollar,
80 At,
81
82 /// Keywords:
83 /// NB.: Token.isKeyword() depends on this list being contiguous.
84 Abstract, Alias, Align, ArgTypes, Asm, Assert, Auto, Body, Break, Case, Cast,
85 Catch, Class, Const, Continue, Debug, Default, Delegate, Delete, Deprecated,
86 Do, Else, Enum, Export, Extern, False, Final, Finally, For, Foreach,
87 ForeachReverse, Function, Goto, Gshared, If, Immutable, Import, In, Inout,
88 Interface, Invariant, Is, Lazy, Macro, Mixin, Module, New, Nothrow, Null,
89 Out, OverloadSet, Override, Package, Parameters, Pragma, Private, Protected,
90 Public, Pure, Ref, Return, Shared, Scope, Static, Struct, Super, Switch,
91 Synchronized, Template, This, Throw, Traits, True, Try, Typedef, Typeid,
92 Typeof, Union, Unittest, Vector, Version, Volatile, While, With,
93 // Integral types.
94 Char, Wchar, Dchar, Bool,
95 Byte, Ubyte, Short, Ushort,
96 Int, Uint, Long, Ulong,
97 Cent, Ucent,
98 Float, Double, Real,
99 Ifloat, Idouble, Ireal,
100 Cfloat, Cdouble, Creal, Void,
101
102 HEAD, // start of linked list
103 EOF,
104 MAX,
105
106 // Some aliases for automatic code generation.
107 Overloadset = OverloadSet,
108 Foreach_reverse = ForeachReverse,
109 }
110
111 alias KeywordsBegin = TOK.Abstract;
112 alias KeywordsEnd = TOK.Void;
113 alias IntegralTypeBegin = TOK.Char;
114 alias IntegralTypeEnd = TOK.Void;
115
116 /// A table that maps each token kind to a string.
117 immutable string[TOK.MAX] tokToString = [
118 "Invalid",
119
120 "Illegal",
121 "Comment",
122 "#!Shebang",
123 "#line",
124 "Filespec",
125 "Newline",
126 "Empty",
127
128 "Identifier",
129 "String",
130 "Character",
131 "SpecialID",
132
133 "Int32", "Int64", "UInt32", "UInt64",
134 "Float32", "Float64", "Float80",
135 "IFloat32", "IFloat64", "IFloat80",
136
137 "(",
138 ")",
139 "[",
140 "]",
141 "{",
142 "}",
143
144 ".", "..", "...",
145
146 "!<>=", // Unordered
147 "!<>", // UorE
148 "!<=", // UorG
149 "!<", // UorGorE
150 "!>=", // UorL
151 "!>", // UorLorE
152 "<>=", // LorEorG
153 "<>", // LorG
154
155 "=", "==", "=>",
156 "!", "!=",
157 "<", "<=",
158 ">", ">=",
159 "<<", "<<=",
160 ">>", ">>=",
161 ">>>", ">>>=",
162 "|", "|=", "||",
163 "&", "&=", "&&",
164 "+", "+=", "++",
165 "-", "-=", "--",
166 "/", "/=",
167 "*", "*=",
168 "%", "%=",
169 "^", "^=",
170 "^^", "^^=",
171 "~", "~=",
172
173 ":",
174 ";",
175 "?",
176 ",",
177 "$",
178 "@",
179
180 "abstract","alias","align","__argTypes","asm","assert","auto","body",
181 "break","case","cast","catch",
182 "class","const","continue",
183 "debug","default","delegate","delete","deprecated","do",
184 "else","enum","export","extern","false","final",
185 "finally","for","foreach","foreach_reverse","function","goto","__gshared",
186 "if","immutable","import","in","inout",
187 "interface","invariant","is","lazy","macro",
188 "mixin","module","new","nothrow","null",
189 "out","__overloadset","override","package","__parameters",
190 "pragma","private","protected","public","pure","ref","return",
191 "shared","scope","static","struct","super","switch","synchronized",
192 "template","this","throw","__traits","true","try","typedef",
193 "typeid","typeof","union","unittest","__vector",
194 "version","volatile","while","with",
195 // Integral types.
196 "char", "wchar", "dchar", "bool",
197 "byte", "ubyte", "short", "ushort",
198 "int", "uint", "long", "ulong",
199 "cent", "ucent",
200 "float", "double", "real",
201 "ifloat", "idouble", "ireal",
202 "cfloat", "cdouble", "creal", "void",
203
204 "HEAD",
205 "EOF"
206 ];
207 static assert(tokToString.length == TOK.EOF+1);
208
209 /// Returns the string representation of a token kind.
210 cstring toString(TOK k)
211 {
212 return tokToString[k];
213 }
214
215 /// A compile time associative array which maps Token strings to TOK values.
216 enum str2TOK = (){
217 TOK[string] aa;
218 TOK t;
219 foreach (s; tokToString)
220 aa[s] = t++;
221 return aa;
222 }();
223
224 /// Converts a Token string to its respective TOK value at compile time.
225 template S2T(string s)
226 {
227 enum TOK S2T = str2TOK[s];
228 }
229
230 /// Converts multiple Token strings and returns a Tuple of TOK values.
231 template S2T(Ss...)
232 {
233 static if (Ss.length == 1)
234 alias S2T = S2T!(Ss[0]);
235 else
236 alias S2T = Tuple!(S2T!(Ss[0]), S2T!(Ss[1..$]));
237 }