1 // D grammar - according to http://dlang.org/grammar
2 
3 module ddc.lexer.Lexer;
4 import ddc.lexer.tokenizer;
5 
6 /** Lexem type constants */
7 enum LexemType : ushort {
8 	UNKNOWN,
9 	// types
10 	TYPE,
11 	TYPE_CTORS,
12 	TYPE_CTOR,
13 	BASIC_TYPE,
14 	BASIC_TYPE_X,
15 	BASIC_TYPE_2,
16 	IDENTIFIER_LIST,
17 	IDENTIFIER,
18 	TYPEOF,
19     // templates
20     TEMPLATE_INSTANCE,
21     EXPRESSION,
22     ALT_DECLARATOR,
23 }
24 
25 class Lexem {
26 	public @property LexemType type() { return LexemType.UNKNOWN; }
27 }
28 
29 /** 
30     Returns true for  one of keywords: bool, byte, ubyte, short, ushort, int, uint, long, ulong, 
31         char, wchar, dchar, float, double, real, ifloat, idouble, ireal, cfloat, cdouble, creal, void 
32 */
33 bool isBasicTypeXToken(Token token) {
34 	if (token.type != TokenType.KEYWORD)
35 		return false;
36 	Keyword id = token.keyword;
37 	return id == Keyword.BOOL
38 		|| id == Keyword.BYTE
39 		|| id == Keyword.UBYTE
40 		|| id == Keyword.SHORT
41 		|| id == Keyword.USHORT
42 		|| id == Keyword.INT
43 		|| id == Keyword.UINT
44 		|| id == Keyword.LONG
45 		|| id == Keyword.ULONG
46 		|| id == Keyword.CHAR
47 		|| id == Keyword.WCHAR
48 		|| id == Keyword.DCHAR
49 		|| id == Keyword.FLOAT
50 		|| id == Keyword.DOUBLE
51 		|| id == Keyword.REAL
52 		|| id == Keyword.IFLOAT
53 		|| id == Keyword.IDOUBLE
54 		|| id == Keyword.IREAL
55 		|| id == Keyword.CFLOAT
56 		|| id == Keyword.CDOUBLE
57 		|| id == Keyword.CREAL
58 		|| id == Keyword.VOID;
59 }
60 
61 /** 
62   Single token, one of keywords: bool, byte, ubyte, short, ushort, int, uint, long, ulong, 
63   char, wchar, dchar, float, double, real, ifloat, idouble, ireal, cfloat, cdouble, creal, void
64 */
65 class BasicTypeX : Lexem {
66 	public Token _token;
67 	public override @property LexemType type() { return LexemType.BASIC_TYPE_X; }
68 	public this(Token token) 
69 	in {
70 		assert(isBasicTypeXToken(token));
71 	}
72 	body {
73 		_token = token;
74 	}
75 }
76 
77 /** 
78     Returns true for  one of keywords: const, immutable, inout, shared 
79 */
80 bool isTypeCtorToken(Token token) {
81 	if (token.type != TokenType.KEYWORD)
82 		return false;
83 	Keyword id = token.keyword;
84 	return id == Keyword.CONST
85 		|| id == Keyword.IMMUTABLE
86 		|| id == Keyword.INOUT
87 		|| id == Keyword.SHARED;
88 }
89 
90 /** 
91     Single token, one of keywords: const, immutable, inout, shared 
92 */
93 class TypeCtor : Lexem {
94 	public Token _token;
95 	public override @property LexemType type() { return LexemType.TYPE_CTOR; }
96 	public this(Token token)
97 	in {
98 		assert(isTypeCtorToken(token));
99 	}
100 	body {
101 		_token = token;
102 	}
103 }
104 
105 /** 
106     Zero, one or several keywords: const, immutable, inout, shared 
107 */
108 class TypeCtors : Lexem {
109 	public TypeCtor[] _list;
110 	public override @property LexemType type() { return LexemType.TYPE_CTORS; }
111 	public this(Token token)
112 	in {
113 		assert(isTypeCtorToken(token));
114 	}
115 	body {
116 		_list ~= new TypeCtor(token);
117 	}
118 	public void append(Token token)
119 	in {
120 		assert(isTypeCtorToken(token));
121 	}
122 	body {
123 		_list ~= new TypeCtor(token);
124 	}
125 }
126 
127 /**
128     Identifier.
129 */
130 class Identifier : Lexem {
131     IdentToken _token;
132 	public override @property LexemType type() { return LexemType.IDENTIFIER; }
133 	public this(Token identifier)
134 	in {
135         assert(identifier.type == TokenType.IDENTIFIER);
136 	}
137 	body {
138         _token = cast(IdentToken)identifier;
139 	}
140 }
141 
142 /**
143     Identifier list.
144 
145     IdentifierList:
146         Identifier
147         Identifier . IdentifierList
148         TemplateInstance
149         TemplateInstance . IdentifierList
150  */
151 class IdentifierList : Lexem {
152     public Identifier _identifier;
153     public IdentifierList _identifierList;
154     public TemplateInstance _templateInstance;
155 	public override @property LexemType type() { return LexemType.IDENTIFIER_LIST; }
156 	public this(Token ident, IdentifierList identifierList = null)
157 	in {
158         assert(ident.type == TokenType.IDENTIFIER);
159 	}
160 	body {
161         _identifier = new Identifier(ident);
162         _identifierList = identifierList;
163 	}
164 	public this(TemplateInstance templateInstance, IdentifierList identifierList = null)
165 	in {
166 	}
167 	body {
168         _templateInstance = templateInstance;
169         _identifierList = identifierList;
170 	}
171 }
172 
173 /**
174     Template instance.
175 
176     TemplateInstance:
177         Identifier TemplateArguments
178 */
179 class TemplateInstance : Lexem {
180 	public override @property LexemType type() { return LexemType.TEMPLATE_INSTANCE; }
181 	public this()
182 	in {
183 	}
184 	body {
185 	}
186 }
187 
188 /**
189     Basic type.
190 
191     BasicType:
192         BasicTypeX
193         . IdentifierList
194         IdentifierList
195         Typeof
196         Typeof . IdentifierList
197         TypeCtor ( Type )
198 */
199 class BasicType : Lexem {
200     public BasicTypeX _basicTypeX;
201     public IdentifierList _identifierList;
202     public Typeof _typeof;
203     public TypeCtor _typeCtor;
204     public Type _typeCtorType;
205     public bool _dotBeforeIdentifierList;
206 	public override @property LexemType type() { return LexemType.BASIC_TYPE; }
207 	public this()
208 	in {
209 	}
210 	body {
211 	}
212 }
213 
214 
215 
216 /**
217     Typeof.
218 
219     Typeof:
220         typeof ( Expression )
221         typeof ( return )
222     
223     For typeof(return), _expression is null
224 */
225 class Typeof : Lexem {
226     public Expression _expression;
227 	public override @property LexemType type() { return LexemType.TYPEOF; }
228 	public this(Expression expression)
229 	in {
230 	}
231 	body {
232         _expression = expression;
233 	}
234 }
235 
236 /**
237     Type.
238 
239 */
240 class Type : Lexem {
241     public TypeCtors _typeCtors;
242     public BasicType _basicType;
243     public AltDeclarator _altDeclarator;
244 	public override @property LexemType type() { return LexemType.TYPE; }
245 	public this()
246 	in {
247 	}
248 	body {
249 	}
250 }
251 
252 /**
253     Expression.
254 
255     Expression:
256 */
257 class Expression : Lexem {
258 	public override @property LexemType type() { return LexemType.EXPRESSION; }
259 	public this()
260 	in {
261 	}
262 	body {
263 	}
264 }
265 
266 /**
267     AltDeclarator.
268 
269     AltDeclarator:
270 */
271 class AltDeclarator : Lexem {
272 	public override @property LexemType type() { return LexemType.ALT_DECLARATOR; }
273 	public this()
274 	in {
275 	}
276 	body {
277 	}
278 }
279 
280 class Lexer
281 {
282 }