Mercurial > projects > dil
annotate trunk/src/dil/semantic/Pass2.d @ 755:90668b83ae5e
Introduced new module dil.SourceText and class SourceText.
author | Aziz K?ksal <aziz.koeksal@gmail.com> |
---|---|
date | Wed, 13 Feb 2008 20:21:25 +0100 |
parents | 4f971f6382c7 |
children | c24be8d4f6ab |
rev | line source |
---|---|
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
1 /++ |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
2 Author: Aziz Köksal |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
3 License: GPL3 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
4 +/ |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
5 module dil.semantic.Pass2; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
6 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
7 import dil.ast.DefaultVisitor; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
8 import dil.ast.Node, |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
9 dil.ast.Declarations, |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
10 dil.ast.Expressions, |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
11 dil.ast.Statements, |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
12 dil.ast.Types, |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
13 dil.ast.Parameters; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
14 import dil.lexer.Identifier; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
15 import dil.semantic.Symbol, |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
16 dil.semantic.Symbols, |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
17 dil.semantic.Types, |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
18 dil.semantic.Scope, |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
19 dil.semantic.Module, |
696
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
20 dil.semantic.Analysis, |
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
21 dil.semantic.Interpreter; |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
22 import dil.parser.Parser; |
755
90668b83ae5e
Introduced new module dil.SourceText and class SourceText.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
711
diff
changeset
|
23 import dil.SourceText; |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
24 import dil.Location; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
25 import dil.Information; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
26 import dil.Messages; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
27 import dil.Enums; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
28 import dil.CompilerInfo; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
29 import common; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
30 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
31 class SemanticPass2 : DefaultVisitor |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
32 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
33 Scope scop; /// The current scope. |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
34 Module modul; /// The module to be semantically checked. |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
35 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
36 this(Module modul) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
37 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
38 this.modul = modul; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
39 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
40 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
41 /// Start semantic analysis. |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
42 void start() |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
43 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
44 assert(modul.root !is null); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
45 // Create module scope. |
692
d33895f679eb
Tidied up the class Scope a bit.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
684
diff
changeset
|
46 scop = new Scope(null, modul); |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
47 visit(modul.root); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
48 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
49 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
50 void enterScope(ScopeSymbol s) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
51 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
52 scop = scop.enter(s); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
53 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
54 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
55 void exitScope() |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
56 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
57 scop = scop.exit(); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
58 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
59 |
708
3a4c7d444467
Added method interpret() to class SemanticPass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
707
diff
changeset
|
60 Expression interpret(Expression e) |
3a4c7d444467
Added method interpret() to class SemanticPass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
707
diff
changeset
|
61 { |
3a4c7d444467
Added method interpret() to class SemanticPass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
707
diff
changeset
|
62 return Interpreter.interpret(e, modul.infoMan, scop); |
3a4c7d444467
Added method interpret() to class SemanticPass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
707
diff
changeset
|
63 } |
3a4c7d444467
Added method interpret() to class SemanticPass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
707
diff
changeset
|
64 |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
65 void error(Token* token, char[] formatMsg, ...) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
66 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
67 auto location = token.getErrorLocation(); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
68 auto msg = Format(_arguments, _argptr, formatMsg); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
69 modul.infoMan ~= new SemanticError(location, msg); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
70 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
71 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
72 private alias Declaration D; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
73 private alias Expression E; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
74 private alias Statement S; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
75 private alias TypeNode T; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
76 |
707
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
77 /// The scope symbol to use in identifier or template instance expressions. |
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
78 /// E.g.: object.method(); // After 'object' has been visited, dotIdScope is |
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
79 /// // set, and 'method' will be looked up there. |
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
80 ScopeSymbol dotIdScope; |
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
81 |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
82 override |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
83 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
84 D visit(CompoundDeclaration d) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
85 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
86 return super.visit(d); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
87 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
88 |
707
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
89 D visit(EnumDeclaration d) |
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
90 { |
711
4f971f6382c7
Added enum Status to class Symbol.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
708
diff
changeset
|
91 d.symbol.setCompleting(); |
4f971f6382c7
Added enum Status to class Symbol.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
708
diff
changeset
|
92 |
707
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
93 Type type = Types.Int; // Default to int. |
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
94 if (d.baseType) |
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
95 type = visitT(d.baseType).type; |
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
96 d.symbol.type = new TypeEnum(d.symbol, type); |
711
4f971f6382c7
Added enum Status to class Symbol.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
708
diff
changeset
|
97 |
707
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
98 enterScope(d.symbol); |
711
4f971f6382c7
Added enum Status to class Symbol.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
708
diff
changeset
|
99 |
707
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
100 foreach (member; d.members) |
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
101 { |
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
102 Expression finalValue; |
711
4f971f6382c7
Added enum Status to class Symbol.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
708
diff
changeset
|
103 member.symbol.setCompleting(); |
707
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
104 if (member.value) |
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
105 { |
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
106 member.value = visitE(member.value); |
708
3a4c7d444467
Added method interpret() to class SemanticPass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
707
diff
changeset
|
107 finalValue = interpret(member.value); |
707
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
108 if (finalValue is Interpreter.NAR) |
711
4f971f6382c7
Added enum Status to class Symbol.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
708
diff
changeset
|
109 finalValue = new IntExpression(0, d.symbol.type); |
707
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
110 } |
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
111 //else |
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
112 // TODO: increment a number variable and assign that to value. |
711
4f971f6382c7
Added enum Status to class Symbol.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
708
diff
changeset
|
113 member.symbol.type = d.symbol.type; // Assign TypeEnum. |
707
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
114 member.symbol.value = finalValue; |
711
4f971f6382c7
Added enum Status to class Symbol.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
708
diff
changeset
|
115 member.symbol.setComplete(); |
707
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
116 } |
711
4f971f6382c7
Added enum Status to class Symbol.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
708
diff
changeset
|
117 |
707
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
118 exitScope(); |
711
4f971f6382c7
Added enum Status to class Symbol.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
708
diff
changeset
|
119 d.symbol.setComplete(); |
707
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
120 return d; |
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
121 } |
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
122 |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
123 D visit(MixinDeclaration md) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
124 { |
704
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
125 if (md.decls) |
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
126 return md.decls; |
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
127 if (md.isMixinExpression) |
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
128 { |
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
129 md.argument = visitE(md.argument); |
708
3a4c7d444467
Added method interpret() to class SemanticPass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
707
diff
changeset
|
130 auto expr = interpret(md.argument); |
704
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
131 if (expr is Interpreter.NAR) |
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
132 return md; |
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
133 auto stringExpr = expr.Is!(StringExpression); |
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
134 if (stringExpr is null) |
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
135 { |
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
136 error(md.begin, MSG.MixinArgumentMustBeString); |
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
137 return md; |
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
138 } |
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
139 else |
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
140 { // Parse the declarations in the string. |
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
141 auto loc = md.begin.getErrorLocation(); |
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
142 auto filePath = loc.filePath; |
755
90668b83ae5e
Introduced new module dil.SourceText and class SourceText.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
711
diff
changeset
|
143 auto sourceText = new SourceText(filePath, stringExpr.getString()); |
90668b83ae5e
Introduced new module dil.SourceText and class SourceText.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
711
diff
changeset
|
144 auto parser = new Parser(sourceText, modul.infoMan); |
704
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
145 md.decls = parser.start(); |
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
146 } |
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
147 } |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
148 else |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
149 { |
704
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
150 // TODO: implement template mixin. |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
151 } |
704
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
152 return md.decls; |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
153 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
154 |
694
19a34b69cc7d
Renamed some members of BinaryExpression and QualifiedType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
692
diff
changeset
|
155 T visit(TypeofType t) |
19a34b69cc7d
Renamed some members of BinaryExpression and QualifiedType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
692
diff
changeset
|
156 { |
19a34b69cc7d
Renamed some members of BinaryExpression and QualifiedType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
692
diff
changeset
|
157 t.e = visitE(t.e); |
19a34b69cc7d
Renamed some members of BinaryExpression and QualifiedType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
692
diff
changeset
|
158 t.type = t.e.type; |
19a34b69cc7d
Renamed some members of BinaryExpression and QualifiedType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
692
diff
changeset
|
159 return t; |
19a34b69cc7d
Renamed some members of BinaryExpression and QualifiedType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
692
diff
changeset
|
160 } |
19a34b69cc7d
Renamed some members of BinaryExpression and QualifiedType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
692
diff
changeset
|
161 |
692
d33895f679eb
Tidied up the class Scope a bit.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
684
diff
changeset
|
162 T visit(ArrayType t) |
d33895f679eb
Tidied up the class Scope a bit.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
684
diff
changeset
|
163 { |
d33895f679eb
Tidied up the class Scope a bit.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
684
diff
changeset
|
164 return t; |
d33895f679eb
Tidied up the class Scope a bit.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
684
diff
changeset
|
165 } |
d33895f679eb
Tidied up the class Scope a bit.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
684
diff
changeset
|
166 |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
167 T visit(PointerType t) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
168 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
169 t.type = visitT(t.next).type.ptrTo(); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
170 return t; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
171 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
172 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
173 T visit(IntegralType t) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
174 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
175 // A table mapping the kind of a token to its corresponding semantic Type. |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
176 TypeBasic[TOK] tok2Type = [ |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
177 TOK.Char : Types.Char, TOK.Wchar : Types.Wchar, TOK.Dchar : Types.Dchar, TOK.Bool : Types.Bool, |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
178 TOK.Byte : Types.Byte, TOK.Ubyte : Types.Ubyte, TOK.Short : Types.Short, TOK.Ushort : Types.Ushort, |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
179 TOK.Int : Types.Int, TOK.Uint : Types.Uint, TOK.Long : Types.Long, TOK.Ulong : Types.Ulong, |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
180 TOK.Cent : Types.Cent, TOK.Ucent : Types.Ucent, |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
181 TOK.Float : Types.Float, TOK.Double : Types.Double, TOK.Real : Types.Real, |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
182 TOK.Ifloat : Types.Ifloat, TOK.Idouble : Types.Idouble, TOK.Ireal : Types.Ireal, |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
183 TOK.Cfloat : Types.Cfloat, TOK.Cdouble : Types.Cdouble, TOK.Creal : Types.Creal, TOK.Void : Types.Void |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
184 ]; |
694
19a34b69cc7d
Renamed some members of BinaryExpression and QualifiedType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
692
diff
changeset
|
185 assert(t.tok in tok2Type); |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
186 t.type = tok2Type[t.tok]; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
187 return t; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
188 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
189 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
190 E visit(ParenExpression e) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
191 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
192 if (!e.type) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
193 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
194 e.next = visitE(e.next); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
195 e.type = e.next.type; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
196 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
197 return e; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
198 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
199 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
200 E visit(CommaExpression e) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
201 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
202 if (!e.type) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
203 { |
694
19a34b69cc7d
Renamed some members of BinaryExpression and QualifiedType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
692
diff
changeset
|
204 e.lhs = visitE(e.lhs); |
19a34b69cc7d
Renamed some members of BinaryExpression and QualifiedType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
692
diff
changeset
|
205 e.rhs = visitE(e.rhs); |
19a34b69cc7d
Renamed some members of BinaryExpression and QualifiedType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
692
diff
changeset
|
206 e.type = e.rhs.type; |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
207 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
208 return e; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
209 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
210 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
211 E visit(OrOrExpression) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
212 { return null; } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
213 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
214 E visit(AndAndExpression) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
215 { return null; } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
216 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
217 E visit(SpecialTokenExpression e) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
218 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
219 if (e.type) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
220 return e.value; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
221 switch (e.specialToken.kind) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
222 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
223 case TOK.LINE, TOK.VERSION: |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
224 e.value = new IntExpression(e.specialToken.uint_, Types.Uint); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
225 break; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
226 case TOK.FILE, TOK.DATE, TOK.TIME, TOK.TIMESTAMP, TOK.VENDOR: |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
227 e.value = new StringExpression(e.specialToken.str); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
228 break; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
229 default: |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
230 assert(0); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
231 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
232 e.type = e.value.type; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
233 return e.value; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
234 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
235 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
236 E visit(DollarExpression e) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
237 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
238 if (e.type) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
239 return e; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
240 e.type = Types.Size_t; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
241 // if (!inArraySubscript) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
242 // error("$ can only be in an array subscript."); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
243 return e; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
244 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
245 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
246 E visit(NullExpression e) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
247 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
248 if (!e.type) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
249 e.type = Types.Void_ptr; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
250 return e; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
251 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
252 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
253 E visit(BoolExpression e) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
254 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
255 if (e.type) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
256 return e; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
257 e.value = new IntExpression(e.toBool(), Types.Bool); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
258 e.type = Types.Bool; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
259 return e; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
260 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
261 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
262 E visit(IntExpression e) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
263 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
264 if (e.type) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
265 return e; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
266 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
267 if (e.number & 0x8000_0000_0000_0000) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
268 e.type = Types.Ulong; // 0xFFFF_FFFF_FFFF_FFFF |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
269 else if (e.number & 0xFFFF_FFFF_0000_0000) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
270 e.type = Types.Long; // 0x7FFF_FFFF_FFFF_FFFF |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
271 else if (e.number & 0x8000_0000) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
272 e.type = Types.Uint; // 0xFFFF_FFFF |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
273 else |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
274 e.type = Types.Int; // 0x7FFF_FFFF |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
275 return e; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
276 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
277 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
278 E visit(RealExpression e) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
279 { |
704
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
280 if (!e.type) |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
281 e.type = Types.Double; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
282 return e; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
283 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
284 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
285 E visit(ComplexExpression e) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
286 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
287 if (!e.type) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
288 e.type = Types.Cdouble; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
289 return e; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
290 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
291 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
292 E visit(CharExpression e) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
293 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
294 if (e.type) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
295 return e; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
296 if (e.character <= 0xFF) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
297 e.type = Types.Char; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
298 else if (e.character <= 0xFFFF) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
299 e.type = Types.Wchar; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
300 else |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
301 e.type = Types.Dchar; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
302 return e; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
303 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
304 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
305 E visit(StringExpression e) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
306 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
307 return e; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
308 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
309 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
310 E visit(MixinExpression me) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
311 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
312 if (me.type) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
313 return me.expr; |
696
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
314 me.expr = visitE(me.expr); |
708
3a4c7d444467
Added method interpret() to class SemanticPass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
707
diff
changeset
|
315 auto expr = interpret(me.expr); |
696
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
316 if (expr is Interpreter.NAR) |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
317 return me; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
318 auto stringExpr = expr.Is!(StringExpression); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
319 if (stringExpr is null) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
320 error(me.begin, MSG.MixinArgumentMustBeString); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
321 else |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
322 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
323 auto loc = me.begin.getErrorLocation(); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
324 auto filePath = loc.filePath; |
755
90668b83ae5e
Introduced new module dil.SourceText and class SourceText.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
711
diff
changeset
|
325 auto sourceText = new SourceText(filePath, stringExpr.getString()); |
90668b83ae5e
Introduced new module dil.SourceText and class SourceText.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
711
diff
changeset
|
326 auto parser = new Parser(sourceText, modul.infoMan); |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
327 expr = parser.start2(); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
328 expr = visitE(expr); // Check expression. |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
329 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
330 me.expr = expr; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
331 me.type = expr.type; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
332 return me.expr; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
333 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
334 |
696
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
335 E visit(ImportExpression ie) |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
336 { |
696
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
337 if (ie.type) |
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
338 return ie.expr; |
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
339 ie.expr = visitE(ie.expr); |
708
3a4c7d444467
Added method interpret() to class SemanticPass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
707
diff
changeset
|
340 auto expr = interpret(ie.expr); |
696
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
341 if (expr is Interpreter.NAR) |
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
342 return ie; |
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
343 auto stringExpr = expr.Is!(StringExpression); |
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
344 //if (stringExpr is null) |
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
345 // error(me.begin, MSG.ImportArgumentMustBeString); |
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
346 // TODO: load file |
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
347 //ie.expr = new StringExpression(loadImportFile(stringExpr.getString())); |
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
348 return ie.expr; |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
349 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
350 } |
696
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
351 } |