示例#1
0
        private bool Iterate(int pos, OclParser.PropertyCallContext context)
        {
            if (((context.propertyCallParameters().declarator() == null) && (pos > 0)) || pos == context.propertyCallParameters().declarator().NAME().Length)
            {
                return(Interpreter.VisitExpression(context.propertyCallParameters().actualParameterList().expression()[0]));
            }

            var varStack = new Dictionary <string, Result>();

            Vars.Add(varStack);
            string key = "self";

            if (context.propertyCallParameters().declarator() != null)
            {
                key = context.propertyCallParameters().declarator().NAME()[pos].GetText();
            }

            foreach (var val in (CollectionResult)GlobalResult)
            {
                varStack[key] = val;
                if (!this.Iterate(pos + 1, context))
                {
                    Vars.RemoveAt(Vars.Count - 1);
                    return(false);
                }
            }

            Vars.RemoveAt(Vars.Count - 1);
            return(true);
        }
示例#2
0
        public override Result Process(OclParser.PropertyCallContext context)
        {
            var sourceString = (StringResult)GlobalResult;
            var concatString =
                (StringResult)Calculator.VisitExpression(context.propertyCallParameters().actualParameterList().expression()[0]);

            return(new StringResult(sourceString.GetValue() + concatString.GetValue()));
        }
示例#3
0
        public override Result Process(OclParser.PropertyCallContext context)
        {
            var start = (DoubleResult)Calculator.VisitExpression(
                context.propertyCallParameters().actualParameterList().expression()[0]);
            var end = (DoubleResult)Calculator.VisitExpression(
                context.propertyCallParameters().actualParameterList().expression()[1]);

            return(new StringResult(((StringResult)GlobalResult).GetValue().Substring((int)start.GetValue() - 1, (int)(end.GetValue() - start.GetValue() + 1))));
        }
示例#4
0
        public Result LaunchOperation(string name, OclParser.PropertyCallContext context)
        {
            foreach (var operation in this.operations)
            {
                if (operation.GetName() == name)
                {
                    return(operation.Process(context));
                }
            }

            return(null);
        }
示例#5
0
        public override Result Process(OclParser.PropertyCallContext context)
        {
            switch (GlobalResult)
            {
            case CollectionResult objects:
                return(new IntResult(objects.Count()));

            case StringResult s:
                return(new IntResult(s.GetValue().Length));
            }

            return(null);
        }
示例#6
0
        public override Result Process(OclParser.PropertyCallContext context)
        {
            CollectionResult newElements = (CollectionResult)GlobalResult;

            foreach (Result val in newElements.ToList())
            {
                GlobalResult = val;
                newElements.Remove(val);
                newElements.Add(Calculator.VisitExpression(context.propertyCallParameters().actualParameterList().expression()[0]));
            }

            return(newElements);
        }
示例#7
0
        public override Result Process(OclParser.PropertyCallContext context)
        {
            CollectionResult filteredElements = (CollectionResult)GlobalResult;

            Dictionary <string, Result> varsStack = new Dictionary <string, Result>();

            Vars.Add(varsStack);
            foreach (Result val in filteredElements.ToList())
            {
                varsStack["self"] = val;
                if (!Interpreter.VisitExpression(context.propertyCallParameters().actualParameterList().expression()[0]))
                {
                    filteredElements.Remove(val);
                }
            }

            Vars.RemoveAt(Vars.Count - 1);
            return(filteredElements);
        }
示例#8
0
        public override Result Process(OclParser.PropertyCallContext context)
        {
            var varStack = new Dictionary <string, Result>();

            Vars.Add(varStack);
            Result returnValue = null;

            foreach (var val in (CollectionResult)GlobalResult)
            {
                varStack["self"] = val;
                if (Interpreter.VisitExpression(context.propertyCallParameters().actualParameterList().expression()[0]))
                {
                    returnValue = val;
                    break;
                }
            }

            Vars.RemoveAt(Vars.Count - 1);
            return(returnValue);
        }
示例#9
0
        public override Result Process(OclParser.PropertyCallContext context)
        {
            var varStack = new Dictionary <string, Result>();

            Vars.Add(varStack);
            string key = "self";

            key = context.propertyCallParameters().declarator().NAME()[0].GetText();
            string accName     = context.propertyCallParameters().declarator().NAME()[1].GetText();
            Result accumulator = Calculator.VisitExpression(context.propertyCallParameters().declarator().expression());

            varStack[accName] = accumulator;
            foreach (var val in (CollectionResult)GlobalResult)
            {
                varStack[key]     = val;
                varStack[accName] = Calculator.VisitExpression(context.propertyCallParameters().actualParameterList().expression()[0]);
            }

            accumulator = varStack[accName];
            Vars.RemoveAt(Vars.Count - 1);
            return(accumulator);
        }
示例#10
0
 public override Result Process(OclParser.PropertyCallContext context)
 {
     return(new BoolResult(this.Iterate(0, context)));
 }
示例#11
0
        public override Result Process(OclParser.PropertyCallContext context)
        {
            IElement element = Model.FindElement(((StringResult)GlobalResult).GetValue());

            return(new CollectionResult(Model.Elements.Where(x => x.Class == element).ToList <object>()));
        }
示例#12
0
 public override Result Process(OclParser.PropertyCallContext context)
 {
     return(new IntResult(int.Parse(((StringResult)GlobalResult).GetValue())));
 }
示例#13
0
        public override Result Process(OclParser.PropertyCallContext context)
        {
            Result value = Calculator.VisitExpression(context.propertyCallParameters().actualParameterList().expression()[0]);

            return(new DoubleResult(Math.Max(((DoubleResult)GlobalResult).GetValue(), ((DoubleResult)value).GetValue())));
        }
示例#14
0
 /// <summary>
 /// Visit a parse tree produced by <see cref="OclParser.propertyCall"/>.
 /// <para>
 /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/>
 /// on <paramref name="context"/>.
 /// </para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 /// <return>The visitor result.</return>
 public virtual Result VisitPropertyCall([NotNull] OclParser.PropertyCallContext context)
 {
     return(VisitChildren(context));
 }
示例#15
0
 public override Result Process(OclParser.PropertyCallContext context)
 {
     return(new DoubleResult(Math.Floor(((DoubleResult)GlobalResult).GetValue())));
 }
示例#16
0
            public override Result VisitPropertyCall([NotNull] OclParser.PropertyCallContext context)
            {
                if (context.propertyCallParameters() != null)
                {
                    Result result = this.launcher.LaunchOperation(context.pathName().GetText(), context);
                    if (result != null)
                    {
                        return(result);
                    }

                    Dictionary <string, Result> stack = new Dictionary <string, Result>();
                    List <string> names = this.funcs[context.pathName().GetText()].Param;
                    OclParser.ExpressionContext contextFunc = this.funcs[context.pathName().GetText()].Context;
                    for (int i = 0; i < names.Count; i++)
                    {
                        stack[names[i]] = this.VisitExpression(context.propertyCallParameters().actualParameterList().expression()[i]);
                    }

                    this.vars.Add(stack);
                    result = this.VisitExpression(contextFunc);
                    this.vars.RemoveAt(this.vars.Count - 1);
                    return(result);
                }
                else if (context.Parent is OclParser.PostfixExpressionContext expressionContext)
                {
                    string element = expressionContext.primaryExpression().GetText();
                    if (element != "self")
                    {
                        this.Element = this.Model.FindElement(element);
                    }

                    var old = this.Element;
                    if (context.NUMBER() != null)
                    {
                        IElement parent = this.Element;
                        for (int i = 0; i < this.Depth - int.Parse(context.NUMBER().GetText()); i++)
                        {
                            parent = parent.Class;
                        }

                        this.Element = parent;
                    }

                    IAttribute attr = this.Element.Attributes.First(x => x.Name == context.pathName().GetText());
                    this.Element = old;

                    switch (attr.Kind)
                    {
                    case AttributeKind.Boolean:
                        return(new BoolResult(bool.Parse(attr.StringValue)));

                    case AttributeKind.String:
                        return(new StringResult(attr.StringValue));

                    case AttributeKind.Int:
                        return(new IntResult(int.Parse(attr.StringValue)));

                    case AttributeKind.Double:
                        return(new DoubleResult(double.Parse(attr.StringValue)));
                    }

                    return(new StringResult(this.Element.Attributes.First(x => x.Name == context.pathName().GetText()).StringValue));
                }

                return(this.VisitPathName(context.pathName()));
            }
示例#17
0
 public override Result Process(OclParser.PropertyCallContext context)
 {
     return(new StringResult(((StringResult)GlobalResult).GetValue().ToLower()));
 }