Esempio n. 1
0
        public PainMethod GetMethodDefinition(CodeLine line)
        {
            CodeLine trimmedLine = new CodeLine(line.TrimStart());

            // DEF: wykrycie definicji metody
            if (trimmedLine.Count > str_method.Length &&
                StringHelper.StrEquals(trimmedLine, str_method, true) &&
                Char.IsWhiteSpace(trimmedLine[str_method.Length]))
            {
                PainMethod method = new PainMethod();
                method.Depth = GetDepth(line) + 1; // zwiekszamy poziom metody

                IList <OnpMethodPart> methodParameters = MethodParser.
                                                         ExtractNames(trimmedLine.ToString().Substring(str_method.Length + 1), true);

                foreach (OnpMethodPart methodParameter in methodParameters)
                {
                    if (methodParameter.Part == EOnpMethodPart.METHOD_NAME)
                    {
                        method.Name = methodParameter.Code.ToUpper();
                    }
                    else if (methodParameter.Part == EOnpMethodPart.PARAMETER)
                    {
                        method.Parameters.Add(methodParameter.Code);
                    }
                }

                return(method);
            }
            return(null);
        }
        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);
                }
            }
        }
Esempio n. 3
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);
        }