public static List<Token> ParseTokens(String expression) { var variable = new Regex(@"^\s*([a-zA-Z.]+)"); var operation = new Regex(@"^\s*(&&|\|\||!=|==|<=|>=|!|<|>)"); var bracket = new Regex(@"^\s*([\(\)]+)"); var constant = new Regex(@"^\s*([0-9]*\.?[0-9]+)"); List<Token> result = new List<Token>(); String rest = expression; Match match = null; while (rest.Length > 0) { match = variable.Match(rest); if (match.Success) { var text = match.Groups[0].Value.Trim(); Token token = new Variable { Text = text }; result.Add(token); rest = CutOutOccurence(rest, text); continue; } match = operation.Match(rest); if (match.Success) { var text = match.Groups[0].Value.Trim(); if (!Operators.ContainsKey(text)) { UnityEngine.Debug.LogError("Неизвестный оператор " + text); return null; } var op = Operators[text]; Token token = new Operator { Text = text, Type = op.Type, NumArgs = op.NumArgs, Priority = op.Priority }; result.Add(token); rest = CutOutOccurence(rest, text); continue; } match = bracket.Match(rest); if (match.Success) { var text = match.Groups[0].Value.Trim(); if (!BracketTypes.ContainsKey(text)) { UnityEngine.Debug.LogError("Неизвестный символ " + text); return null; } var type = BracketTypes[text]; Token token = new Bracket { Text = text, Type = type }; result.Add(token); rest = CutOutOccurence(rest, text); continue; } match = constant.Match(rest); if (match.Success) { var text = match.Groups[0].Value.Trim(); float value = Convert.ToSingle(text); Token token = new Contant { Text = text, Value = (int)value }; result.Add(token); rest = CutOutOccurence(rest, text); continue; } Debug.LogError("Ошибка распознавания токенов в строке " + rest); return null; } return result; }