Esempio n. 1
0
        public override IEnumerable <Token> Parse(string ETLString, TokenFactory tokenFactory)
        {
            var            strs      = SplitString(ETLString);
            List <Token>   retTokens = new List <Token>(strs.Count());
            Regex          _matcher;
            ExpressionType _type;

            foreach (string str in strs)
            {
                try
                {
                    _type = tokenIdentifiers.First(ti =>
                    {
                        _matcher = new Regex(ti.Item1, RegexOptions.IgnoreCase);
                        return(_matcher.IsMatch(str));
                    }).Item2;
                }
                catch (InvalidOperationException ex)
                {
                    throw new InvalidExpressionException($"Unrecognized Token {str}", ex);
                }
                if (_type.IsOperand())
                {
                    retTokens.Add(tokenFactory.CreateValueToken(_type, Convert.ChangeType(str, ValueExpTypeToValueType[_type])));
                }
                else if (_type.IsOperator())
                {
                    retTokens.Add(tokenFactory.CreateToken(_type));
                }
                else if (_type.IsSpecial())
                {
                    retTokens.Add(tokenFactory.CreateSpecialToken(_type));
                }
                else
                {
                    throw new ArgumentException($"Unrecoginzed Type: {_type.ToString()}");
                }
            }
            return(retTokens);
        }