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); } } }
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); }