/// <summary>
 /// Exit a parse tree produced by <see cref="DDD_layout_scriptParser.assign_statement"/>.
 /// <para>The default implementation does nothing.</para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 public virtual void ExitAssign_statement([NotNull] DDD_layout_scriptParser.Assign_statementContext context)
 {
 }
Exemplo n.º 2
0
        /* assign_statement:       (simple_modifyable_exp EQ operation SEMI) |
         *              (simple_modifyable_exp other_binary_op operation SEMI);
         *
         */
        public override object VisitAssign_statement([NotNull] DDD_layout_scriptParser.Assign_statementContext context)
        {
            var toModify = context.simple_modifyable_exp();

            if (toModify.ID() != null)
            {
                string id = toModify.ID().GetText();

                Symbol  symbol = GetVariableByName(id);
                dynamic value  = GetVariableValueByName(id);
                if (value == null)
                {
                    alerts.Add(new error(context.Start.Line, $"Cannot assign to an undefined variable {id}"));
                    return(null);
                }
                if (symbol.Const && !(value is UnitializedObject))
                {
                    alerts.Add(new error(context.Start.Line, $"Left hand side refers to a constant expression {id}"));
                    return(null);
                }


                dynamic opValue = VisitOperation(context.operation());
                if (opValue is UnitializedObject)
                {
                    alerts.Add(new error(context.Start.Line, $"You cannot assign uninitialized varible to another one"));
                    return(null);
                }


                // az értéket teljesen felülírjuk
                if (context.EQ() != null)
                {
                    SetVariableValueByName(id, opValue, context);
                }
                // az értéket változtatjuk ( += v -= v *= v /= )
                else
                {
                    if (value is UnitializedObject)
                    {
                        alerts.Add(new error(context.Start.Line, $"You cannot use += -= *= /= on an uninitalized variable ({id})"));
                        return(null);
                    }

                    SetVariableValueByName(id, opValue, new OtherBinaryOperation(context.other_binary_op().GetText()), context);
                }
            }
            // vektor valamelyik koordinátájával csinálunk valamit.
            else
            {
                var    xyz     = toModify.modifiable_xyz();
                string xyzText = xyz.GetText();
                string id      = xyz.ID().GetText();

                Symbol  symbol = GetVariableByName(id);
                dynamic value  = GetVariableValueByName(id);

                if (value == null)
                {
                    alerts.Add(new error(context.Start.Line, $"Cannot assign to an undefined variable {id}"));
                    return(null);
                }
                if (symbol.Const && !(value is UnitializedObject))
                {
                    alerts.Add(new error(context.Start.Line, $"Left hand side refers to a constant expression {id}"));
                    return(null);
                }
                if (symbol.Type != "Vec3" && symbol.Type != "Unknown")
                {
                    alerts.Add(new error(context.Start.Line, "Cannot access coordinates of a non Vec3 type"));
                    return(null);
                }
                else if (value is UnitializedObject)
                {
                    alerts.Add(new error(context.Start.Line, "Accessing coordinates of an unitialized Vec3"));
                    return(null);
                }


                vec3    originalVec3 = (vec3)value;
                dynamic opValue      = VisitOperation(context.operation());

                if (!Assigner.CanAssign("Float", opValue))
                {
                    alerts.Add(new error(context.Start.Line, Assigner.ErrorMsg));
                    return(null);
                }

                if (xyzText.Contains(".x"))
                {
                    if (context.EQ() != null)
                    {
                        dynamic res = opValue;
                        originalVec3.x = res;
                        SetVariableValueByName(id, originalVec3, null);
                    }
                    else
                    {
                        OtherBinaryOperation obo = new OtherBinaryOperation(context.other_binary_op().GetText());
                        dynamic res = obo.Calculate(originalVec3.x, opValue);
                        originalVec3.x = res;
                        SetVariableValueByName(id, originalVec3, null);
                    }
                }
                else if (xyzText.Contains(".y"))
                {
                    if (context.EQ() != null)
                    {
                        dynamic res = opValue;
                        originalVec3.y = res;
                        SetVariableValueByName(id, originalVec3, null);
                    }
                    else
                    {
                        OtherBinaryOperation obo = new OtherBinaryOperation(context.other_binary_op().GetText());
                        dynamic res = obo.Calculate(originalVec3.y, opValue);
                        originalVec3.y = res;
                        SetVariableValueByName(id, originalVec3, null);
                    }
                }
                else if (xyzText.Contains(".z"))
                {
                    if (context.EQ() != null)
                    {
                        dynamic res = opValue;
                        originalVec3.z = res;
                        SetVariableValueByName(id, originalVec3, null);
                    }
                    else
                    {
                        OtherBinaryOperation obo = new OtherBinaryOperation(context.other_binary_op().GetText());
                        dynamic res = obo.Calculate(originalVec3.z, opValue);
                        originalVec3.z = res;
                        SetVariableValueByName(id, originalVec3, null);
                    }
                }
            }



            return(null);
        }
Exemplo n.º 3
0
 /// <summary>
 /// Visit a parse tree produced by <see cref="DDD_layout_scriptParser.assign_statement"/>.
 /// <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 VisitAssign_statement([NotNull] DDD_layout_scriptParser.Assign_statementContext context)
 {
     return(VisitChildren(context));
 }