/// <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) { }
/* 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); }
/// <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)); }