annotate dmdscript_tango/symbol.d @ 4:6d905019f7bf

some changes
author saaadel
date Thu, 28 Jan 2010 21:23:27 +0200
parents 8363a4bf6a8f
children
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
3
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
22 module dmdscript_tango.symbol;
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
23
4
6d905019f7bf some changes
saaadel
parents: 3
diff changeset
24 //import std.stdio;
6d905019f7bf some changes
saaadel
parents: 3
diff changeset
25 import tango.io.Stdout;
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
26
3
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
27 import dmdscript_tango.script;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
28 import dmdscript_tango.identifier;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
29 import dmdscript_tango.scopex;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
30 import dmdscript_tango.statement;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
31 import dmdscript_tango.irstate;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
32 import dmdscript_tango.opcodes;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
33 import dmdscript_tango.textgen.errmsgs;
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
34
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
35 /****************************** Symbol ******************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
36
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
37 class Symbol
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
38 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
39 Identifier *ident;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
40
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
41 this()
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
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
45 this(Identifier *ident)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
46 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
47 this.ident = ident;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
48 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
49
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
50 int opEquals(Object o)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
51 { Symbol s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
52
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
53 if (this == o)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
54 return true;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
55 s = cast(Symbol)o;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
56 if (s && ident == s.ident)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
57 return true;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
58 return false;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
59 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
60
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
61 tchar[] toString()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
62 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
63 return ident ? "__ident" : "__anonymous";
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
64 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
65
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
66 void semantic(Scope *sc)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
67 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
68 assert(0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
69 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
70
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
71 Symbol search(Identifier *ident)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
72 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
73 assert(0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
74 //error(DTEXT("%s.%s is undefined"),toString(), ident.toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
75 return this;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
76 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
77
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
78 void toBuffer(inout tchar[] buf)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
79 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
80 buf ~= toString();
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
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
85 /********************************* ScopeSymbol ****************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
86
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
87 // Symbol that generates a scope
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
88
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
89 class ScopeSymbol : Symbol
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
90 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
91 Symbol[] members; // all Symbol's in this scope
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
92 SymbolTable *symtab; // member[] sorted into table
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
93
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
94 this()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
95 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
96 super();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
97 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
98
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
99 this(Identifier *id)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
100 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
101 super(id);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
102 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
103
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
104 Symbol search(Identifier *ident)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
105 { Symbol s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
106
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
107 //writef("ScopeSymbol::search(%s, '%s')\n", toString(), ident.toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
108 // Look in symbols declared in this module
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
109 s = symtab ? symtab.lookup(ident) : null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
110 if (s)
4
6d905019f7bf some changes
saaadel
parents: 3
diff changeset
111 Stdout.format("\ts = '{}.{}'\n",toString(),s.toString());
6d905019f7bf some changes
saaadel
parents: 3
diff changeset
112 //writef("\ts = '%s.%s'\n",toString(),s.toString());
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
113 return s;
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
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
117
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
118 /****************************** SymbolTable ******************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
119
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
120 // Table of Symbol's
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
121
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
122 struct SymbolTable
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
123 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
124 Symbol[Identifier*] members;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
125
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
126 // Look up Identifier. Return Symbol if found, NULL if not.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
127 Symbol lookup(Identifier *ident)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
128 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
129 Symbol *ps;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
130
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
131 ps = ident in members;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
132 if (ps)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
133 return *ps;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
134 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
135 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
136
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
137 // Insert Symbol in table. Return NULL if already there.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
138 Symbol insert(Symbol s)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
139 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
140 Symbol *ps;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
141
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
142 ps = s.ident in members;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
143 if (ps)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
144 return null; // already in table
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
145 members[s.ident] = s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
146 return s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
147 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
148
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
149 // Look for Symbol in table. If there, return it.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
150 // If not, insert s and return that.
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
151 Symbol update(Symbol s)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
152 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
153 members[s.ident] = s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
154 return s;
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
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
158
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
159 /****************************** FunctionSymbol ******************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
160
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
161 class FunctionSymbol : ScopeSymbol
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
162 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
163 Loc loc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
164
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
165 Identifier*[] parameters; // array of Identifier's
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
166 TopStatement[] topstatements; // array of TopStatement's
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
167
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
168 SymbolTable labtab; // symbol table for LabelSymbol's
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
169
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
170 IR *code;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
171 uint nlocals;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
172
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
173 this(Loc loc, Identifier* ident, Identifier*[] parameters,
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
174 TopStatement[] topstatements)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
175 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
176 super(ident);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
177 this.loc = loc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
178 this.parameters = parameters;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
179 this.topstatements = topstatements;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
180 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
181
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
182 void semantic(Scope *sc)
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
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
187
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
188 /****************************** LabelSymbol ******************************/
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
189
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
190 class LabelSymbol : Symbol
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
191 { Loc loc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
192 LabelStatement statement;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
193
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
194 this(Loc loc, Identifier* ident, LabelStatement statement)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
195 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
196 super(ident);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
197 this.loc = loc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
198 this.statement = statement;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
199 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
200 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
201
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
202