Example #1
0
        //////////////////////////////////////////////

        public static PainContext CreateContext(
            this PainProgram Program,
            IDictionary <String, Object> Values       = null,
            IDictionary <String, Object> StaticValues = null,
            Boolean BreakEveryLine = false,
            Boolean CopyParameters = false)
        {
            if (Values == null)
            {
                Values = new Dictionary <String, Object>();
            }

            foreach (PainMethod painMethod in Program.Methods)
            {
                Values[painMethod.Name] = painMethod;
            }

            foreach (PainClass painClass in Program.Classes)
            {
                Values[painClass.Name] = painClass;
            }

            return(CreateContext(
                       Program.Lines,
                       Values,
                       StaticValues,
                       BreakEveryLine,
                       CopyParameters));
        }
Example #2
0
        ////////////////////////////////////////////////////////////////////

        public static PainObject Exec(
            this PainProgram Program,
            IDictionary <String, Object> Parameters   = null,
            IDictionary <String, Object> StaticValues = null)
        {
            using (PainContext context = CreateContext(Program, Parameters, StaticValues, false))
            {
                return(Exec(context));
            }
        }
Example #3
0
 public static Object EvalStep(
     this PainProgram Program,
     IDictionary <String, Object> Parameters   = null,
     IDictionary <String, Object> StaticValues = null)
 {
     using (PainContext context = CreateContext(Program, Parameters, StaticValues, true))
     {
         return(Eval(context));
     }
 }
        public static Boolean EvaluateMethod(
            Object Object,
            Object MethodObject,
            IList <Object> Parameters,
            PainContext PainContext)
        {
            if (MethodObject is PainMethod)
            {
                if (Parameters == null)
                {
                    Parameters = new Object[0];
                }

                PainMethod      method      = (PainMethod)MethodObject;
                PainContextType contextType = PainContextType.METHOD;

                // jesli tworzenie klasy (wolanie konstruktora)
                if (MethodObject is PainClass)
                {
                    contextType = PainContextType.CLASS;
                }

                PainState newContext = PainContext.
                                       PushContext(method, contextType, Parameters);

                newContext.Object.ParentObject = method.ParentObject;

                return(true);
            }
            else if (MethodObject is PainProgram)
            {
                PainProgram program = (PainProgram)MethodObject;

                IDictionary <String, Object> currentValues = (PainContext == null || PainContext.CurrentState == null || PainContext.CurrentState.Object == null ?
                                                              null :
                                                              PainContext.
                                                              CurrentState.
                                                              Object.
                                                              DynamicValues);

                IDictionary <String, Object> currentStaticValues = (PainContext == null || PainContext.CurrentState == null || PainContext.CurrentState.Object == null ?
                                                                    null :
                                                                    PainContext.
                                                                    CurrentState.
                                                                    Object.
                                                                    StaticValues);

                PainState newState = PainContext.PushContext(
                    program,
                    PainContextType.METHOD,
                    null);

                if (currentValues != null)
                {
                    foreach (String key in currentValues.Keys)
                    {
                        newState.Object.DynamicValues[key] = currentValues[key];
                    }
                }
                newState.Object.StaticValues = currentStaticValues;

                return(true);
            }
            else
            {
                ExpressionMethodResult methodResult = EvaluateInlineMethod(
                    Object,
                    MethodObject,
                    Parameters,
                    PainContext);

                if (methodResult != null &&
                    methodResult.NewContextCreated)
                {
                    return(true);
                }
                else
                {
                    var v = methodResult == null ? null : methodResult.Value;
                    PainContext.CurrentExpressionState.PushValue(v);
                    return(false);
                }
            }
        }
Example #5
0
        public PainProgram Compile(IList <Char> Code)
        {
            CodeLines lines = GetLines(Code);

            PainProgram        mainProgram = new PainProgram();
            List <PainProgram> methodStack = new List <PainProgram>();

            methodStack.Push(mainProgram);

            foreach (CodeLine line in lines)
            {
                Int32 currentDepth = -1;

                PainMethod method = null;
                method = GetMethodDefinition(line);
                if (method != null)
                {
                    currentDepth = method.Depth;
                }

                PainClass classDefinition = null;
                if (method == null)
                {
                    classDefinition = GetClassDefinition(line);
                    if (classDefinition != null)
                    {
                        currentDepth = classDefinition.Depth;
                    }
                }

                PainCodeLine codeLine = null;
                if (method == null && classDefinition == null)
                {
                    codeLine = GetCodeLine(line);
                    if (codeLine != null)
                    {
                        currentDepth = codeLine.Depth;
                    }
                }

                PainProgram currentMethod = methodStack.Peek();
                if (codeLine == null || !codeLine.IsLineEmpty)
                {
                    while (currentDepth < currentMethod.Depth ||
                           (currentDepth == currentMethod.Depth && classDefinition != null && classDefinition != currentMethod) ||
                           (currentDepth == currentMethod.Depth && method != null && method != currentMethod))
                    {
                        methodStack.Pop();
                        currentMethod = methodStack.Peek();
                    }
                }

                if (method != null)
                {
                    currentMethod.Methods.Remove_by_Name(method.Name);
                    currentMethod.Methods.Add(method);
                    methodStack.Push(method);
                    continue;
                }

                if (classDefinition != null)
                {
                    currentMethod.Classes.Remove_by_Name(classDefinition.Name);
                    currentMethod.Classes.Add(classDefinition);
                    methodStack.Push(classDefinition);
                    continue;
                }

                if (codeLine != null)
                {
                    if (codeLine.IsLineEmpty == false)
                    {
                        currentMethod.Lines.Add(codeLine);
                    }
                }
            }

            return(mainProgram);
        }