示例#1
0
        protected override List <object> _GetResults(Frame frame)
        {
            object ret = null;

            if (op.Match(TokenType.AND))
            {
                ret = left.GetBool(frame) && right.GetBool(frame);
            }
            else if (op.Match(TokenType.OR))
            {
                ret = left.GetBool(frame) || right.GetBool(frame);
            }
            else
            {
                if (op.Match('+'))
                {
                    ret = left.GetValidNumber(frame) + right.GetValidNumber(frame);
                }
                else if (op.Match('-'))
                {
                    ret = left.GetValidNumber(frame) - right.GetValidNumber(frame);
                }
                else if (op.Match('*'))
                {
                    ret = left.GetValidNumber(frame) * right.GetValidNumber(frame);
                }
                else if (op.Match('/'))
                {
                    ret = left.GetValidNumber(frame) / right.GetValidNumber(frame);
                }
                else if (op.Match('%'))
                {
                    ret = left.GetValidNumber(frame) % right.GetValidNumber(frame);
                }
                else if (op.Match('<'))
                {
                    var l = left.GetOneResult(frame);
                    var r = right.GetOneResult(frame);
                    ret = Utils.Compare(l, r) < 0;
                }
                else if (op.Match('>'))
                {
                    var l = left.GetOneResult(frame);
                    var r = right.GetOneResult(frame);
                    ret = Utils.Compare(l, r) > 0;
                }
                else if (op.Match(TokenType.LE))
                {
                    var l = left.GetOneResult(frame);
                    var r = right.GetOneResult(frame);
                    ret = Utils.Compare(l, r) <= 0;
                }
                else if (op.Match(TokenType.GE))
                {
                    var l = left.GetOneResult(frame);
                    var r = right.GetOneResult(frame);
                    ret = Utils.Compare(l, r) >= 0;
                }
                else if (op.Match(TokenType.EQ))
                {
                    var l = left.GetOneResult(frame);
                    var r = right.GetOneResult(frame);
                    ret = Utils.CheckEquals(l, r);
                }
                else if (op.Match(TokenType.NE))
                {
                    var l = left.GetOneResult(frame);
                    var r = right.GetOneResult(frame);
                    ret = !Utils.CheckEquals(l, r);
                }
                else if (op.Match(TokenType.CONCAT))
                {
                    ret = left.GetString(frame) + right.GetString(frame);
                }
                else
                {
                    Debug.Assert(false);
                }
            }

            return(new List <object>()
            {
                ret
            });
        }
示例#2
0
        protected override void _Exec(Frame frame)
        {
            object table = null, idx = null, val;
            string name = null;

            // 读
            if (var is TableAccess)
            {
                var access = var as TableAccess;
                table = access.table.GetOneResult(frame);
                if (table == null)
                {
                    throw frame.NewRunException(access.table.line, "table can not be null when run TableAccess");
                }
                idx = access.index.GetOneResult(frame);
                if (idx == null)
                {
                    throw frame.NewRunException(access.index.line, "index can not be null when run TableAccess");
                }
                val = ExtUtils.Get(table, idx);
            }
            else
            {
                var ter = var as Terminator;
                Debug.Assert(ter.token.Match(TokenType.NAME));
                name = ter.token.m_string;
                val  = frame.Read(name);
            }

            // 运算
            if (op == TokenType.CONCAT_SELF)
            {
                // .=
                string str = exp.GetString(frame);
                val = Utils.ToString(val) + str;
            }
            else
            {
                double delta = 1;
                if (exp != null)
                {
                    delta = exp.GetValidNumber(frame);
                }
                if (op == TokenType.DEC_ONE || op == TokenType.DEC_SELF)
                {
                    delta *= -1;
                }
                // @om 要不要检查下NaN
                val = Utils.ToNumber(val) + delta;
            }

            // 写
            if (var is TableAccess)
            {
                ExtUtils.Set(table, idx, val);
            }
            else
            {
                frame.Write(name, val);
            }
        }