annotate compiler.js @ 19:132c7756860e

Use populateSymbols to generate symbol tables during compilation rather than populating them as we go. This change allows us to refer to symbols defined later in the input stream and also gives the symbol table logic a single home that can be used both by the compiler and editor.
author Mike Pavone <pavone@retrodev.com>
date Sun, 25 Mar 2012 16:11:19 -0700
parents 59e83296e331
children bf03c9f0dd55
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1 function indent(str)
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
2 {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
3 return str.split('\n').join('\n\t');
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
4 }
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
6 function osymbols(parent)
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
7 {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
8 this.parent = parent;
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
9 this.names = {};
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
10 this.lastname = null;
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
11 }
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
12 osymbols.prototype.find = function(name) {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
13 if (name in this.names) {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
14 if (this.names[name] instanceof funcall && this.names[name].name == 'foreign:') {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
15 return {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
16 type: 'foreign',
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
17 def: this.names[name]
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
18 };
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
19 }
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
20 return {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
21 type: 'self',
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
22 def: this.names[name],
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
23 };
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
24 } else if(this.parent) {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
25 var ret = this.parent.find(name);
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
26 if (ret) {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
27 if(ret.type == 'self') {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
28 ret.type = 'parent';
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
29 ret.depth = 1;
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
30 } else if(ret.type == 'parent') {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
31 ret.depth++;
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
32 }
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
33 }
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
34 return ret;
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
35 }
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
36 return null;
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
37 };
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
38 osymbols.prototype.defineMsg = function(name, def) {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
39 this.lastname = name;
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
40 this.names[name] = def;
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
41 }
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
42 osymbols.prototype.parentObject = function() {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
43 if (!this.parent) {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
44 return 'null';
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
45 }
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
46 return 'this';
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
47 }
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
48
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
49 function lsymbols(parent)
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
50 {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
51 this.parent = parent;
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
52 this.names = {};
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
53 this.lastname = null;
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
54 this.needsSelfVar = false;
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
55 }
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
56 lsymbols.prototype.find = function(name) {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
57 if (name in this.names) {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
58 if (this.names[name] instanceof funcall && this.names[name].name == 'foreign:') {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
59 return {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
60 type: 'foreign',
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
61 def: this.names[name]
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
62 };
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
63 }
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
64 return {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
65 type: 'local',
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
66 def: this.names[name]
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
67 };
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
68 } else if(this.parent) {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
69 var ret = this.parent.find(name);
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
70 if (ret && ret.type == 'local') {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
71 ret.type = 'upvar';
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
72 }
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
73 return ret;
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
74 }
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
75 return null;
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
76 };
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
77 lsymbols.prototype.defineVar = function(name, def) {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
78 this.lastname = name;
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
79 this.names[name] = def;
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
80 };
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
81 lsymbols.prototype.selfVar = function() {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
82 if (this.parent && this.parent instanceof lsymbols) {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
83 this.parent.needsSelf();
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
84 return 'self';
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
85 } else {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
86 return 'this';
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
87 }
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
88 };
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
89 lsymbols.prototype.needsSelf = function() {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
90 if (this.parent && this.parent instanceof lsymbols) {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
91 this.parent.needsSelf();
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
92 } else {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
93 this.needsSelfVar = true;
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
94 }
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
95 };
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
96
16
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
97 var mainModule;
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
98
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
99 function toobj(val)
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
100 {
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
101 switch(typeof val)
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
102 {
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
103 case 'boolean':
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
104 if(val) {
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
105 return mainModule.strue;
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
106 } else {
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
107 return mainModule.sfalse;
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
108 }
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
109 case 'number':
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
110 return mainModule.snumber(val);
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
111 }
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
112 throw new Error("can't make val into object");
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
113 }
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
114
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
115 function setP(o, p, val)
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
116 {
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
117 o[p] = val;
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
118 return o;
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
119 }
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
120
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
121 function getP(o, p)
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
122 {
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
123 return o[p];
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
124 }
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
125
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
126 op.prototype.populateSymbols = function(symbols, isReceiver) {
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
127 this.left.populateSymbols(symbols);
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
128 this.right.populateSymbols(symbols);
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
129 };
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
130
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
131 symbol.prototype.populateSymbols = function(symbols) {
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
132 this.symbols = symbols;
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
133 }
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
134
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
135 intlit.prototype.populateSymbols = function(symbols) {
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
136 }
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
137
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
138 floatlit.prototype.populateSymbols = function(symbols) {
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
139 }
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
140
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
141 strlit.prototype.populateSymbols = function(symbols) {
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
142 }
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
143
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
144 funcall.prototype.populateSymbols = function(symbols) {
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
145 if (this.name == 'foreign:') {
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
146 if ((this.args[0] instanceof lambda) || (this.args[0] instanceof object) || (this.args[0] instanceof symbol)) {
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
147 return;
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
148 } else {
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
149 throw new Error("Unexpected AST type for foreign:");
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
150 }
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
151 }
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
152 for (var i in this.args) {
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
153 this.args[i].populateSymbols(symbols);
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
154 }
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
155 }
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
156
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
157 object.prototype.populateSymbols = function(symbols) {
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
158 symbols = new osymbols(symbols);
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
159 for (var i in this.messages) {
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
160 this.messages[i].populateSymbolsObject(symbols);
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
161 }
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
162 this.symbols = symbols;
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
163 }
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
164
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
165 lambda.prototype.populateSymbols = function(symbols) {
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
166 var args = this.args ? this.args.slice(0, this.args.length) : [];
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
167 if (args.length && args[0].cleanName() == 'self') {
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
168 args.splice(0, 1);
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
169 }
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
170 var exprs = this.expressions;
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
171 symbols = new lsymbols(symbols);
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
172 for (var i in args) {
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
173 symbols.defineVar(args[i].cleanName(), null);
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
174 args[i].populateSymbols(symbols);
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
175 }
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
176 for (var i in exprs) {
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
177 exprs[i].populateSymbols(symbols);
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
178 }
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
179 this.symbols = symbols;
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
180 };
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
181
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
182 assignment.prototype.populateSymbols = function(symbols) {
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
183 var existing = symbols.find(this.symbol.name);
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
184 if (!existing) {
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
185 symbols.defineVar(this.symbol.name, this.expression);
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
186 }
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
187 this.symbol.populateSymbols(symbols);
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
188 this.expression.populateSymbols(symbols);
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
189 };
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
190 assignment.prototype.populateSymbolsObject = function(symbols) {
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
191 symbols.defineMsg(this.symbol.name, this.expression);
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
192 this.symbol.populateSymbols(symbols);
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
193 this.expression.populateSymbols(symbols);
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
194 };
59e83296e331 Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents: 8
diff changeset
195