コード例 #1
0
        public override void Add(string input)
        {
            if (IsSpecialKey(input))
            {
                HandleSpecialKey(input);

                return;
            }

            if (!Buffer.IsEmpty)
            {
                PushBuffer();
                TryEvaluate();
            }

            if (input == "(" || input == ")")
            {
                AddParentheses(input);
            }
            else if (OperatorConverter.IsUnary(input))
            {
                AddUnary(input);
            }
            else
            {
                AddBinary(input);
            }

            TryEvaluate();
        }
コード例 #2
0
        private static void GenerateUnaryExpression(ScriptGenerator generator, MemberSymbol symbol, UnaryExpression expression)
        {
            ScriptTextWriter writer = generator.Writer;

            PropertyExpression propExpression = expression.Operand as PropertyExpression;

            if ((propExpression != null) &&
                ((expression.Operator == Operator.PreIncrement) || (expression.Operator == Operator.PostIncrement) ||
                 (expression.Operator == Operator.PreDecrement) || (expression.Operator == Operator.PostDecrement)))
            {
                Debug.Assert(propExpression.Type == ExpressionType.PropertyGet);

                string fudgeOperator;

                GenerateExpression(generator, symbol, propExpression.ObjectReference);
                writer.Write(".set_");
                writer.Write(propExpression.Property.GeneratedName);
                writer.Write("(");
                GenerateExpression(generator, symbol, propExpression.ObjectReference);
                writer.Write(".get_");
                writer.Write(propExpression.Property.GeneratedName);
                writer.Write("()");
                if ((expression.Operator == Operator.PreIncrement) || (expression.Operator == Operator.PostIncrement))
                {
                    writer.WriteTrimmed(" + ");
                    fudgeOperator = " - ";
                }
                else
                {
                    writer.WriteTrimmed(" - ");
                    fudgeOperator = " + ";
                }
                writer.Write("1");
                writer.Write(")");

                if ((expression.Operator == Operator.PreIncrement) || (expression.Operator == Operator.PreDecrement))
                {
                    writer.WriteTrimmed(fudgeOperator);
                    writer.Write("1");
                }

                return;
            }

            if ((expression.Operator == Operator.PreIncrement) ||
                (expression.Operator == Operator.PreDecrement))
            {
                ExpressionGenerator.GenerateExpression(generator, symbol, expression.Operand);
                writer.Write(OperatorConverter.OperatorToString(expression.Operator));
            }
            else
            {
                writer.Write(OperatorConverter.OperatorToString(expression.Operator));
                ExpressionGenerator.GenerateExpression(generator, symbol, expression.Operand);
            }
        }
コード例 #3
0
        public void Setup()
        {
            var operators = new string[] { modulus, minus, power, log, factorial };
            var unarys    = new HashSet <string>()
            {
                log, factorial
            };

            converter = new OperatorConverter(operators, unarys);
        }
コード例 #4
0
 public void LoadCalculatorAsset()
 {
     InputBuffer       = new InputBuffer();
     Operators         = new OperatorLookup();
     UnitConverter     = new AngleConverter();
     OperatorConverter = new OperatorConverter(Operators.Operators, Operators.Unary);
     Parenthesizer     = new Parenthesizer(Operators.Precedence);
     ExpressionBuilder = new ExpressionBuilder(Parenthesizer);
     ExpressionParser  = new ExpressionParser(OperatorConverter);
     Evaluator         = new Evaluator(UnitConverter, OperatorConverter, Operators);
     MemoryStorage     = new MemoryStorage();
 }
コード例 #5
0
        public IEnumerable <KeyValuePair <string, string> > Execute()
        {
            log.Info(string.Format("Indexed scan operation for '{0}', filter: '{1}' {2} '{3}'.", tableName, filter.Column,
                                   OperatorConverter.ToComboString(filter.Operator).ToString(), filter.Value));

            switch (filter.Operator)
            {
            case Operator.Equal:
                var keys = index.Get(filter.Value);

                foreach (var key in keys)
                {
                    yield return(new KeyValuePair <string, string>(key, repository.Get(databaseFile, table.Name, key)));
                }
                break;

            case Operator.NotEqual:
                foreach (var row in GetNotEqual())
                {
                    yield return(row);
                }
                break;

            case Operator.Less:
                foreach (var row in GetLess())
                {
                    yield return(row);
                }
                break;

            case Operator.LessOrEqual:
                foreach (var row in GetLessOrEqual())
                {
                    yield return(row);
                }
                break;

            case Operator.Greater:
                foreach (var row in GetGreater())
                {
                    yield return(row);
                }
                break;

            case Operator.GreaterOrEqual:
                foreach (var row in GetGreaterOrEqual())
                {
                    yield return(row);
                }
                break;
            }
        }
コード例 #6
0
        private static void GenerateUnaryExpression(ScriptGenerator generator, MemberSymbol symbol, UnaryExpression expression)
        {
            ScriptTextWriter writer = generator.Writer;

            if ((expression.Operator == Operator.PreIncrement) ||
                (expression.Operator == Operator.PreDecrement))
            {
                ExpressionGenerator.GenerateExpression(generator, symbol, expression.Operand);
                writer.Write(OperatorConverter.OperatorToString(expression.Operator));
            }
            else
            {
                writer.Write(OperatorConverter.OperatorToString(expression.Operator));
                ExpressionGenerator.GenerateExpression(generator, symbol, expression.Operand);
            }
        }
コード例 #7
0
ファイル: MainForm.cs プロジェクト: pongraczlajos/pseudo-db
        private ICollection <Filter> GetFilters()
        {
            var filters = new List <Filter>();

            for (int i = 0; i < filterDataGridView.Rows.Count - 1; i++)
            {
                var tableName    = filterDataGridView.Rows[i].Cells[0].Value.ToString();
                var columnName   = filterDataGridView.Rows[i].Cells[1].Value.ToString();
                var operatorType = OperatorConverter.ToOperator(filterDataGridView.Rows[i].Cells[2].Value.ToString());
                var value        = filterDataGridView.Rows[i].Cells[3].Value.ToString();

                var filter = new Filter(tableName, columnName, operatorType, value);
                filters.Add(filter);
            }

            return(filters);
        }
コード例 #8
0
ファイル: MainForm.cs プロジェクト: pongraczlajos/pseudo-db
        private ICollection <Join> GetJoins()
        {
            var joins = new List <Join>();

            for (int i = 0; i < joinDataGridView.Rows.Count - 1; i++)
            {
                var leftTableName   = joinDataGridView.Rows[i].Cells[0].Value.ToString();
                var leftColumnName  = joinDataGridView.Rows[i].Cells[1].Value.ToString();
                var rightTableName  = joinDataGridView.Rows[i].Cells[2].Value.ToString();
                var rightColumnName = joinDataGridView.Rows[i].Cells[3].Value.ToString();
                var operatorType    = OperatorConverter.ToOperator(filterDataGridView.Rows[i].Cells[4].Value.ToString());

                var join = new Join(leftTableName, leftColumnName, rightTableName, rightColumnName, operatorType);
                joins.Add(join);
            }

            return(joins);
        }
コード例 #9
0
        public decimal Evaluate(INode node)
        {
            if (node == null)
            {
                return(0);
            }

            if (node.IsOperand)
            {
                return(node.Value);
            }

            return(Calculate(

                       OperatorConverter.ToOperator((int)node.Value),
                       Evaluate(node.Left),
                       Evaluate(node.Right)
                       ));
        }
コード例 #10
0
        private static void GenerateBinaryExpression(ScriptGenerator generator, MemberSymbol symbol,
                                                     BinaryExpression expression)
        {
            ScriptTextWriter writer = generator.Writer;

            if (expression.Operator == Operator.Equals)
            {
                if (expression.LeftOperand is PropertyExpression propExpression)
                {
                    Debug.Assert(propExpression.Type == ExpressionType.PropertySet);

                    if (propExpression.ObjectReference is BaseExpression)
                    {
                        ClassSymbol classSymbol = (ClassSymbol)symbol.Parent;
                        writer.Write($"{DSharpStringResources.ScriptExportMember("baseProperty")}(");
                        writer.Write(classSymbol.FullGeneratedName);
                        writer.Write(", '");
                        writer.Write(propExpression.Property.GeneratedName);
                        writer.Write("').set.call(");
                        writer.Write(generator.CurrentImplementation.ThisIdentifier);
                        writer.Write(", ");
                        GenerateExpression(generator, symbol, expression.RightOperand);
                        writer.Write(")");
                    }
                    else
                    {
                        GenerateExpression(generator, symbol, propExpression.ObjectReference);
                        writer.Write(".");
                        writer.Write(propExpression.Property.GeneratedName);
                        writer.Write(" = ");
                        GenerateExpression(generator, symbol, expression.RightOperand);
                    }

                    propExpression.Property.IncrementReferenceCount();
                    return;
                }

                if (expression.LeftOperand is IndexerExpression indexExpression)
                {
                    IndexerSymbol indexerSymbol = indexExpression.Indexer;

                    if (!indexerSymbol.UseScriptIndexer)
                    {
                        Debug.Assert(indexExpression.Type == ExpressionType.Indexer);

                        if (indexExpression.ObjectReference is BaseExpression objectReference)
                        {
                            writer.Write(objectReference.EvaluatedType.FullGeneratedName);
                            writer.Write(".prototype.set_");
                            writer.Write(indexerSymbol.GeneratedName);
                            writer.Write(".call(");
                            writer.Write(generator.CurrentImplementation.ThisIdentifier);
                            writer.Write(", ");
                            GenerateExpressionList(generator, symbol, indexExpression.Indices);
                            writer.Write(", ");
                            GenerateExpression(generator, symbol, expression.RightOperand);
                            writer.Write(")");
                        }
                        else
                        {
                            GenerateExpression(generator, symbol, indexExpression.ObjectReference);
                            writer.Write(".set_");
                            writer.Write(indexerSymbol.GeneratedName);
                            writer.Write("(");
                            GenerateExpressionList(generator, symbol, indexExpression.Indices);
                            writer.Write(", ");
                            GenerateExpression(generator, symbol, expression.RightOperand);
                            writer.Write(")");
                        }

                        indexExpression.Indexer.IncrementReferenceCount();
                        return;
                    }
                    else if (indexerSymbol.Parent is TypeSymbol typeSymbol && !typeSymbol.IsNativeArray)
                    {
                        writer.Write($"ss.setItem(");
                        GenerateExpression(generator, symbol, indexExpression.ObjectReference);
                        writer.Write(", ");
                        GenerateExpressionList(generator, symbol, indexExpression.Indices);
                        writer.Write(", ");
                        GenerateExpression(generator, symbol, expression.RightOperand);
                        writer.Write(")");

                        return;
                    }
                }
            }
            else if (expression.Operator == Operator.PlusEquals ||
                     expression.Operator == Operator.MinusEquals ||
                     expression.Operator == Operator.MultiplyEquals ||
                     expression.Operator == Operator.DivideEquals ||
                     expression.Operator == Operator.ModEquals ||
                     expression.Operator == Operator.BitwiseOrEquals ||
                     expression.Operator == Operator.BitwiseAndEquals ||
                     expression.Operator == Operator.BitwiseXorEquals ||
                     expression.Operator == Operator.ShiftLeftEquals ||
                     expression.Operator == Operator.ShiftRightEquals ||
                     expression.Operator == Operator.UnsignedShiftRightEquals)
            {
                if (expression.LeftOperand is PropertyExpression propExpression)
                {
                    Debug.Assert(propExpression.Type == ExpressionType.PropertyGet);

                    GenerateExpression(generator, symbol, propExpression.ObjectReference);
                    writer.Write(".");
                    writer.Write(propExpression.Property.GeneratedName);
                    writer.Write(" = ");
                    GenerateExpression(generator, symbol, propExpression.ObjectReference);
                    writer.Write(OperatorConverter.OperatorToString(expression.Operator - 1));
                    GenerateExpression(generator, symbol, expression.RightOperand);

                    propExpression.Property.IncrementReferenceCount();
                    return;
                }
            }
            else if (expression.Operator == Operator.Is ||
                     expression.Operator == Operator.As)
            {
                TypeExpression typeExpression = expression.RightOperand as TypeExpression;
                Debug.Assert(typeExpression != null);

                writer.Write(DSharpStringResources.ScriptExportMember(string.Empty));

                if (expression.Operator == Operator.Is)
                {
                    writer.Write("canCast(");
                }
                else
                {
                    writer.Write("safeCast(");
                }

                GenerateExpression(generator, symbol, expression.LeftOperand);

                writer.Write(", ");
                writer.Write(typeExpression.AssociatedType.FullGeneratedName);
                writer.Write(")");
                typeExpression.AssociatedType.IncrementReferenceCount();
                return;
            }
            else if (expression.Operator == Operator.EqualEqualEqual ||
                     expression.Operator == Operator.NotEqualEqual)
            {
                if (expression.RightOperand is LiteralExpression literalExpression)
                {
                    // Optimize generated script to perform loose equality checks for false-y values
                    // (null, false, 0, empty string)

                    // TODO: This should really be happening at compilation time, rather than generation
                    //       time. Because this is happening at generation time, we get something like
                    //       if (!!x) when if(x) would suffice just so we can get
                    //       foo(!!x) where foo is a method expecting a boolean.
                    //       Doing this at compilation time would allow handling if scenarios specially.

                    bool optimizable   = false;
                    bool checkForFalse = false;

                    if (literalExpression.Value is bool compareValue)
                    {
                        optimizable = true;

                        if (compareValue && expression.Operator == Operator.NotEqualEqual ||
                            !compareValue && expression.Operator == Operator.EqualEqualEqual)
                        {
                            checkForFalse = true;
                        }
                    }
                    else if (literalExpression.Value is int i && i == 0)
                    {
                        optimizable   = true;
                        checkForFalse = expression.Operator == Operator.EqualEqualEqual;
                    }
                    else if (literalExpression.Value is string s && s == string.Empty)
                    {
                        optimizable   = true;
                        checkForFalse = expression.Operator == Operator.EqualEqualEqual;
                    }

                    if (optimizable)
                    {
                        bool parenthesize = false;

                        writer.Write(checkForFalse ? "!" : "!!");

                        if (expression.LeftOperand.Parenthesized == false &&
                            (expression.LeftOperand.Type == ExpressionType.Binary ||
                             expression.LeftOperand.Type == ExpressionType.Conditional ||
                             expression.LeftOperand.Type == ExpressionType.InlineScript))
                        {
                            parenthesize = true;
                            writer.Write("(");
                        }

                        GenerateExpression(generator, symbol, expression.LeftOperand);

                        if (parenthesize)
                        {
                            writer.Write(")");
                        }

                        return;
                    }
                }
            }
コード例 #11
0
        private static void GenerateBinaryExpression(ScriptGenerator generator, MemberSymbol symbol, BinaryExpression expression)
        {
            ScriptTextWriter writer = generator.Writer;

            if (expression.Operator == Operator.Equals)
            {
                PropertyExpression propExpression = expression.LeftOperand as PropertyExpression;
                if (propExpression != null)
                {
                    Debug.Assert(propExpression.Type == ExpressionType.PropertySet);

                    if (propExpression.ObjectReference is BaseExpression)
                    {
                        Debug.Assert(symbol.Parent is ClassSymbol);

                        writer.Write(((ClassSymbol)symbol.Parent).FullGeneratedName);
                        writer.Write(".callBaseMethod(this, 'set_");
                        writer.Write(propExpression.Property.GeneratedName);
                        writer.Write("',");
                        writer.WriteTrimmed(" [ ");
                        GenerateExpression(generator, symbol, expression.RightOperand);
                        writer.WriteTrimmed(" ])");
                    }
                    else
                    {
                        GenerateExpression(generator, symbol, propExpression.ObjectReference);
                        writer.Write(".set_");
                        writer.Write(propExpression.Property.GeneratedName);
                        writer.Write("(");
                        GenerateExpression(generator, symbol, expression.RightOperand);
                        writer.Write(")");
                    }

                    return;
                }

                IndexerExpression indexExpression = expression.LeftOperand as IndexerExpression;
                if ((indexExpression != null) &&
                    !indexExpression.Indexer.IsIntrinsic)
                {
                    Debug.Assert(indexExpression.Type == ExpressionType.Indexer);

                    if (indexExpression.ObjectReference is BaseExpression)
                    {
                        Debug.Assert(symbol.Parent is ClassSymbol);

                        writer.Write(((ClassSymbol)symbol.Parent).FullGeneratedName);
                        writer.Write(".callBaseMethod(this, 'set_");
                        writer.Write(indexExpression.Indexer.GeneratedName);
                        writer.Write("',");
                        writer.WriteTrimmed(" [ ");
                        GenerateExpressionList(generator, symbol, indexExpression.Indices);
                        writer.WriteTrimmed(", ");
                        GenerateExpression(generator, symbol, expression.RightOperand);
                        writer.WriteTrimmed(" ])");
                    }
                    else
                    {
                        IndexerSymbol indexerSymbol = indexExpression.Indexer;

                        GenerateExpression(generator, symbol, indexExpression.ObjectReference);
                        writer.Write(".set_");
                        writer.Write(indexerSymbol.GeneratedName);
                        writer.Write("(");
                        GenerateExpressionList(generator, symbol, indexExpression.Indices);
                        writer.WriteTrimmed(", ");
                        GenerateExpression(generator, symbol, expression.RightOperand);
                        writer.Write(")");
                    }

                    return;
                }
            }
            else if ((expression.Operator == Operator.PlusEquals) ||
                     (expression.Operator == Operator.MinusEquals) ||
                     (expression.Operator == Operator.MultiplyEquals) ||
                     (expression.Operator == Operator.DivideEquals) ||
                     (expression.Operator == Operator.ModEquals) ||
                     (expression.Operator == Operator.BitwiseOrEquals) ||
                     (expression.Operator == Operator.BitwiseAndEquals) ||
                     (expression.Operator == Operator.BitwiseXorEquals) ||
                     (expression.Operator == Operator.ShiftLeftEquals) ||
                     (expression.Operator == Operator.ShiftRightEquals) ||
                     (expression.Operator == Operator.UnsignedShiftRightEquals))
            {
                PropertyExpression propExpression = expression.LeftOperand as PropertyExpression;
                if (propExpression != null)
                {
                    Debug.Assert(propExpression.Type == ExpressionType.PropertyGet);

                    GenerateExpression(generator, symbol, propExpression.ObjectReference);
                    writer.Write(".set_");
                    writer.Write(propExpression.Property.GeneratedName);
                    writer.Write("(");
                    GenerateExpression(generator, symbol, propExpression.ObjectReference);
                    writer.Write(".get_");
                    writer.Write(propExpression.Property.GeneratedName);
                    writer.WriteTrimmed("()");
                    writer.WriteTrimmed(OperatorConverter.OperatorToString(expression.Operator - 1));
                    GenerateExpression(generator, symbol, expression.RightOperand);
                    writer.Write(")");

                    return;
                }
            }
            else if ((expression.Operator == Operator.Is) ||
                     (expression.Operator == Operator.As))
            {
                TypeExpression typeExpression = expression.RightOperand as TypeExpression;
                Debug.Assert(typeExpression != null);

                writer.Write("Type.");
                if (expression.Operator == Operator.Is)
                {
                    writer.Write("canCast(");
                }
                else
                {
                    writer.Write("safeCast(");
                }

                GenerateExpression(generator, symbol, expression.LeftOperand);

                writer.WriteTrimmed(", ");
                writer.Write(typeExpression.AssociatedType.FullGeneratedName);
                writer.Write(")");

                return;
            }
            else if ((expression.Operator == Operator.EqualEqualEqual) ||
                     (expression.Operator == Operator.NotEqualEqual))
            {
                LiteralExpression literalExpression = expression.RightOperand as LiteralExpression;
                if (literalExpression != null)
                {
                    // Optimize generated script to perform loose equality checks for false-y values
                    // (null, false, 0, empty string)

                    // TODO: This should really be happening at compilation time, rather than generation
                    //       time. Because this is happening at generation time, we get something like
                    //       if (!!x) when if(x) would suffice just so we can get
                    //       foo(!!x) where foo is a method expecting a boolean.
                    //       Doing this at compilation time would allow handling if scenarios specially.

                    bool optimizable   = false;
                    bool checkForFalse = false;

                    if (literalExpression.Value is bool)
                    {
                        optimizable = true;

                        bool compareValue = (bool)literalExpression.Value;
                        if ((compareValue && (expression.Operator == Operator.NotEqualEqual)) ||
                            (!compareValue && (expression.Operator == Operator.EqualEqualEqual)))
                        {
                            checkForFalse = true;
                        }
                    }
                    else if ((literalExpression.Value is int) && (((int)literalExpression.Value) == 0))
                    {
                        optimizable   = true;
                        checkForFalse = (expression.Operator == Operator.EqualEqualEqual);
                    }
                    else if ((literalExpression.Value is string) && ((string)literalExpression.Value == String.Empty))
                    {
                        optimizable   = true;
                        checkForFalse = (expression.Operator == Operator.EqualEqualEqual);
                    }

                    if (optimizable)
                    {
                        bool parenthesize = false;

                        writer.Write(checkForFalse ? "!" : "!!");
                        if ((expression.LeftOperand.Parenthesized == false) &&
                            ((expression.LeftOperand.Type == ExpressionType.Binary) ||
                             (expression.LeftOperand.Type == ExpressionType.Conditional) ||
                             (expression.LeftOperand.Type == ExpressionType.InlineScript)))
                        {
                            parenthesize = true;
                            writer.Write("(");
                        }
                        GenerateExpression(generator, symbol, expression.LeftOperand);
                        if (parenthesize)
                        {
                            writer.Write(")");
                        }
                        return;
                    }
                }
            }

            GenerateExpression(generator, symbol, expression.LeftOperand);
            writer.WriteTrimmed(OperatorConverter.OperatorToString(expression.Operator));
            GenerateExpression(generator, symbol, expression.RightOperand);
        }
コード例 #12
0
        public IEnumerable <KeyValuePair <string, string> > Execute()
        {
            log.Info(string.Format("Filter operation for '{0}', filter: '{1}' {2} '{3}'.", filter.Table, filter.Column,
                                   OperatorConverter.ToComboString(filter.Operator).ToString(), filter.Value));

            // Determine where the filtered column is (is it part of the key, or is it part of the value).
            var primaryKey = KeyValue.Split(metadata.Key).ToArray();
            var columns    = KeyValue.Split(metadata.Value).ToArray();

            var filteredColumnInKey = primaryKey.Contains(filter.Column);
            int filteredColumnIndex = 0;

            if (filteredColumnInKey)
            {
                for (int i = 0; i < primaryKey.Count(); i++)
                {
                    if (filter.Column.Equals(primaryKey[i]))
                    {
                        filteredColumnIndex = i;
                        break;
                    }
                }
            }
            else
            {
                for (int i = 0; i < columns.Count(); i++)
                {
                    if (filter.Column.Equals(columns[i]))
                    {
                        filteredColumnIndex = i;
                        break;
                    }
                }
            }

            foreach (var row in Predecessor.Execute())
            {
                // Get the value of the column.
                var columnValue = string.Empty;

                if (filteredColumnInKey)
                {
                    columnValue = KeyValue.Split(row.Key).ToArray()[filteredColumnIndex];
                }
                else
                {
                    columnValue = KeyValue.Split(row.Value).ToArray()[filteredColumnIndex];
                }

                // Check if it satisfies the filter condition.
                int comparision = columnValue.CompareTo(filter.Value);

                switch (filter.Operator)
                {
                case Operator.Equal:
                    if (comparision == 0)
                    {
                        yield return(row);
                    }
                    break;

                case Operator.NotEqual:
                    if (comparision != 0)
                    {
                        yield return(row);
                    }
                    break;

                case Operator.Less:
                    if (comparision < 0)
                    {
                        yield return(row);
                    }
                    break;

                case Operator.Greater:
                    if (comparision > 0)
                    {
                        yield return(row);
                    }
                    break;

                case Operator.LessOrEqual:
                    if (comparision <= 0)
                    {
                        yield return(row);
                    }
                    break;

                case Operator.GreaterOrEqual:
                    if (comparision >= 0)
                    {
                        yield return(row);
                    }
                    break;
                }
            }
        }