annotate dmdscript_tango/scopex.d @ 3:8363a4bf6a8f

rename package: dmdscript to dmdscript_tango
author saaadel
date Sun, 24 Jan 2010 18:33:05 +0200
parents 55c2951c07be
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-2007 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.scopex;
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
23
3
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
24 import dmdscript_tango.script;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
25 import dmdscript_tango.program;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
26 import dmdscript_tango.symbol;
8363a4bf6a8f rename package: dmdscript to dmdscript_tango
saaadel
parents: 0
diff changeset
27 import dmdscript_tango.functiondefinition;
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.statement;
0
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
30
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
31 struct Scope
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
32 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
33 Scope* enclosing; // enclosing Scope
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
34
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
35 char[] src; // source text
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
36 Program program; // Root module
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
37 ScopeSymbol *scopesym; // current symbol
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
38 FunctionDefinition funcdef; // what function we're in
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
39 SymbolTable **plabtab; // pointer to label symbol table
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
40 uint nestDepth; // static nesting level
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
41
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
42 ScopeStatement scopeContext; // nesting of scope statements
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
43 Statement continueTarget;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
44 Statement breakTarget;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
45 SwitchStatement switchTarget;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
46
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
47 ErrInfo errinfo; // semantic() puts error messages here
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
48
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
49 void zero()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
50 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
51 enclosing = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
52
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
53 src = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
54 program = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
55 scopesym = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
56 funcdef = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
57 plabtab = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
58 nestDepth = 0;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
59
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
60 scopeContext = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
61 continueTarget = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
62 breakTarget = null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
63 switchTarget = null;
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 ctor(Scope* enclosing)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
67 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
68 zero();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
69 this.program = enclosing.program;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
70 this.funcdef = enclosing.funcdef;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
71 this.plabtab = enclosing.plabtab;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
72 this.nestDepth = enclosing.nestDepth;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
73 this.enclosing = enclosing;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
74 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
75
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
76 void ctor(Program program, FunctionDefinition fd)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
77 { // Create root scope
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
78
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
79 zero();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
80 this.program = program;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
81 this.funcdef = fd;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
82 this.plabtab = &fd.labtab;
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 void ctor(FunctionDefinition fd)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
86 { // Create scope for anonymous function fd
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
87
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
88 zero();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
89 this.funcdef = fd;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
90 this.plabtab = &fd.labtab;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
91 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
92
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
93 void dtor()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
94 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
95 // Help garbage collector
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
96 zero();
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 Scope* push()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
100 { Scope* s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
101
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
102 s = new Scope;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
103 s.ctor(this);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
104 return s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
105 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
106
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
107 Scope* push(FunctionDefinition fd)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
108 { Scope* s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
109
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
110 s = push();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
111 s.funcdef = fd;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
112 s.plabtab = &fd.labtab;
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 void pop()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
117 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
118 if (enclosing && !enclosing.errinfo.message)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
119 enclosing.errinfo = errinfo;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
120 zero(); // aid GC
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
121 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
122
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
123
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
124 Symbol search(Identifier *ident)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
125 { Symbol s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
126 Scope* sc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
127
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
128 //writef("Scope.search(%p, '%s')\n", this, ident.toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
129 for (sc = this; sc; sc = sc.enclosing)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
130 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
131 s = sc.scopesym.search(ident);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
132 if (s)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
133 return s;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
134 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
135
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
136 assert(0);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
137 //error("Symbol '%s' is not defined", ident.toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
138 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
139 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
140
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
141 Symbol insert(Symbol s)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
142 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
143 if (!scopesym.symtab)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
144 scopesym.symtab = new SymbolTable();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
145 return scopesym.symtab.insert(s);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
146 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
147
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
148 LabelSymbol searchLabel(Identifier *ident)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
149 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
150 SymbolTable *st;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
151 LabelSymbol ls;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
152
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
153 //writef("Scope::searchLabel('%ls')\n", ident.toDchars());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
154 assert(plabtab);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
155 st = *plabtab;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
156 if (!st)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
157 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
158 st = new SymbolTable();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
159 *plabtab = st;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
160 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
161 ls = cast(LabelSymbol )st.lookup(ident);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
162 return ls;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
163 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
164
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
165 LabelSymbol insertLabel(LabelSymbol ls)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
166 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
167 SymbolTable *st;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
168
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
169 //writef("Scope::insertLabel('%s')\n", ls.toString());
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
170 assert(plabtab);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
171 st = *plabtab;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
172 if (!st)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
173 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
174 st = new SymbolTable();
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
175 *plabtab = st;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
176 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
177 ls = cast(LabelSymbol )st.insert(ls);
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
178 return ls;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
179 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
180
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
181 tchar[] getSource()
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
182 { Scope* sc;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
183
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
184 for (sc = this; sc; sc = sc.enclosing)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
185 {
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
186 if (sc.src)
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
187 return sc.src;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
188 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
189
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
190 return null;
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
191 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
192 }
55c2951c07be initial, files origin, premoved tree
saaadel
parents:
diff changeset
193