Example #1
0
        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}");
            }
        }