Esempio n. 1
0
        internal override bool TryGetToken(ref string text, out TokenBase token, bool requireReturnValue = true)
        {
            token = null;
            if (!text.StartsWith("typeof"))
            {
                return(false);
            }
            string temp = text.Substring(6).TrimStart();

            if (temp.Length < 3 || temp[0] != '(')
            {
                return(false);
            }
            var name = GetNameMatches(temp.Substring(1), null, null).FirstOrDefault(tuple => tuple.Item1 is Type && tuple.Item2.TrimStart().StartsWith(")"));

            if (name == null)
            {
                return(false);
            }
            text  = name.Item2.TrimStart().Substring(1);
            token = new TypeofToken()
            {
                Type = name.Item1 as Type
            };
            return(true);
        }
        internal override bool TryGetToken(ref string text, out TokenBase token, bool requireReturnValue = true)
        {
            token = null;
            string temp = text;

            if (temp.Length < 2 || temp[0] != '.' || (!Char.IsLetter(temp[1]) && temp[1] != '_'))
            {
                return(false);
            }
            int count = 2;

            while (count < temp.Length && (Char.IsLetterOrDigit(temp[count]) || temp[count] == '_'))
            {
                ++count;
            }
            if (count < temp.Length && temp[count] == '(')
            {
                return(false);
            }
            string name = temp.Substring(1, count - 1);

            text  = temp.Substring(count);
            token = new InstanceMemberToken()
            {
                MemberName = name
            };
            return(true);
        }
Esempio n. 3
0
        internal override bool TryGetToken(ref string text, out TokenBase token)
        {
            token = null;
            TokenBase arguments;
            bool      lambda = false;

            if (!new ArgumentListToken('(', ')', null).TryGetToken(ref text, out arguments))
            {
                lambda = true;
                if (!new ArgumentListToken(true, '(', ')').TryGetToken(ref text, out arguments))
                {
                    return(false);
                }
            }
            string temp = text.TrimStart();

            if (!temp.StartsWith("=>"))
            {
                return(false);
            }
            temp = temp.Substring(2).TrimStart();
            TokenBase method;

            if (!EquationTokenizer.TryEvaluateExpression(temp, out method))
            {
                return(false);
            }
            text  = "";
            token = new LambdaToken()
            {
                Arguments = arguments as ArgumentListToken, Value = method, Lambda = lambda
            };
            return(true);
        }
Esempio n. 4
0
 internal override bool SetPostTarget(TokenBase target)
 {
     if (target is StaticMemberToken)
     {
         if ((target as StaticMemberToken).Member is PropertyInfo)
         {
             if (!((target as StaticMemberToken).Member as PropertyInfo).CanWrite)
             {
                 throw new Exception("Static member \"" + ((target as StaticMemberToken).Member as PropertyInfo).Name + "\" is readonly and cannot be set.");
             }
             else if (Operator != default(Operator) && !((target as StaticMemberToken).Member as PropertyInfo).CanRead)
             {
                 throw new Exception("Static member \"" + ((target as StaticMemberToken).Member as PropertyInfo).Name + "\" is writeonly and cannot be read.");
             }
         }
         else if (!((target as StaticMemberToken).Member is FieldInfo))
         {
             return(false);
         }
     }
     else if (!(target is InstanceMemberToken))
     {
         return(false);
     }
     Target = target;
     if (Operator != default(Operator))
     {
         Value = new BinaryOperatorToken(Target, Value, Operator);
     }
     return(true);
 }
Esempio n. 5
0
        internal override bool TryGetToken(ref string text, out TokenBase token, bool requireReturnValue = true)
        {
            token = null;
            bool inQuotes = false;
            int  brackets = 0;
            int  i        = 0;

            while (true)
            {
                if (i >= text.Length)
                {
                    return(false);
                }
                if (i > 0 && text[i] == '\'' && text[i - 1] != '\\')
                {
                    inQuotes = !inQuotes;
                }
                else if (!inQuotes)
                {
                    if (text[i] == '(')
                    {
                        ++brackets;
                    }
                    else if (text[i] == ')')
                    {
                        --brackets;
                        if (brackets == 0)
                        {
                            break;
                        }
                    }
                }
                ++i;
            }
            string temp = text.Substring(1, i - 1);

            var tuple = GetNameMatches(temp, null, null).Where(tup => tup.Item1 is Type).Reverse().FirstOrDefault();

            if (tuple == null)
            {
                return(false);
            }

            temp = text.Substring(i + 1).TrimStart();
            TokenBase valToken = null;

            if (parseTarget && !EquationTokenizer.TryGetValueToken(ref temp, out valToken))
            {
                return(false);
            }
            text  = temp;
            token = new TypeCastToken()
            {
                TargetType = tuple.Item1 as Type, Target = valToken
            };
            return(true);
        }
Esempio n. 6
0
        internal override bool TryGetToken(ref string text, out TokenBase token, bool requireReturnValue = true)
        {
            token = null;
            string temp = text;
            var    op   = default(Operator);

            if (temp.Length < 2)
            {
                return(false);
            }
            if (temp[0] != '=')
            {
                if (temp[1] != '=' || temp.Length < 3)
                {
                    return(false);
                }
                for (int i = (int)Operator.Multiply; i <= (int)Operator.Subtract; ++i)
                {
                    if (EquationTokenizer.representations[i][0] == temp[0])
                    {
                        op = (Operator)i;
                    }
                }
                for (int i = (int)Operator.BitwiseAnd; i <= (int)Operator.BitwiseXor; ++i)
                {
                    if (EquationTokenizer.representations[i][0] == temp[0])
                    {
                        op = (Operator)i;
                    }
                }
                if (op == default(Operator))
                {
                    return(false);
                }
            }

            if (op == default(Operator))
            {
                temp = temp.Substring(1).TrimStart();
            }
            else
            {
                temp = temp.Substring(2).TrimStart();
            }
            TokenBase valToken;

            if (!EquationTokenizer.TryEvaluateExpression(temp, out valToken))
            {
                return(false);
            }
            text  = "";
            token = new AssignmentToken()
            {
                Value = valToken, Operator = op
            };
            return(true);
        }
        internal override bool TryGetToken(ref string text, out TokenBase token, bool requireReturnValue = true)
        {
            token = null;
            string temp = text;

            if (temp.Length == 0 || (!Char.IsLetter(temp[0]) && temp[0] != '_'))
            {
                return(false);
            }
            int count = 1;

            while (count < temp.Length && (Char.IsLetterOrDigit(temp[count]) || temp[count] == '_'))
            {
                ++count;
            }
            string name = temp.Substring(0, count);

            MemberInfo info = null;

            if (type != null)
            {
                info = type.GetMember(name).FirstOrDefault();
                if (info == null)
                {
                    return(false);
                }
            }
            else
            {
                string    nameTemp = "$" + name;
                TokenBase tokenTemp;
                if (!new ParameterToken().TryGetToken(ref nameTemp, out tokenTemp))
                {
                    return(false);
                }
            }

            temp = temp.Substring(count).TrimStart();
            if (temp.Length == 0 || temp[0] != '=')
            {
                return(false);
            }
            temp = temp.Substring(1).TrimStart();
            TokenBase valToken;

            if (!EquationTokenizer.TryEvaluateExpression(temp, out valToken))
            {
                return(false);
            }
            text  = "";
            token = new LambdaAssignmentToken(null)
            {
                Name = name, Member = info, Value = valToken
            };
            return(true);
        }
Esempio n. 8
0
        internal override bool TryGetToken(ref string text, out TokenBase token)
        {
            token = null;
            string temp = text;

            if (temp.Length < 3 || temp[0] != '[')
            {
                return(false);
            }

            bool inQuotes = false;
            int  brackets = 0;
            int  i        = 0;

            while (true)
            {
                if (i >= temp.Length)
                {
                    return(false);
                }
                if (i > 0 && temp[i] == '\'' && temp[i - 1] != '\\')
                {
                    inQuotes = !inQuotes;
                }
                else if (!inQuotes)
                {
                    if (temp[i] == '[')
                    {
                        ++brackets;
                    }
                    else if (temp[i] == ']')
                    {
                        --brackets;
                        if (brackets == 0)
                        {
                            break;
                        }
                    }
                }
                ++i;
            }

            TokenBase ind;

            if (!new ArgumentListToken('[', ']').TryGetToken(ref temp, out ind))
            {
                return(false);
            }
            text  = text.Substring(i + 1);
            token = new IndexerToken()
            {
                Indices = ind as ArgumentListToken
            };
            return(true);
        }
Esempio n. 9
0
        internal override bool TryGetToken(ref string text, out TokenBase token)
        {
            token = null;
            string temp = text;

            if (temp.Length < 2 || temp[0] != '.' || (!Char.IsLetter(temp[1]) && temp[1] != '_'))
            {
                return(false);
            }
            int count = 2;

            while (count < temp.Length && (Char.IsLetterOrDigit(temp[count]) || temp[count] == '_'))
            {
                ++count;
            }
            string name = temp.Substring(1, count - 1);

            temp = temp.Substring(count).TrimStart();
            if (temp.Length == 0)
            {
                return(false);
            }
            List <Type> typeArgs = null;

            if (temp[0] == '[')
            {
                List <string> list;
                if (!TrySplitByCommas(ref temp, '[', ']', out list))
                {
                    return(false);
                }
                typeArgs = new List <Type>();
                foreach (string str in list)
                {
                    Tuple <object, string> tuple = GetNameMatches(str.Trim(), null, null).FirstOrDefault(tp => tp.Item1 is Type && string.IsNullOrWhiteSpace(tp.Item2));
                    if (tuple == null)
                    {
                        return(false);
                    }
                    typeArgs.Add(tuple.Item1 as Type);
                }
            }
            TokenBase args;

            if (!new ArgumentListToken('(', ')').TryGetToken(ref temp, out args))
            {
                return(false);
            }
            text  = temp;
            token = new InstanceFunctionToken()
            {
                Arguments = args as ArgumentListToken, MethodName = name, Types = typeArgs != null?typeArgs.ToArray() : null
            };
            return(true);
        }
Esempio n. 10
0
        internal override bool TryGetToken(ref string text, out TokenBase token)
        {
            token = null;
            bool inQuotes = false;
            int  brackets = 0;
            int  i        = 0;
            int  qPos     = -1;

            while (true)
            {
                if (i >= text.Length - 1)
                {
                    return(false);
                }
                if (i > 0 && text[i] == '\'' && text[i - 1] != '\\')
                {
                    inQuotes = !inQuotes;
                }
                else if (!inQuotes)
                {
                    if (text[i] == '(')
                    {
                        ++brackets;
                    }
                    else if (text[i] == ')')
                    {
                        --brackets;
                    }
                    else if (brackets == 0 && text[i] == '?' && text[i + 1] == '?')
                    {
                        qPos = i;
                        break;
                    }
                }
                ++i;
            }
            TokenBase left, right;

            if (!EquationTokenizer.TryEvaluateExpression(text.Substring(0, qPos).Trim(), out left))
            {
                return(false);
            }
            if (!EquationTokenizer.TryEvaluateExpression(text.Substring(qPos + 2).Trim(), out right))
            {
                return(false);
            }
            token = new NullCoalesceOperatorToken()
            {
                Condition = left, OnNull = right
            };
            text = "";
            return(true);
        }
Esempio n. 11
0
        internal override bool TryGetToken(ref string text, out TokenBase token, bool requireReturnValue = true)
        {
            token = null;
            var list = GetNameMatches(text, null, null).Where(tup => tup.Item1 is MethodInfo && ((tup.Item1 as MethodInfo).ReturnType != typeof(void) || !requireReturnValue)).ToArray();
            Tuple <MethodInfo, TokenBase, string> info = null;

            foreach (var method in list)
            {
                string    temp = method.Item2;
                TokenBase args;
                if (!new ArgumentListToken('(', ')').TryGetToken(ref temp, out args))
                {
                    continue;
                }
                if ((args as ArgumentListToken).Arguments.Length <= (method.Item1 as MethodInfo).GetParameters().Length)
                {
                    bool good = true;
                    for (int i = 0; i < (method.Item1 as MethodInfo).GetParameters().Length; ++i)
                    {
                        if (i < (args as ArgumentListToken).Arguments.Length)
                        {
                            if ((args as ArgumentListToken).Arguments[i].ReturnType.IsAssignableFrom((method.Item1 as MethodInfo).GetParameters()[i].ParameterType) || (method.Item1 as MethodInfo).GetParameters()[i].ParameterType.IsAssignableFrom((args as ArgumentListToken).Arguments[i].ReturnType))
                            {
                                continue;
                            }
                        }
                        else if ((method.Item1 as MethodInfo).GetParameters()[i].IsOptional)
                        {
                            continue;
                        }
                        good = false;
                        break;
                    }
                    if (!good)
                    {
                        continue;
                    }
                    info = new Tuple <MethodInfo, TokenBase, string>(method.Item1 as MethodInfo, args, temp);
                    break;
                }
            }
            if (info == null)
            {
                return(false);
            }
            text  = info.Item3;
            token = new StaticFunctionToken()
            {
                Arguments = info.Item2 as ArgumentListToken, Method = info.Item1
            };
            return(true);
        }
Esempio n. 12
0
        internal override bool TryGetToken(ref string text, out TokenBase token)
        {
            token = null;
            string temp = text;

            if (temp.Length < 2 || temp[0] != '?' || (temp[1] != '.' && temp[1] != '['))
            {
                return(false);
            }
            text  = temp.Substring(1);
            token = new NullPropagatingToken();
            return(true);
        }
Esempio n. 13
0
        internal override bool TryGetToken(ref string text, out TokenBase token, bool requireReturnValue = true)
        {
            token = null;
            if (!text.TrimStart().StartsWith("("))
            {
                return(false);
            }
            bool inQuotes = false;
            int  brackets = 0;
            int  i        = 0;

            while (true)
            {
                if (i >= text.Length)
                {
                    return(false);
                }
                if (i > 0 && text[i] == '\'' && text[i - 1] != '\\')
                {
                    inQuotes = !inQuotes;
                }
                else if (!inQuotes)
                {
                    if (text[i] == '(')
                    {
                        ++brackets;
                    }
                    else if (text[i] == ')')
                    {
                        --brackets;
                        if (brackets == 0)
                        {
                            break;
                        }
                    }
                }
                ++i;
            }
            TokenBase valToken;

            if (!EquationTokenizer.TryEvaluateExpression(text.Substring(1, i - 1), out valToken))
            {
                return(false);
            }
            text  = text.Substring(i + 1);
            token = new BracketedToken()
            {
                Value = valToken
            };
            return(true);
        }
Esempio n. 14
0
        internal override bool TryGetToken(ref string text, out TokenBase token)
        {
            token = null;
            var tuple = GetNameMatches(text, null, null).Where(tup => tup.Item1 is FieldInfo || tup.Item1 is PropertyInfo).Reverse().FirstOrDefault();

            if (tuple == null)
            {
                return(false);
            }
            text  = tuple.Item2;
            token = new StaticMemberToken()
            {
                Member = tuple.Item1 as MemberInfo
            };
            return(true);
        }
Esempio n. 15
0
        internal override bool TryGetToken(ref string text, out TokenBase token, bool requireReturnValue = true)
        {
            token = null;
            if (text.Length < 2 || text[0] != '$' || (!Char.IsLetter(text[1]) && text[1] != '_'))
            {
                return(false);
            }
            int count = 2;

            while (count < text.Length && (Char.IsLetterOrDigit(text[count]) || text[count] == '_'))
            {
                ++count;
            }
            token = new ParameterToken()
            {
                Name = text.Substring(1, count - 1)
            };
            text = text.Substring(count);
            return(true);
        }
Esempio n. 16
0
        internal override bool TryGetToken(ref string text, out TokenBase token, bool requireReturnValue = true)
        {
            token = null;
            if (text.Length == 0)
            {
                return(false);
            }
            Operator op;

            if (text[0] == '!')
            {
                op = Operator.Not;
            }
            else if (text[0] == '+')
            {
                op = Operator.Positive;
            }
            else if (text[0] == '-')
            {
                op = Operator.Negative;
            }
            else
            {
                return(false);
            }
            TokenBase valToken;
            string    temp = text.Substring(1).TrimStart();

            if (!EquationTokenizer.TryGetValueToken(ref temp, out valToken))
            {
                return(false);
            }
            token = new UnaryOperatorToken()
            {
                operation = op, value = valToken
            };
            text = temp;
            return(true);
        }
Esempio n. 17
0
        internal override bool TryGetToken(ref string text, out TokenBase token)
        {
            token = null;
            if (!text.StartsWith("throw"))
            {
                return(false);
            }
            string temp = text.Substring(5).TrimStart();

            TokenBase valToken = null;

            if (!EquationTokenizer.TryGetValueToken(ref temp, out valToken))
            {
                return(false);
            }

            text  = temp;
            token = new ThrowToken()
            {
                Exception = valToken
            };
            return(true);
        }
Esempio n. 18
0
        internal override bool TryGetToken(ref string text, out TokenBase token)
        {
            token = null;
            string temp = text.TrimStart();

            if (!temp.StartsWith("as"))
            {
                return(false);
            }
            temp = temp.Substring(2).TrimStart();
            var name = GetNameMatches(temp, null, null).Reverse().FirstOrDefault(tuple => tuple.Item1 is Type);

            if (name == null || (name.Item2.Length != 0 && name.Item2[0] == '.'))
            {
                return(false);
            }
            text  = name.Item2.TrimStart();
            token = new AsToken()
            {
                Type = name.Item1 as Type
            };
            return(true);
        }
Esempio n. 19
0
 internal override bool TryGetToken(ref string text, out TokenBase token, bool requireReturnValue = true)
 {
     token = null;
     return(true);
 }
Esempio n. 20
0
 internal PostTokenChainToken(TokenBase token)
 {
     Target = token;
 }
Esempio n. 21
0
 internal override bool SetPostTarget(TokenBase target)
 {
     Target = target;
     return(true);
 }
Esempio n. 22
0
        internal override bool TryGetToken(ref string text, out TokenBase token, bool requireReturnValue = true)
        {
            token = null;
            var           list = new List <TokenBase>();
            List <string> split;
            string        temp = text;

            if (!TrySplitByCommas(ref temp, open, close, out split))
            {
                return(false);
            }
            foreach (string str in split)
            {
                TokenBase newToken;
                string    s = str.Trim();
                if (allowSubLists && s.StartsWith(open.ToString()) && s.EndsWith(close.ToString()))
                {
                    if (new ArgumentListToken(open, close).TryGetToken(ref s, out newToken))
                    {
                        list.Add(newToken);
                    }
                    else
                    {
                        return(false);
                    }
                }
                else if (findAssignments)
                {
                    if (new LambdaAssignmentToken(assignmentType).TryGetToken(ref s, out newToken))
                    {
                        list.Add(newToken);
                    }
                    else
                    {
                        return(false);
                    }
                }
                else if (allowTypeCasts)
                {
                    if (new TypeCastToken(false).TryGetToken(ref s, out newToken))
                    {
                        string    nameTemp = "$" + s;
                        TokenBase tokenTemp;
                        if (!new ParameterToken().TryGetToken(ref nameTemp, out tokenTemp) || !String.IsNullOrWhiteSpace(nameTemp))
                        {
                            return(false);
                        }
                        (newToken as TypeCastToken).Target = tokenTemp;
                        list.Add(newToken);
                    }
                    else
                    {
                        string    nameTemp = "$" + s;
                        TokenBase tokenTemp;
                        if (!new ParameterToken().TryGetToken(ref nameTemp, out tokenTemp) || !String.IsNullOrWhiteSpace(nameTemp))
                        {
                            return(false);
                        }
                        list.Add(tokenTemp);
                    }
                }
                else
                {
                    if (EquationTokenizer.TryEvaluateExpression(str.Trim(), out newToken))
                    {
                        list.Add(newToken);
                    }
                    else
                    {
                        return(false);
                    }
                }
            }
            token = new ArgumentListToken('\0', '\0')
            {
                Arguments = list.ToArray()
            };
            text = temp;
            return(true);
        }
Esempio n. 23
0
        internal override bool TryGetToken(ref string text, out TokenBase token, bool requireReturnValue = true)
        {
            token = null;
            if (text.Length == 0)
            {
                return(false);
            }
            if (text[0] == '\'')
            {
                int count = 1;
                while (count < text.Length && !(text[count] == '\'' && text[count - 1] != '\\'))
                {
                    ++count;
                }
                if (count > text.Length)
                {
                    return(false);
                }
                if (text.Length > count + 1 && text[count + 1] == 'c')
                {
                    if (count > 2)
                    {
                        throw new Exception("The string '" + text.Substring(1, count - 1) + "' can not be interpreted as a character.");
                    }
                    token = new ConstantToken()
                    {
                        Value = text[1]
                    };
                    ++count;
                }
                else
                {
                    token = new ConstantToken()
                    {
                        Value = text.Substring(1, count - 1)
                    }
                };
                text = text.Substring(count + 1);
                return(true);
            }
            if (text.Length >= 4 && text.Substring(0, 4).ToLower() == "true")
            {
                text  = text.Substring(4);
                token = new ConstantToken()
                {
                    Value = true
                };
                return(true);
            }
            if (text.Length >= 5 && text.Substring(0, 5).ToLower() == "false")
            {
                text  = text.Substring(5);
                token = new ConstantToken()
                {
                    Value = false
                };
                return(true);
            }
            if (text.Length >= 4 && text.Substring(0, 4).ToLower() == "null")
            {
                text  = text.Substring(4);
                token = new ConstantToken()
                {
                    Value = null
                };
                return(true);
            }
            {
                int count = 0;
                while (count < text.Length && (Char.IsDigit(text[count]) || text[count] == '.'))
                {
                    ++count;
                }
                if (count > 0 && text[count - 1] == '.')
                {
                    --count;
                }
                if (count == 0)
                {
                    return(false);
                }

                string temp = text.Substring(0, count);
                if (text.Length > count)
                {
                    char c = Char.ToLower(text[count]);
                    ++count;
                    object ret = null;
                    if (c == 'u' && text.Length > count + 1 && Char.ToLower(text[count]) == 'l')
                    {
                        ulong val;
                        if (UInt64.TryParse(temp, NumberStyles.Any, new CultureInfo("en-us"), out val))
                        {
                            ret = val;
                            ++count;
                        }
                    }
                    else if (c == 'u')
                    {
                        uint val;
                        if (UInt32.TryParse(temp, NumberStyles.Any, new CultureInfo("en-us"), out val))
                        {
                            ret = val;
                        }
                    }
                    else if (c == 'l')
                    {
                        long val;
                        if (Int64.TryParse(temp, NumberStyles.Any, new CultureInfo("en-us"), out val))
                        {
                            ret = val;
                        }
                    }
                    else if (c == 'f')
                    {
                        float val;
                        if (Single.TryParse(temp, NumberStyles.Any, new CultureInfo("en-us"), out val))
                        {
                            ret = val;
                        }
                    }
                    else if (c == 'd')
                    {
                        double val;
                        if (Double.TryParse(temp, NumberStyles.Any, new CultureInfo("en-us"), out val))
                        {
                            ret = val;
                        }
                    }
                    else if (c == 'm')
                    {
                        decimal val;
                        if (Decimal.TryParse(temp, NumberStyles.Any, new CultureInfo("en-us"), out val))
                        {
                            ret = val;
                        }
                    }
                    if (ret != null)
                    {
                        text  = text.Substring(count);
                        token = new ConstantToken()
                        {
                            Value = ret
                        };
                        return(true);
                    }
                    --count;
                }
                double val1;
                int    val2;
                if (temp.Contains('.'))
                {
                    if (Double.TryParse(temp, NumberStyles.Any, new CultureInfo("en-us"), out val1))
                    {
                        text  = text.Substring(count);
                        token = new ConstantToken()
                        {
                            Value = val1
                        };
                        return(true);
                    }
                }
                else if (Int32.TryParse(temp, NumberStyles.Any, new CultureInfo("en-us"), out val2))
                {
                    text  = text.Substring(count);
                    token = new ConstantToken()
                    {
                        Value = val2
                    };
                    return(true);
                }
            }
            return(false);
        }
Esempio n. 24
0
 internal virtual bool SetPostTarget(TokenBase target)
 {
     return(false);
 }
Esempio n. 25
0
		internal override bool TryGetToken(ref string text, out TokenBase token, bool requireReturnValue = true)
		{
			throw new NotImplementedException();
		}
Esempio n. 26
0
 internal override bool TryGetToken(ref string text, out TokenBase token)
 {
     token = null;
     return(true);
 }
Esempio n. 27
0
 internal abstract bool TryGetToken(ref string text, out TokenBase token, bool requireReturnValue = true);
Esempio n. 28
0
 internal override void SetPostTarget(TokenBase target)
 {
     Target = target;
 }
Esempio n. 29
0
 internal abstract bool TryGetToken(ref string text, out TokenBase token);
Esempio n. 30
0
		internal BinaryOperatorToken(TokenBase left, TokenBase right, Operator operation)
		{
			this.Left = left;
			this.Right = right;
			this.Operation = operation;
		}