Esempio n. 1
0
def infer(bytecode, name=None):
	inputs = []
	surplus = []
	type_vars = {}
	
	for i,tok in enumerate(bytecode):
		if tok == 'if':
			if_block = bytecode[i-2]
			else_block = bytecode[i-1]
			decl = infer(if_block.bytecode)
			surplus.pop()
			surplus.pop()
			surplus.pop()
		elif vm.words.has_key(tok):
			decl = vm.words[tok][1:]
			if len(decl) == 0:
				decl = infer(vm.words[tok][0].bytecode)
		elif block(tok):
			decl = ((), ('block',))
		else:
			decl = [[], [typeof(tok),]]
		
		new_inputs, _, type_vars = match_types(list(decl[0]), surplus, tok)
		inputs.extend(new_inputs)
		surplus.extend(decl[1])
		inputs = replace(type_vars, inputs)
		surplus = replace(type_vars, surplus)
	return (tuple(inputs), tuple(surplus))
Esempio n. 2
0
def typecheck(tok, typecode):
	if vm.words.has_key(tok):
		inputs = list(vm.words[tok][1])
		products = list(vm.words[tok][2])
		
		if len(inputs) > len(typecode):
			raise CompileError("%s tok expects %s items on stack, %s given" % (tok, len(inputs), len(typecode)))
	
		match_types(inputs, typecode, tok)
		typecode.extend(products)
	else:
		typecode.append(typeof(tok))