Ejemplo n.º 1
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 ((Type)result.type == typeof(bool))
                    {
                        CLS_Expression_Value <bool> value = new CLS_Expression_Value <bool>();
                        value.value      = (bool)result.value;
                        value.tokenBegin = expr.listParam[0].tokenBegin;
                        value.tokenEnd   = expr.listParam[1].tokenEnd;
                        value.lineBegin  = expr.listParam[0].lineBegin;
                        value.lineEnd    = expr.listParam[1].lineEnd;
                        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;
                        value.lineBegin  = expr.listParam[0].lineBegin;
                        value.lineEnd    = expr.listParam[1].lineEnd;
                        return(value as ICLS_Expression);
                    }
                }
            }

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

            return(expr);
        }
Ejemplo n.º 2
0
 ICLS_Expression CreateValueExpression(long val)
 {
     if (val > uint.MaxValue || val < int.MinValue)
     {
         CLS_Expression_Value <long> number = new CLS_Expression_Value <long>();
         number.value = val;
         return(number);
     }
     else if (val > int.MaxValue)
     {
         CLS_Expression_Value <uint> number = new CLS_Expression_Value <uint>();
         number.value = (uint)val;
         return(number);
     }
     else
     {
         CLS_Expression_Value <int> number = new CLS_Expression_Value <int>();
         number.value = (int)val;
         return(number);
     }
 }
Ejemplo n.º 3
0
 public ICLS_Expression Compiler_Expression_Value(Token value, int pos)
 {
     if (value.type == TokenType.VALUE)
     {
         if (value.text.StartsWith("-0x") || value.text.StartsWith("-0X"))
         {
             long lv = -Convert.ToInt64(value.text.Substring(1), 16);
             return(CreateValueExpression(lv));
         }
         else if (value.text.StartsWith("0x") || value.text.StartsWith("0X"))
         {
             long lv = Convert.ToInt64(value.text, 16);
             return(CreateValueExpression(lv));
         }
         else if (value.text[value.text.Length - 1] == 'f')
         {
             CLS_Expression_Value <float> number = new CLS_Expression_Value <float>();
             number.value = float.Parse(value.text.Substring(0, value.text.Length - 1));
             return(number);
         }
         else if (value.text.Contains("."))
         {
             CLS_Expression_Value <double> number = new CLS_Expression_Value <double>();
             number.value = double.Parse(value.text);
             return(number);
         }
         else if (value.text.Contains("'"))
         {
             CLS_Expression_Value <char> number = new CLS_Expression_Value <char>();
             number.value = (char)value.text[1];
             return(number);
         }
         else if (value.text.StartsWith("-"))
         {
             long lv = long.Parse(value.text);
             return(CreateValueExpression(lv));
         }
         else
         {
             long lv = long.Parse(value.text);
             return(CreateValueExpression(lv));
         }
     }
     else if (value.type == TokenType.STRING)
     {
         CLS_Expression_Value <string> str = new CLS_Expression_Value <string>();
         str.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, value.line, value.line);
         getvalue.value_name = value.text;
         return(getvalue);
     }
     else if (value.type == TokenType.TYPE)
     {
         CLS_Expression_GetValue getvalue = new CLS_Expression_GetValue(pos, pos, value.line, value.line);
         int l = value.text.LastIndexOf('.');
         if (l >= 0)
         {
             getvalue.value_name = value.text.Substring(l + 1);
         }
         else
         {
             getvalue.value_name = value.text;
         }
         return(getvalue);
     }
     logger.Log_Error("无法识别的简单表达式" + value);
     return(null);
 }