Mercurial > projects > dil
annotate src/dil/semantic/Pass2.d @ 822:fd52beaaa94a
Merging changes from Aziz.
author | Jarrett Billingsley <jarrett.billingsley@gmail.com> |
---|---|
date | Fri, 14 Mar 2008 11:03:11 -0400 |
parents | 09a64d96967a 1d06b4aed7cf |
children | 1ecf05e680ba |
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 |
798
c24be8d4f6ab
Added documentation comments.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
755
diff
changeset
|
31 /// The second pass determines the types of symbols and the types |
c24be8d4f6ab
Added documentation comments.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
755
diff
changeset
|
32 /// of expressions and also evaluates them. |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
33 class SemanticPass2 : DefaultVisitor |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
34 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
35 Scope scop; /// The current scope. |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
36 Module modul; /// The module to be semantically checked. |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
37 |
798
c24be8d4f6ab
Added documentation comments.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
755
diff
changeset
|
38 /// Constructs a SemanticPass2 object. |
c24be8d4f6ab
Added documentation comments.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
755
diff
changeset
|
39 /// Params: |
c24be8d4f6ab
Added documentation comments.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
755
diff
changeset
|
40 /// modul = the module to be checked. |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
41 this(Module modul) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
42 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
43 this.modul = modul; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
44 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
45 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
46 /// Start semantic analysis. |
810
525ee3f848d9
Added modules cmd.Compile and dil.ModuleManager.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
47 void run() |
684
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 assert(modul.root !is null); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
50 // Create module scope. |
692
d33895f679eb
Tidied up the class Scope a bit.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
684
diff
changeset
|
51 scop = new Scope(null, modul); |
810
525ee3f848d9
Added modules cmd.Compile and dil.ModuleManager.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
806
diff
changeset
|
52 modul.semanticPass = 2; |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
53 visit(modul.root); |
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 |
798
c24be8d4f6ab
Added documentation comments.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
755
diff
changeset
|
56 /// Enters a new scope. |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
57 void enterScope(ScopeSymbol s) |
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 scop = scop.enter(s); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
60 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
61 |
798
c24be8d4f6ab
Added documentation comments.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
755
diff
changeset
|
62 /// Exits the current scope. |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
63 void exitScope() |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
64 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
65 scop = scop.exit(); |
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 |
798
c24be8d4f6ab
Added documentation comments.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
755
diff
changeset
|
68 /// Evaluates e and returns the result. |
708
3a4c7d444467
Added method interpret() to class SemanticPass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
707
diff
changeset
|
69 Expression interpret(Expression e) |
3a4c7d444467
Added method interpret() to class SemanticPass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
707
diff
changeset
|
70 { |
798
c24be8d4f6ab
Added documentation comments.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
755
diff
changeset
|
71 return Interpreter.interpret(e, modul.infoMan/+, scop+/); |
708
3a4c7d444467
Added method interpret() to class SemanticPass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
707
diff
changeset
|
72 } |
3a4c7d444467
Added method interpret() to class SemanticPass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
707
diff
changeset
|
73 |
798
c24be8d4f6ab
Added documentation comments.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
755
diff
changeset
|
74 /// Creates an error report. |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
75 void error(Token* token, char[] formatMsg, ...) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
76 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
77 auto location = token.getErrorLocation(); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
78 auto msg = Format(_arguments, _argptr, formatMsg); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
79 modul.infoMan ~= new SemanticError(location, msg); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
80 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
81 |
798
c24be8d4f6ab
Added documentation comments.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
755
diff
changeset
|
82 /// Some handy aliases. |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
83 private alias Declaration D; |
798
c24be8d4f6ab
Added documentation comments.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
755
diff
changeset
|
84 private alias Expression E; /// ditto |
c24be8d4f6ab
Added documentation comments.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
755
diff
changeset
|
85 private alias Statement S; /// ditto |
c24be8d4f6ab
Added documentation comments.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
755
diff
changeset
|
86 private alias TypeNode T; /// ditto |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
87 |
804
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
88 /// The current scope symbol to use for looking up identifiers. |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
89 /// E.g.: |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
90 /// --- |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
91 /// object.method(); // *) object is looked up in the current scope. |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
92 /// // *) idScope is set if object is a ScopeSymbol. |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
93 /// // *) method will be looked up in idScope. |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
94 /// dil.ast.Node.Node node; // A fully qualified type. |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
95 /// --- |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
96 ScopeSymbol idScope; |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
97 |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
98 /// Searches for a symbol. |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
99 Symbol search(Token* idTok) |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
100 { |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
101 assert(idTok.kind == TOK.Identifier); |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
102 auto id = idTok.ident; |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
103 Symbol symbol; |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
104 |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
105 if (idScope is null) |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
106 for (auto sc = scop; sc; sc = sc.parent) |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
107 { |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
108 symbol = sc.lookup(id); |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
109 if (symbol) |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
110 return symbol; |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
111 } |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
112 else |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
113 symbol = idScope.lookup(id); |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
114 |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
115 if (symbol is null) |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
116 error(idTok, MSG.UndefinedIdentifier, id.str); |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
117 else if (auto scopSymbol = cast(ScopeSymbol)symbol) |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
118 idScope = scopSymbol; |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
119 |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
120 return symbol; |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
121 } |
707
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 override |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
124 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
125 D visit(CompoundDeclaration d) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
126 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
127 return super.visit(d); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
128 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
129 |
707
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
130 D visit(EnumDeclaration d) |
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
131 { |
711
4f971f6382c7
Added enum Status to class Symbol.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
708
diff
changeset
|
132 d.symbol.setCompleting(); |
4f971f6382c7
Added enum Status to class Symbol.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
708
diff
changeset
|
133 |
707
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
134 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
|
135 if (d.baseType) |
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
136 type = visitT(d.baseType).type; |
820
1d06b4aed7cf
Revised code in the first pass.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
810
diff
changeset
|
137 // Set the enum's base type. |
1d06b4aed7cf
Revised code in the first pass.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
810
diff
changeset
|
138 d.symbol.type.baseType = type; |
1d06b4aed7cf
Revised code in the first pass.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
810
diff
changeset
|
139 |
1d06b4aed7cf
Revised code in the first pass.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
810
diff
changeset
|
140 // TODO: check base type. must be basic type or another enum. |
711
4f971f6382c7
Added enum Status to class Symbol.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
708
diff
changeset
|
141 |
707
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
142 enterScope(d.symbol); |
711
4f971f6382c7
Added enum Status to class Symbol.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
708
diff
changeset
|
143 |
707
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
144 foreach (member; d.members) |
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
145 { |
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
146 Expression finalValue; |
711
4f971f6382c7
Added enum Status to class Symbol.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
708
diff
changeset
|
147 member.symbol.setCompleting(); |
707
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
148 if (member.value) |
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
149 { |
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
150 member.value = visitE(member.value); |
708
3a4c7d444467
Added method interpret() to class SemanticPass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
707
diff
changeset
|
151 finalValue = interpret(member.value); |
707
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
152 if (finalValue is Interpreter.NAR) |
711
4f971f6382c7
Added enum Status to class Symbol.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
708
diff
changeset
|
153 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
|
154 } |
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
155 //else |
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
156 // TODO: increment a number variable and assign that to value. |
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
157 member.symbol.value = finalValue; |
711
4f971f6382c7
Added enum Status to class Symbol.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
708
diff
changeset
|
158 member.symbol.setComplete(); |
707
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
159 } |
711
4f971f6382c7
Added enum Status to class Symbol.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
708
diff
changeset
|
160 |
707
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
161 exitScope(); |
711
4f971f6382c7
Added enum Status to class Symbol.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
708
diff
changeset
|
162 d.symbol.setComplete(); |
707
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
163 return d; |
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
164 } |
efa5fcb9aa14
Added semantic code related to enums.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
704
diff
changeset
|
165 |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
166 D visit(MixinDeclaration md) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
167 { |
704
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
168 if (md.decls) |
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
169 return md.decls; |
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
170 if (md.isMixinExpression) |
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
171 { |
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
172 md.argument = visitE(md.argument); |
708
3a4c7d444467
Added method interpret() to class SemanticPass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
707
diff
changeset
|
173 auto expr = interpret(md.argument); |
704
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
174 if (expr is Interpreter.NAR) |
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
175 return md; |
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
176 auto stringExpr = expr.Is!(StringExpression); |
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
177 if (stringExpr is null) |
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
178 { |
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
179 error(md.begin, MSG.MixinArgumentMustBeString); |
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
180 return md; |
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
181 } |
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
182 else |
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
183 { // Parse the declarations in the string. |
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
184 auto loc = md.begin.getErrorLocation(); |
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
185 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
|
186 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
|
187 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
|
188 md.decls = parser.start(); |
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
189 } |
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
190 } |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
191 else |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
192 { |
704
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
193 // TODO: implement template mixin. |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
194 } |
704
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
195 return md.decls; |
684
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 |
804
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
198 // Type nodes: |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
199 |
694
19a34b69cc7d
Renamed some members of BinaryExpression and QualifiedType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
692
diff
changeset
|
200 T visit(TypeofType t) |
19a34b69cc7d
Renamed some members of BinaryExpression and QualifiedType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
692
diff
changeset
|
201 { |
19a34b69cc7d
Renamed some members of BinaryExpression and QualifiedType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
692
diff
changeset
|
202 t.e = visitE(t.e); |
19a34b69cc7d
Renamed some members of BinaryExpression and QualifiedType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
692
diff
changeset
|
203 t.type = t.e.type; |
19a34b69cc7d
Renamed some members of BinaryExpression and QualifiedType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
692
diff
changeset
|
204 return t; |
19a34b69cc7d
Renamed some members of BinaryExpression and QualifiedType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
692
diff
changeset
|
205 } |
19a34b69cc7d
Renamed some members of BinaryExpression and QualifiedType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
692
diff
changeset
|
206 |
692
d33895f679eb
Tidied up the class Scope a bit.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
684
diff
changeset
|
207 T visit(ArrayType t) |
d33895f679eb
Tidied up the class Scope a bit.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
684
diff
changeset
|
208 { |
804
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
209 auto baseType = visitT(t.next).type; |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
210 if (t.isAssociative) |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
211 t.type = baseType.arrayOf(visitT(t.assocType).type); |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
212 else if (t.isDynamic) |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
213 t.type = baseType.arrayOf(); |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
214 else if (t.isStatic) |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
215 {} |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
216 else |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
217 assert(t.isSlice); |
692
d33895f679eb
Tidied up the class Scope a bit.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
684
diff
changeset
|
218 return t; |
d33895f679eb
Tidied up the class Scope a bit.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
684
diff
changeset
|
219 } |
d33895f679eb
Tidied up the class Scope a bit.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
684
diff
changeset
|
220 |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
221 T visit(PointerType t) |
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 t.type = visitT(t.next).type.ptrTo(); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
224 return t; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
225 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
226 |
804
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
227 T visit(QualifiedType t) |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
228 { |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
229 if (t.lhs.Is!(QualifiedType) is null) |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
230 idScope = null; // Reset at left-most type. |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
231 visitT(t.lhs); |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
232 visitT(t.rhs); |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
233 t.type = t.rhs.type; |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
234 return t; |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
235 } |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
236 |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
237 T visit(IdentifierType t) |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
238 { |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
239 auto idToken = t.begin; |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
240 auto symbol = search(idToken); |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
241 // TODO: save symbol or its type in t. |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
242 return t; |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
243 } |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
244 |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
245 T visit(TemplateInstanceType t) |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
246 { |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
247 auto idToken = t.begin; |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
248 auto symbol = search(idToken); |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
249 // TODO: save symbol or its type in t. |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
250 return t; |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
251 } |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
252 |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
253 T visit(ModuleScopeType t) |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
254 { |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
255 idScope = modul; |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
256 return t; |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
257 } |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
258 |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
259 T visit(IntegralType t) |
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 // 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
|
262 TypeBasic[TOK] tok2Type = [ |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
263 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
|
264 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
|
265 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
|
266 TOK.Cent : Types.Cent, TOK.Ucent : Types.Ucent, |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
267 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
|
268 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
|
269 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
|
270 ]; |
694
19a34b69cc7d
Renamed some members of BinaryExpression and QualifiedType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
692
diff
changeset
|
271 assert(t.tok in tok2Type); |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
272 t.type = tok2Type[t.tok]; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
273 return t; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
274 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
275 |
804
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
276 // Expression nodes: |
9e6c6bb73e5f
Implemented visit methods for some type nodes.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
798
diff
changeset
|
277 |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
278 E visit(ParenExpression e) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
279 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
280 if (!e.type) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
281 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
282 e.next = visitE(e.next); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
283 e.type = e.next.type; |
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 return 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 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
288 E visit(CommaExpression e) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
289 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
290 if (!e.type) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
291 { |
694
19a34b69cc7d
Renamed some members of BinaryExpression and QualifiedType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
692
diff
changeset
|
292 e.lhs = visitE(e.lhs); |
19a34b69cc7d
Renamed some members of BinaryExpression and QualifiedType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
692
diff
changeset
|
293 e.rhs = visitE(e.rhs); |
19a34b69cc7d
Renamed some members of BinaryExpression and QualifiedType.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
692
diff
changeset
|
294 e.type = e.rhs.type; |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
295 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
296 return e; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
297 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
298 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
299 E visit(OrOrExpression) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
300 { return null; } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
301 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
302 E visit(AndAndExpression) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
303 { return null; } |
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(SpecialTokenExpression 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 if (e.type) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
308 return e.value; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
309 switch (e.specialToken.kind) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
310 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
311 case TOK.LINE, TOK.VERSION: |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
312 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
|
313 break; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
314 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
|
315 e.value = new StringExpression(e.specialToken.str); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
316 break; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
317 default: |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
318 assert(0); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
319 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
320 e.type = e.value.type; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
321 return e.value; |
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 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
324 E visit(DollarExpression e) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
325 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
326 if (e.type) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
327 return e; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
328 e.type = Types.Size_t; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
329 // if (!inArraySubscript) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
330 // error("$ can only be in an array subscript."); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
331 return e; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
332 } |
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 E visit(NullExpression e) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
335 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
336 if (!e.type) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
337 e.type = Types.Void_ptr; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
338 return e; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
339 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
340 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
341 E visit(BoolExpression e) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
342 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
343 if (e.type) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
344 return e; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
345 e.value = new IntExpression(e.toBool(), Types.Bool); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
346 e.type = Types.Bool; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
347 return e; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
348 } |
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 E visit(IntExpression e) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
351 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
352 if (e.type) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
353 return e; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
354 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
355 if (e.number & 0x8000_0000_0000_0000) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
356 e.type = Types.Ulong; // 0xFFFF_FFFF_FFFF_FFFF |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
357 else if (e.number & 0xFFFF_FFFF_0000_0000) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
358 e.type = Types.Long; // 0x7FFF_FFFF_FFFF_FFFF |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
359 else if (e.number & 0x8000_0000) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
360 e.type = Types.Uint; // 0xFFFF_FFFF |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
361 else |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
362 e.type = Types.Int; // 0x7FFF_FFFF |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
363 return e; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
364 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
365 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
366 E visit(RealExpression e) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
367 { |
704
ff4643a4a97c
Wrote code for SemanticPass2.visit(MixinDeclaration).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
696
diff
changeset
|
368 if (!e.type) |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
369 e.type = Types.Double; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
370 return e; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
371 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
372 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
373 E visit(ComplexExpression e) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
374 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
375 if (!e.type) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
376 e.type = Types.Cdouble; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
377 return e; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
378 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
379 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
380 E visit(CharExpression e) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
381 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
382 return e; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
383 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
384 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
385 E visit(StringExpression e) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
386 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
387 return e; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
388 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
389 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
390 E visit(MixinExpression me) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
391 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
392 if (me.type) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
393 return me.expr; |
696
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
394 me.expr = visitE(me.expr); |
708
3a4c7d444467
Added method interpret() to class SemanticPass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
707
diff
changeset
|
395 auto expr = interpret(me.expr); |
696
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
396 if (expr is Interpreter.NAR) |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
397 return me; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
398 auto stringExpr = expr.Is!(StringExpression); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
399 if (stringExpr is null) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
400 error(me.begin, MSG.MixinArgumentMustBeString); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
401 else |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
402 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
403 auto loc = me.begin.getErrorLocation(); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
404 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
|
405 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
|
406 auto parser = new Parser(sourceText, modul.infoMan); |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
407 expr = parser.start2(); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
408 expr = visitE(expr); // Check expression. |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
409 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
410 me.expr = expr; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
411 me.type = expr.type; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
412 return me.expr; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
413 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
414 |
696
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
415 E visit(ImportExpression ie) |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
416 { |
696
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
417 if (ie.type) |
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
418 return ie.expr; |
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
419 ie.expr = visitE(ie.expr); |
708
3a4c7d444467
Added method interpret() to class SemanticPass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
707
diff
changeset
|
420 auto expr = interpret(ie.expr); |
696
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
421 if (expr is Interpreter.NAR) |
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
422 return ie; |
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
423 auto stringExpr = expr.Is!(StringExpression); |
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
424 //if (stringExpr is null) |
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
425 // error(me.begin, MSG.ImportArgumentMustBeString); |
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
426 // TODO: load file |
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
427 //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
|
428 return ie.expr; |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
429 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
430 } |
696
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
431 } |