Exemple #1
0
    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;
    }