Exemple #1
0
        public ICLS_Value MakeValue(object value)
        {
            CLS_Value_Value <double> v = new CLS_Value_Value <double>();

            v.value_value = (double)value;

            return(v);
        }
Exemple #2
0
        public ICLS_Value MakeValue(object value)
        {
            CLS_Value_Value <string> v = new CLS_Value_Value <string>();

            v.value_value = (string)value;

            return(v);
        }
Exemple #3
0
        public ICLS_Value MakeValue(object value)
        {
            CLS_Value_Value <float> v = new CLS_Value_Value <float>();

            v.value_value = (float)value;

            return(v);
        }
Exemple #4
0
        ICLS_Expression OptimizeSingle(ICLS_Expression expr, CLS_Content content)
        {
            if (expr is CLS_Expression_Math2Value || expr is CLS_Expression_Math2ValueAndOr || expr is CLS_Expression_Math2ValueLogic)
            {
                if (expr.listParam[0] is ICLS_Value &&
                    expr.listParam[1] is ICLS_Value)
                {
                    CLS_Content.Value result = expr.ComputeValue(content);
                    if (result.type == typeof(bool))
                    {
                        CLS_Value_Value <bool> value = new CLS_Value_Value <bool>();
                        value.value_value = (bool)result.value;
                        value.tokenBegin  = expr.listParam[0].tokenBegin;
                        value.tokenEnd    = expr.listParam[1].tokenEnd;
                        return(value);
                    }
                    else
                    {
                        ICLS_Type  v     = content.environment.GetType(result.type);
                        ICLS_Value value = v.MakeValue(result.value);
                        value.tokenBegin = expr.listParam[0].tokenBegin;
                        value.tokenEnd   = expr.listParam[1].tokenEnd;

                        return(value);
                    }
                }
            }
            if (expr is CLS_Expression_Math3Value)
            {
                CLS_Content.Value result = expr.listParam[0].ComputeValue(content);
                if (result.type == typeof(bool))
                {
                    bool bv = (bool)result.value;
                    if (bv)
                    {
                        return(expr.listParam[1]);
                    }
                    else
                    {
                        return(expr.listParam[2]);
                    }
                }
            }

            return(expr);
        }
Exemple #5
0
 public ICLS_Expression Compiler_Expression_Value(Token value, int pos)
 {
     if (value.type == TokenType.VALUE)
     {
         if (value.text[value.text.Length - 1] == 'f')
         {
             CLS_Value_Value <float> number = new CLS_Value_Value <float>();
             number.value_value = float.Parse(value.text.Substring(0, value.text.Length - 1));
             return(number);
         }
         else if (value.text.Contains("."))
         {
             CLS_Value_Value <double> number = new CLS_Value_Value <double>();
             number.value_value = double.Parse(value.text);
             return(number);
         }
         else
         {
             CLS_Value_Value <int> number = new CLS_Value_Value <int>();
             number.value_value = int.Parse(value.text);
             return(number);
         }
     }
     else if (value.type == TokenType.STRING)
     {
         CLS_Value_Value <string> str = new CLS_Value_Value <string>();
         str.value_value = value.text.Substring(1, value.text.Length - 2);
         return(str);
     }
     else if (value.type == TokenType.IDENTIFIER)
     {
         CLS_Expression_GetValue getvalue = new CLS_Expression_GetValue(pos, pos);
         getvalue.value_name = value.text;
         return(getvalue);
     }
     else
     {
         logger.Log_Error("无法识别的简单表达式" + value);
         return(null);
     }
 }
Exemple #6
0
 public ICLS_Expression Compiler_Expression_SubValue(Token value)
 {
     if (value.type == TokenType.VALUE)
     {
         if (value.text.Contains("."))
         {
             CLS_Value_Value <double> number = new CLS_Value_Value <double>();
             number.value_value = -double.Parse(value.text);
             return(number);
         }
         else
         {
             CLS_Value_Value <int> number = new CLS_Value_Value <int>();
             number.value_value = -int.Parse(value.text);
             return(number);
         }
     }
     else
     {
         logger.Log_Error("无法识别的简单表达式" + value);
         return(null);
     }
 }
Exemple #7
0
        //不出Block,必须一次解析完,括号为优先级
        public bool Compiler_Expression(IList <Token> tlist, CLS_Content content, int pos, int posend, out ICLS_Expression value)
        {
            if (pos > posend)
            {
                value = null;
                return(false);
            }
            int begin = pos;

            value = null;
            List <ICLS_Expression> values = new List <ICLS_Expression>();

            do
            {
                if (tlist[begin].type == TokenType.COMMENT)
                {
                    begin++;
                    continue;
                }
                if (tlist[begin].type == TokenType.PUNCTUATION && tlist[begin].text == ";")
                {
                    begin++;
                    continue;
                }
                int bdep;
                //脱一次壳
                int end = FindCodeAny(tlist, ref begin, out bdep);

                if (end > posend)
                {
                    end = posend;
                }

                else if (end < posend)
                {
                    bool bMath = false;
                    for (int i = end + 1; i <= posend; i++)
                    {
                        if (tlist[i].type == TokenType.COMMENT)
                        {
                            continue;
                        }
                        if (tlist[i].type == TokenType.PUNCTUATION && tlist[i].text == ";")
                        {
                            continue;
                        }
                        bMath = true;
                        break;
                    }
                    if (bMath)
                    {
                        end = posend;
                        //如果表达式一次搞不完,那肯定是优先级问题
                        value = Compiler_Expression_Math(tlist, content, begin, posend);
                        return(true);
                    }
                }
                //else
                //{
                //    IList<int> i = SplitExpressionWithOp(tlist, begin, end);
                //    if (i != null && i.Count > 0)
                //    {
                //        value = Compiler_Expression_Math(tlist, begin, posend);
                //        return true;
                //    }
                //}
                int expend   = end;
                int expbegin = begin;
                if (expbegin > expend)
                {
                    return(true);
                }
                if (expend == expbegin)
                {//simple
                    if (tlist[expbegin].type == TokenType.KEYWORD)
                    {
                        if (tlist[expbegin].text == "return")
                        {
                            ICLS_Expression subvalue = Compiler_Expression_Loop_Return(tlist, content, expbegin, expend);
                            if (null == subvalue)
                            {
                                return(false);
                            }
                            else
                            {
                                values.Add(subvalue);
                            }
                        }
                        else if (tlist[expbegin].text == "break")
                        {
                            ICLS_Expression subvalue = Compiler_Expression_Loop_Break(tlist, expbegin);
                            if (null == subvalue)
                            {
                                return(false);
                            }
                            else
                            {
                                values.Add(subvalue);
                            }
                        }
                        else if (tlist[expbegin].text == "continue")
                        {
                            ICLS_Expression subvalue = Compiler_Expression_Loop_Continue(tlist, expbegin);
                            if (null == subvalue)
                            {
                                return(false);
                            }
                            else
                            {
                                values.Add(subvalue);
                            }
                        }
                        else if (tlist[expbegin].text == "true")
                        {
                            CLS_Value_Value <bool> subvalue = new CLS_Value_Value <bool>();
                            subvalue.value_value = true;
                            values.Add(subvalue);
                        }
                        else if (tlist[expbegin].text == "false")
                        {
                            CLS_Value_Value <bool> subvalue = new CLS_Value_Value <bool>();
                            subvalue.value_value = false;
                            values.Add(subvalue);
                        }
                        else if (tlist[expbegin].text == "null")
                        {
                            CLS_Value_Null subvalue = new CLS_Value_Null();
                            values.Add(subvalue);
                        }
                    }
                    else
                    {
                        ICLS_Expression subvalue = Compiler_Expression_Value(tlist[expbegin], expbegin);
                        if (null == subvalue)
                        {
                            return(false);
                        }
                        else
                        {
                            values.Add(subvalue);
                        }
                    }
                }
                else if (bdep == 1) //深层表达式
                {
                    expbegin++;
                    expend--;
                    ICLS_Expression subvalue;
                    bool            bsucc = Compiler_Expression(tlist, content, expbegin, expend, out subvalue);
                    if (bsucc)
                    {
                        if (subvalue != null)
                        {
                            values.Add(subvalue);
                        }
                    }
                    else
                    {
                        return(false);
                    }
                }
                else             //尝试各种表达式
                {
                    bool bTest = false;
                    //取反表达式
                    if (tlist[expbegin].type == TokenType.PUNCTUATION && tlist[expbegin].text == "-")
                    {
                        if (tlist[expend].type == TokenType.VALUE)
                        {//负数
                            if (expend == expbegin + 1)
                            {
                                ICLS_Expression subvalue = Compiler_Expression_SubValue(tlist[expend]);
                                if (null == subvalue)
                                {
                                    return(false);
                                }
                                else
                                {
                                    values.Add(subvalue);
                                }
                            }
                            else
                            {
                                ICLS_Expression subvalue = Compiler_Expression_Math(tlist, content, begin, posend);
                                if (null == subvalue)
                                {
                                    return(false);
                                }
                                else
                                {
                                    values.Add(subvalue);
                                }
                            }
                        }
                        else
                        {//负数表达式
                            ICLS_Expression subvalue = Compiler_Expression_NegativeValue(tlist, content, expbegin + 1, expend);
                            if (null == subvalue)
                            {
                                return(false);
                            }
                            else
                            {
                                values.Add(subvalue);
                            }
                        }
                        bTest = true;
                    }
                    if (tlist[expbegin].type == TokenType.PUNCTUATION && tlist[expbegin].text == "!")
                    {//逻辑反表达式
                        ICLS_Expression subvalue = Compiler_Expression_NegativeLogic(tlist, content, expbegin + 1, expend);
                        if (null == subvalue)
                        {
                            return(false);
                        }
                        else
                        {
                            values.Add(subvalue);
                        }
                        bTest = true;
                    }
                    if (!bTest && tlist[expbegin].type == TokenType.TYPE)
                    {
                        if (tlist[expbegin + 1].type == TokenType.IDENTIFIER) //定义表达式或者定义并赋值表达式
                        {
                            if (expend == expbegin + 1)                       //定义表达式
                            {
                                ICLS_Expression subvalue = Compiler_Expression_Define(tlist, content, expbegin, expend);
                                if (null == subvalue)
                                {
                                    return(false);
                                }
                                else
                                {
                                    values.Add(subvalue);
                                }
                                bTest = true;
                            }
                            else if (expend > expbegin + 2 && tlist[expbegin + 2].type == TokenType.PUNCTUATION && tlist[expbegin + 2].text == "=")
                            {//定义并赋值表达式
                                ICLS_Expression subvalue = Compiler_Expression_DefineAndSet(tlist, content, expbegin, expend);
                                if (null == subvalue)
                                {
                                    return(false);
                                }
                                else
                                {
                                    values.Add(subvalue);
                                }
                                bTest = true;
                            }
                            else
                            {
                                LogError(tlist, "无法识别的表达式:", expbegin, expend);
                                return(false);
                            }
                        }
                        else if (tlist[expbegin + 1].type == TokenType.PUNCTUATION && tlist[expbegin + 1].text == ".")
                        {//静态调用表达式
                            //if (expend - expbegin > 2)
                            {
                                ICLS_Expression subvalue = Compiler_Expression_Math(tlist, content, expbegin, expend);
                                if (subvalue != null)
                                {
                                    //subvalue.listParam.Add(subparam);
                                    values.Add(subvalue);
                                    bTest = true;
                                }
                                else
                                {
                                    return(false);
                                }
                            }
                        }
                    }
                    if (!bTest && tlist[expbegin].type == TokenType.IDENTIFIER)
                    {
                        if (expend == expbegin + 1)//一元表达式
                        {
                            ICLS_Expression subvalue = Compiler_Expression_MathSelf(tlist, expbegin, expend);
                            if (null == subvalue)
                            {
                                return(false);
                            }
                            else
                            {
                                values.Add(subvalue);
                            }
                            bTest = true;
                        }
                        if (!bTest && tlist[expbegin + 1].type == TokenType.PUNCTUATION && tlist[expbegin + 1].text == "=")//赋值表达式
                        {
                            ICLS_Expression subvalue = Compiler_Expression_Set(tlist, content, expbegin, expend);
                            if (null == subvalue)
                            {
                                return(false);
                            }
                            else
                            {
                                values.Add(subvalue);
                            }
                            bTest = true;
                        }
                        //if (!bTest && tlist[expbegin + 1].type == TokenType.PUNCTUATION && tlist[expbegin + 1].text == "(")//函数表达式
                        //{
                        //    ICLS_Expression subvalue = Compiler_Expression_Function(tlist,content, expbegin, expend);
                        //    if (null == subvalue) return false;
                        //    else
                        //        values.Add(subvalue);
                        //    bTest = true;
                        //}
                        //if (!bTest && tlist[expbegin + 1].type == TokenType.PUNCTUATION && tlist[expbegin + 1].text == "[")//函数表达式
                        //{
                        //    ICLS_Expression subvalue = Compiler_Expression_IndexFind(tlist, content, expbegin, expend);
                        //    if (null == subvalue) return false;
                        //    else
                        //        values.Add(subvalue);
                        //    bTest = true;
                        //}
                    }
                    if (!bTest && (tlist[expbegin].type == TokenType.IDENTIFIER || tlist[expbegin].type == TokenType.VALUE || tlist[expbegin].type == TokenType.STRING))
                    {
                        //算数表达式
                        ICLS_Expression subvalue = Compiler_Expression_Math(tlist, content, expbegin, expend);
                        if (null != subvalue)
                        {
                            values.Add(subvalue);
                            bTest = true;
                        }
                    }
                    if (!bTest && tlist[expbegin].type == TokenType.KEYWORD)
                    {
                        if (tlist[expbegin].text == "for")
                        {
                            ICLS_Expression subvalue = Compiler_Expression_Loop_For(tlist, content, expbegin, expend);
                            if (null == subvalue)
                            {
                                return(false);
                            }
                            else
                            {
                                values.Add(subvalue);
                            }
                            bTest = true;
                        }
                        else if (tlist[expbegin].text == "foreach")
                        {
                            ICLS_Expression subvalue = Compiler_Expression_Loop_ForEach(tlist, content, expbegin, expend);
                            if (null == subvalue)
                            {
                                return(false);
                            }
                            else
                            {
                                values.Add(subvalue);
                            }
                            bTest = true;
                        }
                        else if (tlist[expbegin].text == "if")
                        {
                            ICLS_Expression subvalue = Compiler_Expression_Loop_If(tlist, content, expbegin, expend);
                            if (null == subvalue)
                            {
                                return(false);
                            }
                            else
                            {
                                values.Add(subvalue);
                            }
                            bTest = true;
                        }
                        else if (tlist[expbegin].text == "return")
                        {
                            ICLS_Expression subvalue = Compiler_Expression_Loop_Return(tlist, content, expbegin, expend);
                            if (null == subvalue)
                            {
                                return(false);
                            }
                            else
                            {
                                values.Add(subvalue);
                            }
                            bTest = true;
                        }
                        else if (tlist[expbegin].text == "trace")
                        {
                            ICLS_Expression subvalue = Compiler_Expression_FunctionTrace(tlist, content, expbegin, expend);
                            if (null == subvalue)
                            {
                                return(false);
                            }
                            else
                            {
                                values.Add(subvalue);
                            }
                            bTest = true;
                        }
                        else if (tlist[expbegin].text == "true" || tlist[expbegin].text == "false" || tlist[expbegin].text == "null")
                        {
                            //算数表达式
                            ICLS_Expression subvalue = Compiler_Expression_Math(tlist, content, expbegin, expend);
                            if (null != subvalue)
                            {
                                values.Add(subvalue);
                                bTest = true;
                            }
                        }
                        else if (tlist[expbegin].text == "new")
                        {
                            //new 表达式
                            if (tlist[expbegin + 1].type == TokenType.TYPE)
                            {
                                ICLS_Expression subvalue = Compiler_Expression_FunctionNew(tlist, content, pos, posend);
                                values.Add(subvalue);
                                bTest = true;
                            }
                        }
                        else
                        {
                            LogError(tlist, "无法识别的表达式:", expbegin, expend);
                            return(false);
                        }
                    }
                    if (!bTest)
                    {
                        LogError(tlist, "无法识别的表达式:", expbegin, expend);
                        return(false);
                    }
                }



                begin = end + 1;
            }while (begin <= posend);
            if (values.Count == 1)
            {
                value = values[0];
            }
            else if (values.Count > 1)
            {
                LogError(tlist, "异常表达式", pos, posend);
            }
            return(true);
        }