Mercurial > projects > dil
annotate src/dil/semantic/Pass2.d @ 820:1d06b4aed7cf
Revised code in the first pass.
Added code to handle anonymous unions and structs. Hope the idea will work.
Added type to class Aggregate and isAnonymous to some other Symbol classes.
author | Aziz K?ksal <aziz.koeksal@gmail.com> |
---|---|
date | Fri, 14 Mar 2008 15:42:08 +0100 |
parents | 525ee3f848d9 |
children | fd52beaaa94a |
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 if (e.type) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
383 return e; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
384 if (e.character <= 0xFF) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
385 e.type = Types.Char; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
386 else if (e.character <= 0xFFFF) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
387 e.type = Types.Wchar; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
388 else |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
389 e.type = Types.Dchar; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
390 return e; |
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 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
393 E visit(StringExpression e) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
394 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
395 return e; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
396 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
397 |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
398 E visit(MixinExpression me) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
399 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
400 if (me.type) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
401 return me.expr; |
696
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
402 me.expr = visitE(me.expr); |
708
3a4c7d444467
Added method interpret() to class SemanticPass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
707
diff
changeset
|
403 auto expr = interpret(me.expr); |
696
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
404 if (expr is Interpreter.NAR) |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
405 return me; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
406 auto stringExpr = expr.Is!(StringExpression); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
407 if (stringExpr is null) |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
408 error(me.begin, MSG.MixinArgumentMustBeString); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
409 else |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
410 { |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
411 auto loc = me.begin.getErrorLocation(); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
412 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
|
413 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
|
414 auto parser = new Parser(sourceText, modul.infoMan); |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
415 expr = parser.start2(); |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
416 expr = visitE(expr); // Check expression. |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
417 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
418 me.expr = expr; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
419 me.type = expr.type; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
420 return me.expr; |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
421 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
422 |
696
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
423 E visit(ImportExpression ie) |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
424 { |
696
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
425 if (ie.type) |
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
426 return ie.expr; |
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
427 ie.expr = visitE(ie.expr); |
708
3a4c7d444467
Added method interpret() to class SemanticPass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
707
diff
changeset
|
428 auto expr = interpret(ie.expr); |
696
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
429 if (expr is Interpreter.NAR) |
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
430 return ie; |
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
431 auto stringExpr = expr.Is!(StringExpression); |
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
432 //if (stringExpr is null) |
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
433 // error(me.begin, MSG.ImportArgumentMustBeString); |
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
434 // TODO: load file |
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
435 //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
|
436 return ie.expr; |
684
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
437 } |
10b314bf37e3
Added module dil.semantic.Pass2.
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
diff
changeset
|
438 } |
696
c67d2c3c0b3d
Wrote code for SemanticPass2.visit(ImportExpression).
Aziz K?ksal <aziz.koeksal@gmail.com>
parents:
694
diff
changeset
|
439 } |