Mercurial > repos > tabletprog
comparison compiler.js @ 16:59e83296e331
Add populateSymbols method to AST
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 25 Mar 2012 14:25:33 -0700 |
parents | 04ae32e91598 |
children | bf03c9f0dd55 |
comparison
equal
deleted
inserted
replaced
15:a5ef5af3df0f | 16:59e83296e331 |
---|---|
92 } else { | 92 } else { |
93 this.needsSelfVar = true; | 93 this.needsSelfVar = true; |
94 } | 94 } |
95 }; | 95 }; |
96 | 96 |
97 var mainModule; | |
98 | |
99 function toobj(val) | |
100 { | |
101 switch(typeof val) | |
102 { | |
103 case 'boolean': | |
104 if(val) { | |
105 return mainModule.strue; | |
106 } else { | |
107 return mainModule.sfalse; | |
108 } | |
109 case 'number': | |
110 return mainModule.snumber(val); | |
111 } | |
112 throw new Error("can't make val into object"); | |
113 } | |
114 | |
115 function setP(o, p, val) | |
116 { | |
117 o[p] = val; | |
118 return o; | |
119 } | |
120 | |
121 function getP(o, p) | |
122 { | |
123 return o[p]; | |
124 } | |
125 | |
126 op.prototype.populateSymbols = function(symbols, isReceiver) { | |
127 this.left.populateSymbols(symbols); | |
128 this.right.populateSymbols(symbols); | |
129 }; | |
130 | |
131 symbol.prototype.populateSymbols = function(symbols) { | |
132 this.symbols = symbols; | |
133 } | |
134 | |
135 intlit.prototype.populateSymbols = function(symbols) { | |
136 } | |
137 | |
138 floatlit.prototype.populateSymbols = function(symbols) { | |
139 } | |
140 | |
141 strlit.prototype.populateSymbols = function(symbols) { | |
142 } | |
143 | |
144 funcall.prototype.populateSymbols = function(symbols) { | |
145 if (this.name == 'foreign:') { | |
146 if ((this.args[0] instanceof lambda) || (this.args[0] instanceof object) || (this.args[0] instanceof symbol)) { | |
147 return; | |
148 } else { | |
149 throw new Error("Unexpected AST type for foreign:"); | |
150 } | |
151 } | |
152 for (var i in this.args) { | |
153 this.args[i].populateSymbols(symbols); | |
154 } | |
155 } | |
156 | |
157 object.prototype.populateSymbols = function(symbols) { | |
158 symbols = new osymbols(symbols); | |
159 for (var i in this.messages) { | |
160 this.messages[i].populateSymbolsObject(symbols); | |
161 } | |
162 this.symbols = symbols; | |
163 } | |
164 | |
165 lambda.prototype.populateSymbols = function(symbols) { | |
166 var args = this.args ? this.args.slice(0, this.args.length) : []; | |
167 if (args.length && args[0].cleanName() == 'self') { | |
168 args.splice(0, 1); | |
169 } | |
170 var exprs = this.expressions; | |
171 symbols = new lsymbols(symbols); | |
172 for (var i in args) { | |
173 symbols.defineVar(args[i].cleanName(), null); | |
174 args[i].populateSymbols(symbols); | |
175 } | |
176 for (var i in exprs) { | |
177 exprs[i].populateSymbols(symbols); | |
178 } | |
179 this.symbols = symbols; | |
180 }; | |
181 | |
182 assignment.prototype.populateSymbols = function(symbols) { | |
183 var existing = symbols.find(this.symbol.name); | |
184 if (!existing) { | |
185 symbols.defineVar(this.symbol.name, this.expression); | |
186 } | |
187 this.symbol.populateSymbols(symbols); | |
188 this.expression.populateSymbols(symbols); | |
189 }; | |
190 assignment.prototype.populateSymbolsObject = function(symbols) { | |
191 symbols.defineMsg(this.symbol.name, this.expression); | |
192 this.symbol.populateSymbols(symbols); | |
193 this.expression.populateSymbols(symbols); | |
194 }; | |
195 |