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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
internal override bool TryGetToken(ref string text, out TokenBase token, bool requireReturnValue = true) { token = null; return(true); }
internal PostTokenChainToken(TokenBase token) { Target = token; }
internal override bool SetPostTarget(TokenBase target) { Target = target; return(true); }
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); }
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); }
internal virtual bool SetPostTarget(TokenBase target) { return(false); }
internal override bool TryGetToken(ref string text, out TokenBase token, bool requireReturnValue = true) { throw new NotImplementedException(); }
internal override bool TryGetToken(ref string text, out TokenBase token) { token = null; return(true); }
internal abstract bool TryGetToken(ref string text, out TokenBase token, bool requireReturnValue = true);
internal override void SetPostTarget(TokenBase target) { Target = target; }
internal abstract bool TryGetToken(ref string text, out TokenBase token);
internal BinaryOperatorToken(TokenBase left, TokenBase right, Operator operation) { this.Left = left; this.Right = right; this.Operation = operation; }