Exemple #1
0
        private void CompileBranchWithStringCompare(TextWriter writer, string label, bool branchIfTrue)
        {
            if (LeftCompiler.IsLiteral && LeftCompiler.CanCompileBoolean && IsBooleanValue(LeftCompiler.Value))
            {
                CompileBranchForStringVariable(writer, RightCompiler, label, LeftCompiler.BooleanValue ^ (ParentExpression.Operator.Token == Token.NotEqualTo));
            }
            else if (RightCompiler.IsLiteral && RightCompiler.CanCompileBoolean && IsBooleanValue(RightCompiler.Value))
            {
                CompileBranchForStringVariable(writer, LeftCompiler, label, RightCompiler.BooleanValue ^ (ParentExpression.Operator.Token == Token.NotEqualTo));
            }
            else
            {
                using (var tempVariables = Context.UseTempVariables())
                {
                    string leftValue  = LeftCompiler.Compile(writer, tempVariables.CreateVariable(LeftCompiler.Type));
                    string rightValue = RightCompiler.Compile(writer, tempVariables.CreateVariable(RightCompiler.Type));

                    //IEV3Variable tempResultVariable = tempVariables.CreateVariable(EV3Type.String);
                    //writer.WriteLine($"    CALL EQ_STRING {leftValue} {rightValue} {tempResultVariable.Ev3Name}");
                    //writer.WriteLine($"    AND8888_32 {tempResultVariable.Ev3Name} -538976289 {tempResultVariable.Ev3Name}");
                    //writer.WriteLine($"    STRINGS COMPARE {tempResultVariable.Ev3Name} 'TRUE' {tempResultVariable.Ev3Name}");
                    //writer.WriteLine($"    JR_{GetOperationForJump(branchIfTrue)}8 {tempResultVariable.Ev3Name} 0 {label}");
                    IEV3Variable tempResultVariable = tempVariables.CreateVariable(EV3Type.Float);
                    writer.WriteLine($"    CALL EQ_STRING8 {leftValue} {rightValue} {tempResultVariable.Ev3Name}");
                    writer.WriteLine($"    JR_{GetOperationForJump(branchIfTrue)}8 {tempResultVariable.Ev3Name} 0 {label}");
                }
            }
        }
Exemple #2
0
 private void RemoveTempVariable(IEV3Variable variable)
 {
     if (variable is TempEV3Variable)
     {
         tempVariablesCurrent[variable.Type].Remove(((TempEV3Variable)variable).Id);
     }
 }
Exemple #3
0
        public override string Compile(TextWriter writer, IEV3Variable variable)
        {
            EV3SubDefinitionBase sub = Context.FindMethod(Value);

            if (sub != null)
            {
                return(CompileMethodCall(writer, variable, sub));
            }

            AddError($"Unknown method call to {ParentExpression.FullName()}");
            return("");
        }
        public override string Compile(TextWriter writer, IEV3Variable variable)
        {
            if (Type == EV3Type.StringArray && variable.Type == EV3Type.StringArray)
            {
                foreach (Match match in Regex.Matches(Value, @"([\d]+)=([^;']*)"))
                {
                    writer.WriteLine($"    CALL ARRAYSTORE_STRING {match.Groups[1].Value}.0 '{match.Groups[2].Value}' {variable.Ev3Name}");
                }
                return("");
            }

            return(Value);
        }
Exemple #5
0
 public override string Compile(TextWriter writer, IEV3Variable variable)
 {
     if (IsLiteral)
     {
         return(Value);
     }
     else
     {
         string expressionValue = ParentExpression.Expression.Compiler().Compile(writer, variable);
         writer.WriteLine($"    MATH NEGATE {expressionValue} {variable.Ev3Name}");
         return(variable.Ev3Name);
     }
 }
        public void CompileBranchForStringVariable(TextWriter writer, IExpressionCompiler valueCompiler, string label, bool negated)
        {
            if (CanCompileBoolean)
            {
                using (var tempVariables = Context.UseTempVariables())
                {
                    IEV3Variable tempResultVariable = tempVariables.CreateVariable(EV3Type.String);
                    IEV3Variable tempIsTrueVariable = tempVariables.CreateVariable(EV3Type.Float);
                    writer.WriteLine($"    CALL IS_TRUE {valueCompiler.Compile(writer, tempResultVariable)} {tempIsTrueVariable.Ev3Name}");
                    writer.WriteLine($"    JR_{(negated ? "EQ" : "NEQ")}8 {tempIsTrueVariable.Ev3Name} 0 {label}");

                    //writer.WriteLine($"    STRINGS DUPLICATE {Value} {tempResultVariable.Ev3Name}");
                    //writer.WriteLine($"    AND8888_32 {tempResultVariable.Ev3Name} -538976289 {tempResultVariable.Ev3Name}");
                    //writer.WriteLine($"    STRINGS COMPARE {tempResultVariable.Ev3Name} 'TRUE' {tempIsTrueVariable.Ev3Name}");
                    //writer.WriteLine($"    JR_EQ8 {tempIsTrueVariable.Ev3Name} 0 {label}");
                }
            }
        }
 public override string Compile(TextWriter writer, IEV3Variable variable)
 {
     using (var tempVariables = Context.UseTempVariables())
     {
         IExpressionCompiler indexCompiler = ParentExpression.Indexer.Compiler();
         string indexValue = indexCompiler.Compile(writer, tempVariables.CreateVariable(EV3Type.Float));
         if (variable.Ev3Name.Equals(Variable.Ev3Name, StringComparison.InvariantCultureIgnoreCase) ||
             variable.Type != Type.BaseType())
         {
             variable = tempVariables.CreateVariable(Type.BaseType());
         }
         if (variable.Type == EV3Type.String)
         {
             writer.WriteLine($"    CALL ARRAYGET_STRING {indexValue} {variable.Ev3Name} {Variable.Ev3Name}");
         }
         else
         {
             if (Context.DoBoundsCheck)
             {
                 writer.WriteLine($"    CALL ARRAYGET_FLOAT {indexValue} {variable.Ev3Name} {Variable.Ev3Name}");
             }
             else
             {
                 if (indexCompiler.IsLiteral)
                 {
                     if (indexValue.EndsWith(".0"))
                     {
                         indexValue = indexValue.Remove(indexValue.Length - 2);
                     }
                 }
                 else
                 {
                     writer.WriteLine($"    MOVEF_32 {indexValue} INDEX");
                     indexValue = "INDEX";
                 }
                 writer.WriteLine($"    ARRAY_READ {Variable.Ev3Name} {indexValue} {variable.Ev3Name}");
             }
         }
         return(variable.Ev3Name);
     }
 }
        public override string Compile(TextWriter writer, IEV3Variable variable)
        {
            EV3SubDefinitionBase sub = Context.FindMethod(Value);

            if (sub != null)
            {
                using (var tempVariables = Context.UseTempVariables())
                {
                    if (variable.Type.IsArray() && !sub.ReturnType.IsArray())
                    {
                        variable = tempVariables.CreateVariable(variable.Type.BaseType());
                    }
                    return(sub.Compile(writer, Context, new string[0], variable.Ev3Name));
                }
            }
            else
            {
                AddError($"Unknown property {ParentExpression.FullName()}");
            }

            return(variable.Ev3Name);
        }
Exemple #9
0
        private string CompileMethodCall(TextWriter writer, IEV3Variable variable, EV3SubDefinitionBase sub)
        {
            if (sub.ParameterTypes.Count != ParentExpression.Arguments.Count)
            {
                AddError($"Incorrect number of parameters. Expected {sub.ParameterTypes.Count}.");
                return("");
            }

            using (var tempVariables = Context.UseTempVariables())
            {
                string[] arguments = ParentExpression.Arguments
                                     .Select(a => a.Compiler())
                                     .Zip(sub.ParameterTypes, (c, t) => new { Compiler = c, Type = t })
                                     .Select(c => CompileWithConvert(writer, c.Compiler, c.Type, tempVariables)).ToArray();

                if (variable != null && variable.Type.IsArray() && !sub.ReturnType.IsArray())
                {
                    variable = tempVariables.CreateVariable(variable.Type.BaseType());
                }

                return(sub.Compile(writer, Context, arguments, variable?.Ev3Name));
            }
        }
        protected string CompileWithConvert(TextWriter writer, IExpressionCompiler compiler, EV3Type resultType, EV3Variables.TempVariableCreator tempVariables)
        {
            string value = compiler.Compile(writer, tempVariables.CreateVariable(compiler.Type));

            if (compiler.Type.BaseType().IsNumber() && resultType.BaseType() == EV3Type.String)
            {
                if (compiler.IsLiteral)
                {
                    return("'" + SmallBasicExtensions.FormatFloat(value) + "'");
                }
                else
                {
                    IEV3Variable outputVariable = tempVariables.CreateVariable(EV3Type.String);

                    writer.WriteLine($"    STRINGS VALUE_FORMATTED {value} '%g' 99 {outputVariable.Ev3Name}");

                    return(outputVariable.Ev3Name);
                }
            }
            else
            {
                return(value);
            }
        }
Exemple #11
0
 public override string Compile(TextWriter writer, IEV3Variable variable)
 {
     return("");
 }
        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 string Compile(TextWriter writer, IEV3Variable variable)
        {
            if (IsLiteral)
            {
                return(Value);
            }

            EV3Type commonType = CalculateCommonType(LeftCompiler.Type, RightCompiler.Type);

            if (commonType == EV3Type.Unknown)
            {
                AddError("Types of left and right side of expression don't match");
            }
            else
            {
                using (var tempVariables = Context.UseTempVariables())
                {
                    string leftValue  = CompileWithConvert(writer, LeftCompiler, commonType, tempVariables);
                    string rightValue = CompileWithConvert(writer, RightCompiler, commonType, tempVariables);

                    if (variable.Type.IsArray())
                    {
                        variable = tempVariables.CreateVariable(variable.Type.BaseType());
                    }

                    if (Type.IsNumber())
                    {
                        switch (ParentExpression.Operator.Token)
                        {
                        case Token.Addition:
                            writer.WriteLine($"    ADDF {leftValue} {rightValue} {variable.Ev3Name}");
                            break;

                        case Token.Subtraction:
                            writer.WriteLine($"    SUBF {leftValue} {rightValue} {variable.Ev3Name}");
                            break;

                        case Token.Division:
                            if (Context.DoDivisionCheck)
                            {
                                var sub = Context.FindMethod("Math.DivCheck");
                                if (variable.Type.IsArray() && !sub.ReturnType.IsArray())
                                {
                                    variable = tempVariables.CreateVariable(variable.Type.BaseType());
                                }
                                sub.Compile(writer, Context, new string[] { leftValue, rightValue }, variable.Ev3Name);
                            }
                            else
                            {
                                writer.WriteLine($"    DIVF {leftValue} {rightValue} {variable.Ev3Name}");
                            }
                            break;

                        case Token.Multiplication:
                            writer.WriteLine($"    MULF {leftValue} {rightValue} {variable.Ev3Name}");
                            break;
                        }
                    }
                    else if (ParentExpression.Operator.Token == Token.Addition)
                    {
                        writer.WriteLine($"    CALL TEXT.APPEND {leftValue} {rightValue} {variable.Ev3Name}");
                    }

                    return(variable.Ev3Name);
                }
            }
            return("");
        }
        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}");
            }
        }
 public abstract string Compile(TextWriter writer, IEV3Variable variable);