git @ Cat's Eye Technologies Exanoke / 49833fa
More passing tests, and I haven't even written the evaluator yet. catseye 12 years ago
2 changed file(s) with 37 addition(s) and 5 deletion(s). Raw diff Collapse all Expand all
216216 | def id(#)
217217 | woo
218218 | id(WOO)
219 ? Undefined argument 'woo'
219 ? Undefined argument "woo"
220220
221221 | def wat(#, woo)
222222 | woo(#)
223223 | wat(WOO)
224 ? Undefined function 'woo'
224 ? Undefined function "woo"
225
226 | def wat(#)
227 | THERE
228 | def wat(#)
229 | HI
230 | wat(WOO)
231 ? Function "wat" already defined
232
233 | def WAT(#)
234 | #
235 | WAT(WOO)
236 ? Expected identifier, but found atom ('WAT')
237
238 | def wat(meow)
239 | meow
240 | wat(WOO)
241 ? Expected '#', but found 'meow'
225242
226243 | def snd(#, another)
227244 | another
270287 | def double(#)
271288 | cons(#, #)
272289 | MEOW
273 ? Undefined function 'double'
290 ? Undefined function "double"
274291
275292 | def urff(#)
276293 | self(cons(#, #))
9696 def __init__(self, text):
9797 self.scanner = Scanner(text)
9898 self.defining = None
99 self.defined = set()
100 self.formals = None
99101
100102 def program(self):
101103 fundefs = []
114116 def fundef(self):
115117 self.scanner.expect('def')
116118 name = self.ident()
119 if name in self.defined:
120 raise SyntaxError('Function "%s" already defined' % name)
117121 args = []
118122 self.scanner.expect('(')
119123 self.scanner.expect('#')
124 self.formals = {}
125 i = 1
120126 while self.scanner.consume(','):
121 args.append(self.ident())
127 ident = self.ident()
128 args.append(ident)
129 self.formals[ident] = i
130 i += 1
122131 self.scanner.expect(')')
123132 self.defining = name
124133 expr = self.expr()
125134 self.defining = None
135 self.formals = None
136 self.defined.add(name)
126137 return AST('FunDef', [expr] + args, value=name)
127138
128139 def expr(self):
181192 self.scanner.scan()
182193 if self.scanner.on('('):
183194 self.scanner.expect('(')
195 if ident not in self.defined:
196 raise SyntaxError('Undefined function "%s"' % ident)
184197 args = [self.expr()]
185198 while self.scanner.consume(','):
186199 args.append(self.expr())
187200 self.scanner.expect(')')
188201 return AST('Call', args, value=ident)
189202 else:
190 return AST('ArgRef', value=ident)
203 if ident not in self.formals:
204 raise SyntaxError('Undefined argument "%s"' % ident)
205 return AST('ArgRef', value=self.formals[ident])
191206 else:
192207 return self.smaller()
193208