annotate parser.js @ 7:8af72f11714e

Initial version of FFI
author Mike Pavone <pavone@retrodev.com>
date Wed, 21 Mar 2012 20:12:12 -0700
parents 554602d4cbc6
children 04ae32e91598
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
1 var mainModule;
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
2 function toobj(val)
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
3 {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
4 switch(typeof val)
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
5 {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
6 case 'boolean':
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
7 if(val) {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
8 return mainModule.strue;
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
9 } else {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
10 return mainModule.sfalse;
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
11 }
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
12 case 'number':
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
13 return mainModule.snumber(val);
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
14 }
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
15 throw new Error("can't make val into object");
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
16 }
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
17
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
18 function indent(str)
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
19 {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
20 return str.split('\n').join('\n\t');
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
21 }
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
22
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
23 function osymbols(parent)
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
24 {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
25 this.parent = parent;
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
26 this.names = {};
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
27 this.lastname = null;
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
28 }
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
29 osymbols.prototype.find = function(name) {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
30 if (name in this.names) {
7
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
31 if (this.names[name] instanceof funcall && this.names[name].name == 'foreign:') {
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
32 return {
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
33 type: 'foreign',
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
34 def: this.names[name]
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
35 };
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
36 }
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
37 return {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
38 type: 'self',
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
39 def: this.names[name],
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
40 };
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
41 } else if(this.parent) {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
42 var ret = this.parent.find(name);
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
43 if (ret) {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
44 if(ret.type == 'self') {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
45 ret.type = 'parent';
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
46 ret.depth = 1;
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
47 } else if(ret.type == 'parent') {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
48 ret.depth++;
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
49 }
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
50 }
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
51 return ret;
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
52 }
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
53 return null;
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
54 };
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
55 osymbols.prototype.defineMsg = function(name, def) {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
56 this.lastname = name;
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
57 this.names[name] = def;
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
58 }
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
59 osymbols.prototype.parentObject = function() {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
60 if (!this.parent) {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
61 return 'null';
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
62 }
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
63 return 'this';
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
64 }
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
65
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
66 function lsymbols(parent)
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
67 {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
68 this.parent = parent;
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
69 this.names = {};
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
70 this.lastname = null;
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
71 this.needsSelfVar = false;
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
72 }
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
73 lsymbols.prototype.find = function(name) {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
74 if (name in this.names) {
7
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
75 if (this.names[name] instanceof funcall && this.names[name].name == 'foreign:') {
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
76 return {
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
77 type: 'foreign',
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
78 def: this.names[name]
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
79 };
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
80 }
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
81 return {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
82 type: 'local',
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
83 def: this.names[name]
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
84 };
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
85 } else if(this.parent) {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
86 var ret = this.parent.find(name);
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
87 if (ret && ret.type == 'local') {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
88 ret.type = 'upvar';
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
89 }
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
90 return ret;
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
91 }
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
92 return null;
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
93 };
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
94 lsymbols.prototype.defineVar = function(name, def) {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
95 this.lastname = name;
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
96 this.names[name] = def;
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
97 };
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
98 lsymbols.prototype.selfVar = function() {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
99 if (this.parent && this.parent instanceof lsymbols) {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
100 this.parent.needsSelf();
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
101 return 'self';
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
102 } else {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
103 return 'this';
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
104 }
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
105 };
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
106 lsymbols.prototype.needsSelf = function() {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
107 if (this.parent && this.parent instanceof lsymbols) {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
108 this.parent.needsSelf();
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
109 } else {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
110 this.needsSelfVar = true;
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
111 }
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
112 };
5
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
113
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
114 function op(left, op, right)
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
115 {
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
116 this.left = left;
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
117 this.op = op;
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
118 this.right = right;
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
119 }
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
120 op.prototype.toJS = function(symbols, isReceiver) {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
121 var ret = '(' + this.left.toJS(symbols) +' '+ (this.op == '=' ? '==' : this.op) +' '+ this.right.toJS(symbols) + ')';
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
122 if (isReceiver) {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
123 ret = 'toobj' + ret;
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
124 }
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
125 return ret;
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
126 };
5
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
127
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
128 function symbol(name)
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
129 {
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
130 this.name = name;
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
131 }
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
132 symbol.prototype.toJS = function(symbols) {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
133 var name = this.cleanName();
7
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
134 if (name == 'self') {
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
135 return symbols.selfVar();
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
136 }
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
137 name = name.replace("_", "UN_").replace(":", "CN_").replace("!", "EX_").replace('?', 'QS_').replace('@', 'AT_');
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
138 var reserved = {'true': true, 'false': true, 'this': true, 'if': true, 'else': true, 'NaN': true};
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
139 if (name in reserved) {
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
140 name = 's' + name;
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
141 }
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
142 return name;
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
143 }
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
144 symbol.prototype.cleanName = function() {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
145 return this.name[0] == ':' ? this.name.substr(1) : this.name;
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
146 }
5
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
147
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
148 function intlit(val)
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
149 {
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
150 this.val = val;
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
151 }
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
152 intlit.prototype.toJS = function(symbols) {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
153 return this.val.toString();
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
154 }
5
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
155
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
156 function floatlit(val)
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
157 {
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
158 this.val = val;
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
159 }
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
160 floatlit.prototype.toJS = function(symbols) {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
161 return this.val.toString();
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
162 }
5
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
163
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
164 function strlit(val)
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
165 {
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
166 this.val = val;
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
167 }
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
168 strlit.prototype.toJS = function(symbols) {
7
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
169 console.log('string:', this.val);
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
170 return '"' + this.val.replace('\\', '\\\\').replace('"', '\\"').replace('\n', '\\n').replace('\r', '\\r') + '"';
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
171 }
5
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
172
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
173 function funcall(name, args)
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
174 {
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
175 this.name = name;
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
176 this.args = args;
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
177 this.receiver = null;
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
178 }
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
179 funcall.prototype.toJS = function(symbols) {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
180 var name = this.name[this.name.length-1] == ':' ? this.name.substr(0, this.name.length-1) : this.name;
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
181 var args = this.args.slice(0, this.args.length);
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
182 if (this.receiver) {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
183 args.splice(0, 0, this.receiver);
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
184 }
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
185 var funinfo = symbols.find(name);
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
186 if (!funinfo) {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
187 var receiver = args[0];
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
188 args.splice(0, 1);
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
189 for (var i in args) {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
190 args[i] = args[i].toJS(symbols);
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
191 }
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
192 return receiver.toJS(symbols, true) + '.' + (new symbol(name)).toJS(symbols) + '(' + args.join(', ') + ')';
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
193 }
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
194 switch(funinfo.type)
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
195 {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
196 case 'self':
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
197 if (args.length < funinfo.def.args.length || funinfo.def.args[0].name != 'self') {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
198 var receiver = new symbol('self');
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
199 } else {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
200 var receiver = args[0];
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
201 args.splice(0, 1);
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
202 }
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
203 for (var i in args) {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
204 args[i] = args[i].toJS(symbols);
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
205 }
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
206 return receiver.toJS(symbols, true) + '.' + (new symbol(name)).toJS(symbols) + '(' + args.join(', ') + ')';
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
207 case 'parent':
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
208 var ret = 'this';
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
209 for (var i = 0; i < funinfo.depth; ++i) {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
210 ret += '.parent';
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
211 }
7
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
212 for (var i in args) {
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
213 args[i] = args[i].toJS(symbols);
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
214 }
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
215 ret += (new symbol(name)).toJS(symbols) + '(' + args.join(', ') + ')';
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
216 return ret;
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
217 case 'local':
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
218 case 'upvar':
7
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
219 case 'foreign':
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
220 for (var i in args) {
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
221 args[i] = args[i].toJS(symbols);
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
222 }
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
223 return (new symbol(name)).toJS(symbols) + '(' + args.join(', ') + ')';
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
224 }
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
225 }
5
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
226
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
227 function object(messages)
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
228 {
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
229 this.messages = messages;
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
230 }
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
231 object.prototype.toJS = function(symbols) {
7
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
232 var messages = this.messages;
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
233 symbols = new osymbols(symbols);
7
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
234 var compiled = []
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
235 for (var i in messages) {
7
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
236 var js = messages[i].toJSObject(symbols);
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
237 if (js) {
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
238 compiled.push(indent(js));
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
239 }
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
240 }
7
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
241 return '{\n\tparent: ' + symbols.parentObject() + ',\n\t' + compiled.join(',\n\t') + '\n}';
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
242 }
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
243
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
244 object.prototype.toJSModule = function() {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
245 return '(function () {\n\tvar module = ' + indent(this.toJS(null)) + ';\n\treturn module;\n})'
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
246 }
5
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
247
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
248 function lambda(args, expressions)
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
249 {
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
250 this.args = args;
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
251 this.expressions = expressions;
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
252 }
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
253 lambda.prototype.toJS = function(symbols) {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
254 var args = this.args ? this.args.slice(0, this.args.length) : [];
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
255 if (args.length && args[0].cleanName() == 'self') {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
256 args.splice(0, 1);
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
257 }
7
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
258 var exprs = this.expressions;
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
259 symbols = new lsymbols(symbols);
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
260 for (var i in args) {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
261 symbols.defineVar(args[i].cleanName(), null);
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
262 args[i] = args[i].toJS(symbols);
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
263 }
7
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
264 var compiled = []
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
265 for (var i in exprs) {
7
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
266 var js = exprs[i].toJS(symbols);
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
267 if (js) {
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
268 compiled.push(indent(js));
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
269 }
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
270 }
7
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
271 exprs = compiled;
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
272 if (exprs.length) {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
273 exprs[exprs.length-1] = 'return ' + exprs[exprs.length-1] + ';';
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
274 }
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
275 return 'function (' + args.join(', ') + ') {\n\t' + (symbols.needsSelfVar ? 'var self = this;\n\t' : '') + exprs.join(';\n\t') + '\n}'
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
276 };
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
277 lambda.prototype.toJSModule = lambda.prototype.toJS
5
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
278
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
279 function assignment(sym, expr)
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
280 {
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
281 this.symbol = sym;
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
282 this.expression = expr;
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
283 }
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
284 assignment.prototype.toJS = function(symbols) {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
285 var existing = symbols.find(this.symbol.name);
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
286 var prefix = '';
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
287 if (!existing) {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
288 symbols.defineVar(this.symbol.name, this.expression);
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
289 prefix = 'var ';
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
290 } else {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
291 switch (existing.type)
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
292 {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
293 case 'self':
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
294 prefix = 'this.';
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
295 break;
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
296 case 'parent':
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
297 prefix = 'this.';
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
298 for (var i = 0; i < existing.depth; ++i) {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
299 prefix += 'parent.';
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
300 }
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
301 break;
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
302 }
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
303 }
7
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
304 if (this.expression instanceof funcall && this.expression.name == 'foreign:') {
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
305 return null;
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
306 }
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
307 return prefix + this.symbol.toJS(symbols) + ' = ' + this.expression.toJS(symbols);
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
308 };
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
309 assignment.prototype.toJSObject = function(symbols) {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
310 symbols.defineMsg(this.symbol.name, this.expression);
7
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
311 if (this.expression instanceof funcall && this.expression.name == 'foreign:') {
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
312 return null;
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
313 }
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
314 return this.symbol.toJS(symbols) + ': ' + this.expression.toJS(symbols);
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
315 };
1
a57a12bdae96 Added funcall syntax
Mike Pavone <pavone@retrodev.com>
parents: 0
diff changeset
316
0
3d1b8e96f5dc Initial commit
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
317 var grammar =
1
a57a12bdae96 Added funcall syntax
Mike Pavone <pavone@retrodev.com>
parents: 0
diff changeset
318 'start = ws module:(object / lambda) ws { return module; };' +
4
a2c3ac7fafa2 Added support for comments
Mike Pavone <pavone@retrodev.com>
parents: 2
diff changeset
319 'ws = ([ \\t\\n\\r] / "//" [^\\n]* "\\n")*;' +
a2c3ac7fafa2 Added support for comments
Mike Pavone <pavone@retrodev.com>
parents: 2
diff changeset
320 'hws = ([ \\t] / "/*" ([^*] / "*" ! "/")* "*/" )*;' +
2
454c0346f357 Added method call syntax and comparison operators
Mike Pavone <pavone@retrodev.com>
parents: 1
diff changeset
321 'expr = e:(funcall / methcall / opexpr) ws { return e; };' +
5
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
322 'opexpr = left:addsub hws opn:("<=" / ">=" / "<" / ">" / "=") hws right:opexpr { return new op(left, opn, right); } / addsub;' +
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
323 'addsub = left:muldiv hws opn:("+"/"-") hws right:addsub { return new op(left, opn, right); } / muldiv;'+
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
324 'muldiv = left:primlitsym hws opn:("*"/"/") hws right:muldiv { return new op(left, opn, right); } / primlitsym;'+
2
454c0346f357 Added method call syntax and comparison operators
Mike Pavone <pavone@retrodev.com>
parents: 1
diff changeset
325 'primlitsym = hws val:(float / int / string / symbol / object / lambda / "(" expr:expr hws ")" { return expr; }) { return val; };' +
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
326 'symbol = chars:[a-zA-Z_!?@]+ trailing:(":"? [a-zA-Z_!?@0-9])* ! ":" { for (var i in trailing) { trailing[i] = trailing[i].join(""); } return new symbol(chars.join("") + trailing.join("")); };' +
5
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
327 'float = digits:[0-9]+ "." decimals:[0-9]+ { return new floatlit(parseFloat(digits.join("") + "." + decimals.join(""))); };' +
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
328 'int = digits:[0-9]+ { return new intlit(parseInt(digits.join(""), 10)); };' +
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
329 'string = "\\"" text:[^\\"]* "\\"" { return new strlit(text.join("")); };' +
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
330 'object = "#{" ws messages:assignment* "}" { return new object(messages); };' +
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
331 'assignment = hws sym:symbol hws "<-" expr:expr ws { return new assignment(sym, expr); }' +
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
332 'lambda = args:((& ":") argname+ )? "{" ws exprs:(assignment / expr)* "}" { return new lambda(args[1], exprs); };' +
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
333 'argname = init:":"? chars:[a-zA-Z_!?@]+ trailing:[a-zA-Z_!?@0-9]* hws { return new symbol(init + chars.join("") + trailing.join("")); };' +
ed5b563147ec Wrote constructors for AST objects
Mike Pavone <pavone@retrodev.com>
parents: 4
diff changeset
334 'funcall = hws parts: funcallpart+ { var fun = ""; var args = []; for (var i in parts) { fun += parts[i].name; args = args.concat(parts[i].args); } return new funcall(fun, args); };' +
2
454c0346f357 Added method call syntax and comparison operators
Mike Pavone <pavone@retrodev.com>
parents: 1
diff changeset
335 'funcallpart = fun:funpart args:opexpr* hws { return { name: fun, args: args}; };' +
454c0346f357 Added method call syntax and comparison operators
Mike Pavone <pavone@retrodev.com>
parents: 1
diff changeset
336 'funpart = chars:[a-zA-Z_!?@]+ middle:[a-zA-Z_!?@0-9]* ":" & [ \\t\\n\\r] { return chars.join("") + middle.join("") + ":"; };' +
454c0346f357 Added method call syntax and comparison operators
Mike Pavone <pavone@retrodev.com>
parents: 1
diff changeset
337 'methcall = receiver:opexpr hws info:methcallrest { info.receiver = receiver; return info; };' +
454c0346f357 Added method call syntax and comparison operators
Mike Pavone <pavone@retrodev.com>
parents: 1
diff changeset
338 'methcallrest = funcall / unarymeth;' +
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
339 'unarymeth = name:symbol { return new funcall(name.name, []); };';
0
3d1b8e96f5dc Initial commit
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
340 var parser = PEG.buildParser(grammar);
3d1b8e96f5dc Initial commit
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
341
3d1b8e96f5dc Initial commit
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
342 //var parser = PEG.buildParser('start = expr; expr = int; int = digits:[0-9]+ { return parseInt(digits.join(""), 10); }');
3d1b8e96f5dc Initial commit
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
343 onReady(function() {
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
344 q('#parse').onclick = function() {
0
3d1b8e96f5dc Initial commit
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
345 var text = q('textarea').value;
3d1b8e96f5dc Initial commit
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
346 try {
3d1b8e96f5dc Initial commit
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
347 var parsed = parser.parse(text);
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
348 q('pre').innerHTML = text + "\n\n" + JSON.stringify(parsed);
0
3d1b8e96f5dc Initial commit
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
349 console.log(parsed);
3d1b8e96f5dc Initial commit
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
350 } catch(e) {
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
351 q('pre').innerHTML = e.message + '\nLine: ' + e.line + '\nCol: ' + e.column;
0
3d1b8e96f5dc Initial commit
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
352 }
3d1b8e96f5dc Initial commit
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
353 }
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
354 q('#tojs').onclick = function() {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
355 var text = q('textarea').value;
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
356 //try {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
357 var parsed = parser.parse(text);
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
358 var js = parsed.toJSModule();
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
359 q('pre').innerHTML = js;
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
360 console.log(parsed);
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
361 /*} catch(e) {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
362 q('pre').innerHTML = e.message + '\nLine: ' + e.line + '\nCol: ' + e.column;
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
363 }*/
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
364 }
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
365 q('#run').onclick = function() {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
366 var text = q('textarea').value;
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
367 //try {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
368 var parsed = parser.parse(text);
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
369 var js = parsed.toJSModule();
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
370 mainModule = eval(js)();
7
8af72f11714e Initial version of FFI
Mike Pavone <pavone@retrodev.com>
parents: 6
diff changeset
371 q('pre').innerHTML = mainModule.main();
6
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
372 /*} catch(e) {
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
373 q('pre').innerHTML = e.message + '\nLine: ' + e.line + '\nCol: ' + e.column;
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
374 }*/
554602d4cbc6 Javascript compiler backend
Mike Pavone <pavone@retrodev.com>
parents: 5
diff changeset
375 }
0
3d1b8e96f5dc Initial commit
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
376 });
3d1b8e96f5dc Initial commit
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
377