private ExpressionNode ParseRelationalExpression()
        {
            var left = ParseAdditiveExpression();

            while (IsOperator('<') || IsOperator('>') || IsOperator('L') || IsOperator('G'))
            {
                var o = (Operator)Token;

                NextToken();

                switch (o.Value)
                {
                case '<':
                    left = new LessThan(left, ParseAdditiveExpression());
                    break;

                case '>':
                    left = new GreaterThan(left, ParseAdditiveExpression());
                    break;

                case 'L':
                    left = new LessEqual(left, ParseAdditiveExpression());
                    break;

                case 'G':
                    left = new GreaterEqual(left, ParseAdditiveExpression());
                    break;
                }
            }

            return(left);
        }
Esempio n. 2
0
 public void Visit(GreaterEqual n)
 {
     Helpers.Write("(");
     n.LeftExpression.Accept(this);
     Helpers.Write(" >= ");
     n.RightExpression.Accept(this);
     Helpers.Write(")");
 }
Esempio n. 3
0
        public override void VisitGreaterEqual(GreaterEqual n)
        {
            SetupOperands(n);
            //check eq
            _gen.Emit(OpCodes.Ceq);

            SetupOperands(n);
            //check gt
            _gen.Emit(OpCodes.Cgt);

            //or them
            _gen.Emit(OpCodes.Or);

            _lastWalkedType = typeof(bool);
        }
        public string Visit(GreaterEqual node)
        {
            var result = "";

            result += "\t\tldc.i4 42\n";
            result += Visit((dynamic)node[0]);
            result += Visit((dynamic)node[1]);
            var labelSuccess = GenerateLabel();

            result += "\t\tbge " + labelSuccess + "\n";
            result += "\t\tpop\n";
            result += "\t\tldc.i4 0\n";
            result += "\t\t" + labelSuccess + ":\n";
            return(result);
        }
        public void Visit(GreaterEqual n)
        {
            Helpers.WriteLine($"{_tab}{n.Text} [{n.Location.StartLine}, {n.Location.StartColumn}]");
            Tab();

            Helpers.WriteLine($"{_tab}Left");
            Tab();
            n.LeftExpression.Accept(this);
            Untab();
            Helpers.WriteLine($"{_tab}Right");
            Tab();
            n.RightExpression.Accept(this);
            Untab();

            Untab();
        }
Esempio n. 6
0
        public void Visit(GreaterEqual n)
        {
            Globals.Builder.Start($"greater equal (>=) [{n.Location.StartLine}, {n.Location.StartColumn}]");

            WriteBinaryExpression("cmp", n.LeftExpression, n.RightExpression);

            var labelFalse = $"greaterEqualFalse{Globals.Builder.Count()}";
            var labelEnd   = $"greaterEqualEnd{Globals.Builder.Count()}";

            Globals.Builder.WriteUnaryOp("jnge", labelFalse);
            Globals.Builder.WriteBinaryOp("mov", "rax", 1.ToString());
            Globals.Builder.WriteUnaryOp("jmp", labelEnd);
            Globals.Builder.WriteLabel(labelFalse);
            Globals.Builder.WriteBinaryOp("mov", "rax", 0.ToString());
            Globals.Builder.WriteLabel(labelEnd);

            Globals.Builder.End($"greater equal (>=) [{n.Location.EndLine}, {n.Location.EndColumn}]");
        }
Esempio n. 7
0
        private static Operator GetOperator(char[] sql, int beginIndex, int endIndex)
        {
            char c;

            Operator op1 = null;
            Operator op2 = null;

            for (int i = beginIndex; i < endIndex;)
            {
                c = sql[i];

                if (c == '+')
                {
                    op2 = new Add(sql, i, i);
                    i++;
                }
                else if (c == '-')
                {
                    op2 = new Sub(sql, i, i);
                    i++;
                }
                else if (c == '*')
                {
                    op2 = new Multi(sql, i, i);
                    i++;
                }
                else if (c == '/')
                {
                    op2 = new Div(sql, i, i);
                    i++;
                }
                else if (
                    (i + 2 <= endIndex)
                    &&
                    (c == 'a' && sql[i + 1] == 'n' && sql[i + 2] == 'd')
                    &&
                    (i == beginIndex || StrUtil.IsOneOf(sql[i - 1], Parser._whiteSpaces))
                    &&
                    (i + 2 == endIndex || i + 3 <= endIndex && StrUtil.IsOneOf(sql[i + 3], Parser._whiteSpaces))
                    )
                {
                    op2 = new And(sql, i, i + 2);
                    i   = i + 3;
                }
                else if (
                    (i + 1 <= endIndex)
                    &&
                    (c == 'o' && sql[i + 1] == 'r')
                    &&
                    (i == beginIndex || StrUtil.IsOneOf(sql[i - 1], Parser._whiteSpaces))
                    &&
                    (i + 1 == endIndex || i + 2 <= endIndex && StrUtil.IsOneOf(sql[i + 2], Parser._whiteSpaces))
                    )
                {
                    op2 = new Or(sql, i, i + 1);
                    i   = i + 2;
                }
                else if (
                    (i + 2 <= endIndex)
                    &&
                    (c == 'n' && sql[i + 1] == 'o' && sql[i + 2] == 't')
                    &&
                    (i == beginIndex || StrUtil.IsOneOf(sql[i - 1], Parser._whiteSpaces))
                    &&
                    (i + 2 == endIndex || i + 3 <= endIndex && StrUtil.IsOneOf(sql[i + 3], Parser._whiteSpaces))
                    )
                {
                    op2 = new Not(sql, i, i + 2);
                    i   = i + 3;
                }
                else if (
                    (i + 1 <= endIndex)
                    &&
                    (c == '>' && sql[i + 1] == '=')
                    )
                {
                    op2 = new GreaterEqual(sql, i, i + 1);
                    i   = i + 2;
                }
                else if (
                    (i + 1 <= endIndex)
                    &&
                    (c == '<' && sql[i + 1] == '=')
                    )
                {
                    op2 = new LessEqual(sql, i, i + 1);
                    i   = i + 2;
                }
                else if (
                    (i + 1 <= endIndex)
                    &&
                    (c == '!' && sql[i + 1] == '=')
                    )
                {
                    op2 = new NotEqual(sql, i, i + 1);
                    i   = i + 2;
                }
                else if (c == '=')
                {
                    op2 = new Equal(sql, i, i);
                    i++;
                }
                else if (c == '>')
                {
                    op2 = new Greater(sql, i, i);
                    i++;
                }
                else if (c == '<')
                {
                    op2 = new Less(sql, i, i);
                    i++;
                }
                else
                {
                    i++;
                }



                if (op1 == null)
                {
                    if (op2 != null)
                    {
                        op1 = op2;
                    }
                }
                //  对于 Priority(优先级) 相同 的 运算符,取 最左边 的 ,  这是 为了 适应  Not(非) 运算符 的 特性
                //  Not 运算符 是 一元运算符 。 其它 运算符 都是 二元运算符 , 从左往右 结合 和 从右往左 结合 都一样
                //  但 Not 运算符 只能 从左往右 结合, 因为 从右往左 结合 会 找不到 操作数
                //  从 编程 的 角度 来 看, 从左往右 的 思路 也 比较 顺
                //  但 等价性 上来看, 我们 人类 的 计算习惯 是 从左到右, 而 这个 计算顺序 对应在 计算机 里 是 从右往左 结合运算符
                //  计算机 从右往左 结合运算符 之后 执行计算 的 顺序 就是 从左到右
                //  而 从左往右 结合运算符 的 执行计算顺序 是 从右到左
                //  但 不管 计算顺序 是 从左到右 还是 从右到左, 结果 都一样
                //  综上, 从 编程 的 角度 考虑, 我们选择 了 从左到右 结合 运算符, 执行计算 的 顺序 就是 从右到左
                else if (op2 != null && op2.Priority < op1.Priority)
                {
                    op1 = op2;
                }

                //if (c == '+')
                //    return new Add(sql, i, i);
                //else if (c == '-')
                //    return new Sub(sql, i, i);
                //else if (c == '*')
                //    return new Multi(sql, i, i);
                //else if (c == '/')
                //    return new Div(sql, i, i);
                //else if (c == 'a' && sql[i + 1] == 'n' && sql[i + 2] == 'd')
                //    return new And(sql, i, i + 2);
                //else if (c == 'o' && sql[i + 1] == 'r')
                //    return new Or(sql, i, i + 1);
                //else if (c == 'n' && sql[i + 1] == 'o' && sql[i + 1] == 't')
                //    return new Not(sql, i, i + 2);
                //else if (c == '=')
                //    return new Equal(sql, i, i + 1);
                //else if (c == '>')
                //    return new Greater(sql, i, i);
                //else if (c == '<')
                //    return new Less(sql, i, i);
                //else if (c == '>' && sql[i + 1] == '=')
                //    return new GreaterEqual(sql, i, i + 1);
                //else if (c == '<' && sql[i + 1] == '=')
                //    return new LessEqual(sql, i, i + 1);
                //else if (c == '!' && sql[i + 1] == '=')
                //    return new NotEqual(sql, i, i + 1);
            }

            return(op1);
            //return null;
        }
        /**
         * Parses the sublist of tokens.  In most cases this will equate to
         * the full list
         *
         * @param len the length of the subexpression to parse
         * @exception FormulaException
         */
        private void parseSubExpression(int len)
        {
            int tokenVal = 0;
            Token t = null;

            // Indicates that we are parsing the incredibly complicated and
            // hacky if construct that MS saw fit to include, the gits
            Stack<ParseItem> ifStack = new Stack<ParseItem>();

            // The end position of the sub-expression
            int endpos = pos + len;

            while (pos < endpos)
                {
                tokenVal = tokenData[pos];
                pos++;

                t = Token.getToken(tokenVal);

                if (t == Token.UNKNOWN)
                    {
                    throw new FormulaException
                      (FormulaException.UNRECOGNIZED_TOKEN,tokenVal);
                    }

                Assert.verify(t != Token.UNKNOWN);

                // Operands
                if (t == Token.REF)
                    {
                    CellReference cr = new CellReference(relativeTo);
                    pos += cr.read(tokenData,pos);
                    tokenStack.Push(cr);
                    }
                else if (t == Token.REFERR)
                    {
                    CellReferenceError cr = new CellReferenceError();
                    pos += cr.read(tokenData,pos);
                    tokenStack.Push(cr);
                    }
                else if (t == Token.ERR)
                    {
                    ErrorConstant ec = new ErrorConstant();
                    pos += ec.read(tokenData,pos);
                    tokenStack.Push(ec);
                    }
                else if (t == Token.REFV)
                    {
                    SharedFormulaCellReference cr =
                      new SharedFormulaCellReference(relativeTo);
                    pos += cr.read(tokenData,pos);
                    tokenStack.Push(cr);
                    }
                else if (t == Token.REF3D)
                    {
                    CellReference3d cr = new CellReference3d(relativeTo,workbook);
                    pos += cr.read(tokenData,pos);
                    tokenStack.Push(cr);
                    }
                else if (t == Token.AREA)
                    {
                    Area a = new Area();
                    pos += a.read(tokenData,pos);
                    tokenStack.Push(a);
                    }
                else if (t == Token.AREAV)
                    {
                    SharedFormulaArea a = new SharedFormulaArea(relativeTo);
                    pos += a.read(tokenData,pos);
                    tokenStack.Push(a);
                    }
                else if (t == Token.AREA3D)
                    {
                    Area3d a = new Area3d(workbook);
                    pos += a.read(tokenData,pos);
                    tokenStack.Push(a);
                    }
                else if (t == Token.NAME)
                    {
                    Name n = new Name();
                    pos += n.read(tokenData,pos);
                    n.setParseContext(parseContext);
                    tokenStack.Push(n);
                    }
                else if (t == Token.NAMED_RANGE)
                    {
                    NameRange nr = new NameRange(nameTable);
                    pos += nr.read(tokenData,pos);
                    nr.setParseContext(parseContext);
                    tokenStack.Push(nr);
                    }
                else if (t == Token.INTEGER)
                    {
                    IntegerValue i = new IntegerValue();
                    pos += i.read(tokenData,pos);
                    tokenStack.Push(i);
                    }
                else if (t == Token.DOUBLE)
                    {
                    DoubleValue d = new DoubleValue();
                    pos += d.read(tokenData,pos);
                    tokenStack.Push(d);
                    }
                else if (t == Token.BOOL)
                    {
                    BooleanValue bv = new BooleanValue();
                    pos += bv.read(tokenData,pos);
                    tokenStack.Push(bv);
                    }
                else if (t == Token.STRING)
                    {
                    StringValue sv = new StringValue(settings);
                    pos += sv.read(tokenData,pos);
                    tokenStack.Push(sv);
                    }
                else if (t == Token.MISSING_ARG)
                    {
                    MissingArg ma = new MissingArg();
                    pos += ma.read(tokenData,pos);
                    tokenStack.Push(ma);
                    }

                  // Unary Operators
                else if (t == Token.UNARY_PLUS)
                    {
                    UnaryPlus up = new UnaryPlus();
                    pos += up.read(tokenData,pos);
                    addOperator(up);
                    }
                else if (t == Token.UNARY_MINUS)
                    {
                    UnaryMinus um = new UnaryMinus();
                    pos += um.read(tokenData,pos);
                    addOperator(um);
                    }
                else if (t == Token.PERCENT)
                    {
                    Percent p = new Percent();
                    pos += p.read(tokenData,pos);
                    addOperator(p);
                    }

                  // Binary Operators
                else if (t == Token.SUBTRACT)
                    {
                    Subtract s = new Subtract();
                    pos += s.read(tokenData,pos);
                    addOperator(s);
                    }
                else if (t == Token.ADD)
                    {
                    Add s = new Add();
                    pos += s.read(tokenData,pos);
                    addOperator(s);
                    }
                else if (t == Token.MULTIPLY)
                    {
                    Multiply s = new Multiply();
                    pos += s.read(tokenData,pos);
                    addOperator(s);
                    }
                else if (t == Token.DIVIDE)
                    {
                    Divide s = new Divide();
                    pos += s.read(tokenData,pos);
                    addOperator(s);
                    }
                else if (t == Token.CONCAT)
                    {
                    Concatenate c = new Concatenate();
                    pos += c.read(tokenData,pos);
                    addOperator(c);
                    }
                else if (t == Token.POWER)
                    {
                    Power p = new Power();
                    pos += p.read(tokenData,pos);
                    addOperator(p);
                    }
                else if (t == Token.LESS_THAN)
                    {
                    LessThan lt = new LessThan();
                    pos += lt.read(tokenData,pos);
                    addOperator(lt);
                    }
                else if (t == Token.LESS_EQUAL)
                    {
                    LessEqual lte = new LessEqual();
                    pos += lte.read(tokenData,pos);
                    addOperator(lte);
                    }
                else if (t == Token.GREATER_THAN)
                    {
                    GreaterThan gt = new GreaterThan();
                    pos += gt.read(tokenData,pos);
                    addOperator(gt);
                    }
                else if (t == Token.GREATER_EQUAL)
                    {
                    GreaterEqual gte = new GreaterEqual();
                    pos += gte.read(tokenData,pos);
                    addOperator(gte);
                    }
                else if (t == Token.NOT_EQUAL)
                    {
                    NotEqual ne = new NotEqual();
                    pos += ne.read(tokenData,pos);
                    addOperator(ne);
                    }
                else if (t == Token.EQUAL)
                    {
                    Equal e = new Equal();
                    pos += e.read(tokenData,pos);
                    addOperator(e);
                    }
                else if (t == Token.PARENTHESIS)
                    {
                    Parenthesis p = new Parenthesis();
                    pos += p.read(tokenData,pos);
                    addOperator(p);
                    }

                  // Functions
                else if (t == Token.ATTRIBUTE)
                    {
                    Attribute a = new Attribute(settings);
                    pos += a.read(tokenData,pos);

                    if (a.isSum())
                        addOperator(a);
                    else if (a.isIf())
                        {
                        // Add it to a special stack for ifs
                        ifStack.Push(a);
                        }
                    }
                else if (t == Token.FUNCTION)
                    {
                    BuiltInFunction bif = new BuiltInFunction(settings);
                    pos += bif.read(tokenData,pos);

                    addOperator(bif);
                    }
                else if (t == Token.FUNCTIONVARARG)
                    {
                    VariableArgFunction vaf = new VariableArgFunction(settings);
                    pos += vaf.read(tokenData,pos);

                    if (vaf.getFunction() != Function.ATTRIBUTE)
                        addOperator(vaf);
                    else
                        {
                        // This is part of an IF function.  Get the operands, but then
                        // add it to the top of the if stack
                        vaf.getOperands(tokenStack);

                        Attribute ifattr = null;
                        if (ifStack.Count == 0)
                            ifattr = new Attribute(settings);
                        else
                            ifattr = (Attribute)ifStack.Pop();

                        ifattr.setIfConditions(vaf);
                        tokenStack.Push(ifattr);
                        }
                    }

                    // Other things
                else if (t == Token.MEM_FUNC)
                    {
                    MemFunc memFunc = new MemFunc();
                    handleMemoryFunction(memFunc);
                    }
                else if (t == Token.MEM_AREA)
                    {
                    MemArea memArea = new MemArea();
                    handleMemoryFunction(memArea);
                    }
                }
        }
Esempio n. 9
0
 public virtual void VisitGreaterEqual(GreaterEqual n)
 {
 }
 public SemanticAtom Visit(GreaterEqual n)
 {
     n.LeftExpression.Accept(this);
     n.RightExpression.Accept(this);
     return(null);
 }
Esempio n. 11
0
 public virtual void VisitGreaterEqual(GreaterEqual n)
 {
 }
 public SemanticAtom Visit(GreaterEqual n)
 {
     n.RealizedType = BinaryExpressionHelper(n, Primitive.Int, ">=", Primitive.Boolean);
     return(n.RealizedType);
 }
 public void Visit(GreaterEqual node)
 {
     VisitChildren(node);
 }