public void Visit(ASTMemberFunction functionDeclaration) { var _class = _environment.FindClass(functionDeclaration.BaseClass); if (_class == null) { throw new CompilerException($"Class '{functionDeclaration.BaseClass}' does not exist."); } var function = _class.FindFunction(functionDeclaration.Name); if (function == null) { throw new CompilerException($"Class '{functionDeclaration.BaseClass}' does not define function '{functionDeclaration.Name}'."); } for (int i = functionDeclaration.Arguments.Count - 1; i >= 0; i--) { function.Code.Write(OpCodeFactory.Set(ObjectFactory.String(functionDeclaration.Arguments[i]))); function.Code.Write(OpCodeFactory.Pop); } if (functionDeclaration.Body != null) { functionDeclaration.Body.Accept(this, function); // We add this in case the user explicitly doesn't return anything in which case the function is void. function.Code.Write(OpCodeFactory.Push(ObjectFactory.Null)); function.Code.Write(OpCodeFactory.Return); } }
private void CreateGeneralClasses() { // TODO: work on class implementation var table = new Class("table"); var func = new Function("count", new List <string> { "tname" }); func.Code.Write(OpCodeFactory.Set(ObjectFactory.String("tname"))); func.Code.Write(OpCodeFactory.Pop); func.Code.Write(OpCodeFactory.Reference(ObjectFactory.String("tname"))); func.Code.Write(OpCodeFactory.Return); table.AddFunction(func); var constructor = new Function("table", new List <string>()); constructor.Code.Write(OpCodeFactory.Push(ObjectFactory.Null)); constructor.Code.Write(OpCodeFactory.Return); table.AddFunction(constructor); _classes.Add(table); }
public void Visit(ASTGlobalFunction functionDeclaration) { var newFunction = ObjectFactory.Function(functionDeclaration.Name, functionDeclaration.Arguments); _environment.AddFunction(newFunction); for (int i = functionDeclaration.Arguments.Count - 1; i >= 0; i--) { newFunction.Code.Write(OpCodeFactory.Set(ObjectFactory.String(functionDeclaration.Arguments[i]))); newFunction.Code.Write(OpCodeFactory.Pop); } if (functionDeclaration.Body != null) { functionDeclaration.Body.Accept(this, newFunction); // We add this in case the user explicitly doesn't return anything in which case the function is void. newFunction.Code.Write(OpCodeFactory.Push(ObjectFactory.Null)); newFunction.Code.Write(OpCodeFactory.Return); } }