annotate dmdscript_tango/symbol.d @ 0:55c2951c07be

initial, files origin, premoved tree
author saaadel
date Sun, 24 Jan 2010 12:34:47 +0200
parents
children 8363a4bf6a8f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
1
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
2 /* Digital Mars DMDScript source code.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
3 * Copyright (c) 2000-2002 by Chromium Communications
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
4 * D version Copyright (c) 2004-2005 by Digital Mars
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
5 * All Rights Reserved
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
6 * written by Walter Bright
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
7 * www.digitalmars.com
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
8 * Use at your own risk. There is no warranty, express or implied.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
9 * License for redistribution is by the GNU General Public License in gpl.txt.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
10 *
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
11 * A binary, non-exclusive license for commercial use can be
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
12 * purchased from www.digitalmars.com/dscript/buy.html.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
13 *
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
14 * DMDScript is implemented in the D Programming Language,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
15 * www.digitalmars.com/d/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
16 *
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
17 * For a C++ implementation of DMDScript, including COM support,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
18 * see www.digitalmars.com/dscript/cppscript.html.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
19 */
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
20
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
21
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
22 module dmdscript.symbol;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
23
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
24 import std.stdio;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
25
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
26 import dmdscript.script;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
27 import dmdscript.identifier;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
28 import dmdscript.scopex;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
29 import dmdscript.statement;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
30 import dmdscript.irstate;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
31 import dmdscript.opcodes;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
32 import dmdscript.errmsgs;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
33
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
34 /****************************** Symbol ******************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
35
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
36 class Symbol
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
37 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
38 Identifier *ident;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
39
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
40 this()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
41 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
42 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
43
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
44 this(Identifier *ident)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
45 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
46 this.ident = ident;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
47 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
48
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
49 int opEquals(Object o)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
50 { Symbol s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
51
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
52 if (this == o)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
53 return true;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
54 s = cast(Symbol)o;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
55 if (s && ident == s.ident)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
56 return true;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
57 return false;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
58 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
59
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
60 tchar[] toString()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
61 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
62 return ident ? "__ident" : "__anonymous";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
63 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
64
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
65 void semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
66 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
67 assert(0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
68 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
69
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
70 Symbol search(Identifier *ident)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
71 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
72 assert(0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
73 //error(DTEXT("%s.%s is undefined"),toString(), ident.toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
74 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
75 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
76
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
77 void toBuffer(inout tchar[] buf)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
78 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
79 buf ~= toString();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
80 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
81 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
82
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
83
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
84 /********************************* ScopeSymbol ****************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
85
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
86 // Symbol that generates a scope
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
87
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
88 class ScopeSymbol : Symbol
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
89 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
90 Symbol[] members; // all Symbol's in this scope
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
91 SymbolTable *symtab; // member[] sorted into table
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
92
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
93 this()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
94 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
95 super();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
96 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
97
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
98 this(Identifier *id)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
99 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
100 super(id);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
101 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
102
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
103 Symbol search(Identifier *ident)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
104 { Symbol s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
105
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
106 //writef("ScopeSymbol::search(%s, '%s')\n", toString(), ident.toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
107 // Look in symbols declared in this module
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
108 s = symtab ? symtab.lookup(ident) : null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
109 if (s)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
110 writef("\ts = '%s.%s'\n",toString(),s.toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
111 return s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
112 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
113 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
114
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
115
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
116 /****************************** SymbolTable ******************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
117
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
118 // Table of Symbol's
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
119
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
120 struct SymbolTable
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
121 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
122 Symbol[Identifier*] members;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
123
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
124 // Look up Identifier. Return Symbol if found, NULL if not.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
125 Symbol lookup(Identifier *ident)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
126 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
127 Symbol *ps;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
128
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
129 ps = ident in members;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
130 if (ps)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
131 return *ps;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
132 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
133 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
134
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
135 // Insert Symbol in table. Return NULL if already there.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
136 Symbol insert(Symbol s)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
137 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
138 Symbol *ps;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
139
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
140 ps = s.ident in members;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
141 if (ps)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
142 return null; // already in table
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
143 members[s.ident] = s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
144 return s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
145 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
146
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
147 // Look for Symbol in table. If there, return it.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
148 // If not, insert s and return that.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
149 Symbol update(Symbol s)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
150 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
151 members[s.ident] = s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
152 return s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
153 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
154 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
155
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
156
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
157 /****************************** FunctionSymbol ******************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
158
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
159 class FunctionSymbol : ScopeSymbol
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
160 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
161 Loc loc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
162
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
163 Identifier*[] parameters; // array of Identifier's
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
164 TopStatement[] topstatements; // array of TopStatement's
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
165
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
166 SymbolTable labtab; // symbol table for LabelSymbol's
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
167
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
168 IR *code;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
169 uint nlocals;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
170
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
171 this(Loc loc, Identifier* ident, Identifier*[] parameters,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
172 TopStatement[] topstatements)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
173 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
174 super(ident);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
175 this.loc = loc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
176 this.parameters = parameters;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
177 this.topstatements = topstatements;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
178 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
179
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
180 void semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
181 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
182 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
183 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
184
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
185
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
186 /****************************** LabelSymbol ******************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
187
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
188 class LabelSymbol : Symbol
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
189 { Loc loc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
190 LabelStatement statement;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
191
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
192 this(Loc loc, Identifier* ident, LabelStatement statement)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
193 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
194 super(ident);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
195 this.loc = loc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
196 this.statement = statement;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
197 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
198 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
199
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
200