public override void Compile(TextWriter writer, bool isRootStatement) { string label = Context.GetNextLabelNumber().ToString(); EV3Variable variable = Context.FindVariable(ParentStatement); if (variable.Type == EV3Type.Unknown) { variable.Type = EV3Type.Float; } variable.IsConstant = false; IExpressionCompiler stepCompiler = ParentStatement.StepValue == null ? null : ParentStatement.StepValue.Compiler(); using (var tempVariables = Context.UseTempVariables()) { string initialValue = ParentStatement.InitialValue.Compiler().Compile(writer, variable); if (initialValue != variable.Ev3Name) { writer.WriteLine($" MOVEF_F {initialValue} {variable.Ev3Name}"); } writer.WriteLine($" for{label}:"); string finalValue = ParentStatement.FinalValue.Compiler().Compile(writer, tempVariables.CreateVariable(EV3Type.Float)); if (stepCompiler == null || stepCompiler.IsLiteral) { if (stepCompiler is NegativeExpressionCompiler) { writer.WriteLine($" JR_LTF {variable.Ev3Name} {finalValue} endfor{label}"); } else { writer.WriteLine($" JR_GTF {variable.Ev3Name} {finalValue} endfor{label}"); } } else { string stepValue = stepCompiler.Compile(writer, tempVariables.CreateVariable(EV3Type.Float)); IEV3Variable tempStepResultVariable = tempVariables.CreateVariable(EV3Type.Float); writer.WriteLine($" CALL LE_STEP8 {variable.Ev3Name} {finalValue} {stepValue} {tempStepResultVariable.Ev3Name}"); writer.WriteLine($" JR_EQ8 {tempStepResultVariable.Ev3Name} 0 endfor{label}"); } } using (var tempVariables = Context.UseTempVariables()) { writer.WriteLine($" forbody{label}:"); ParentStatement.ForBody.Compile(writer, false); string stepValue = stepCompiler == null ? "1.0" : stepCompiler.Compile(writer, tempVariables.CreateVariable(EV3Type.Float)); writer.WriteLine($" ADDF {variable.Ev3Name} {stepValue} {variable.Ev3Name}"); string finalValue2 = ParentStatement.FinalValue.Compiler().Compile(writer, tempVariables.CreateVariable(EV3Type.Float)); if (stepCompiler == null || stepCompiler.IsLiteral) { if (stepCompiler is NegativeExpressionCompiler) { writer.WriteLine($" JR_GTEQF {variable.Ev3Name} {finalValue2} forbody{label}"); } else { writer.WriteLine($" JR_LTEQF {variable.Ev3Name} {finalValue2} forbody{label}"); } } else { IEV3Variable tempStepResultVariable = tempVariables.CreateVariable(EV3Type.Float); writer.WriteLine($" CALL LE_STEP8 {variable.Ev3Name} {finalValue2} {stepValue} {tempStepResultVariable.Ev3Name}"); writer.WriteLine($" JR_NEQ8 {tempStepResultVariable.Ev3Name} 0 forbody{label}"); } writer.WriteLine($" endfor{label}:"); } }
public override void Compile(TextWriter writer, bool isRootStatement) { IAssignmentExpressionCompiler variableCompiler = ParentStatement.LeftValue.Compiler <IAssignmentExpressionCompiler>(); if (variableCompiler != null) { EV3Variable variable = Context.FindVariable(variableCompiler.VariableName); IExpressionCompiler valueCompiler = ParentStatement.RightValue.Compiler(); if (variable.Type == EV3Type.Unknown) { variable.Type = valueCompiler.Type; if (variableCompiler.IsArray) { variable.Type = variable.Type.ConvertToArray(); } } variable.IsConstant &= isRootStatement && Context.DoOptimization && valueCompiler.IsLiteral && !variable.Type.IsArray(); if (variable.Type.IsArray()) { if (valueCompiler is IAssignmentExpressionCompiler) { variable.UpdateMaxIndex(((IAssignmentExpressionCompiler)valueCompiler).Index); } else if (valueCompiler is LiteralExpressionCompiler) { variable.UpdateMaxIndex(((LiteralExpressionCompiler)valueCompiler).MaxIndex); } } //Console.WriteLine($"valueCompiler.Type = {valueCompiler.Type}, variable.Type = {variable.Type}, variableCompiler.Type = {variableCompiler.Type}"); if (variableCompiler.Type.IsArray() && (valueCompiler.Type != variableCompiler.Type)) { AddError($"Cannot assign value to array variable '{variableCompiler.VariableName}' without index"); } else if (!variableCompiler.Type.IsArray() && valueCompiler.Type.IsArray()) { AddError($"Cannot assign array value to non-array variable '{variableCompiler.VariableName}'"); } else if (valueCompiler.Type == EV3Type.String && variableCompiler.Type.IsNumber()) { AddError($"Cannot assign {valueCompiler.Type} value to {variableCompiler.Type} variable '{variableCompiler.VariableName}'"); } else if (valueCompiler.Type.IsNumber() && variableCompiler.Type == EV3Type.String && !variable.Type.IsArray()) { if (variable.IsConstant) { variable.Value = valueCompiler.Value; } else { using (var tempVariables = Context.UseTempVariables()) { IEV3Variable tempVariable = tempVariables.CreateVariable(valueCompiler.Type); string compiledValue = valueCompiler.Compile(writer, tempVariable); if (string.IsNullOrEmpty(compiledValue)) { return; } writer.WriteLine($" STRINGS VALUE_FORMATTED {compiledValue} '%g' 99 {variable.Ev3Name}"); } } } else { if (variable.IsConstant) { variable.Value = valueCompiler.Value; } else { string compiledValue = valueCompiler.Compile(writer, variable); if (string.IsNullOrEmpty(compiledValue)) { return; } using (var tempVariables = Context.UseTempVariables()) { if (valueCompiler.Type.IsNumber() && variable.Type == EV3Type.StringArray) { IEV3Variable tempVariable = tempVariables.CreateVariable(EV3Type.String); writer.WriteLine($" STRINGS VALUE_FORMATTED {compiledValue} '%g' 99 {tempVariable.Ev3Name}"); compiledValue = tempVariable.Ev3Name; } variableCompiler.CompileAssignment(writer, compiledValue, variable.Ev3Name); } } } } else { AddError($"Cannot assign value to this expression {ParentStatement.LeftValue}"); } }