Ejemplo n.º 1
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()));
            }
Ejemplo n.º 2
0
 /// <summary>
 /// Visit a parse tree produced by <see cref="OclParser.expression"/>.
 /// <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 VisitExpression([NotNull] OclParser.ExpressionContext context)
 {
     return(VisitChildren(context));
 }