예제 #1
0
        public bool Forward()
        {
            if (_curToken != null)
            {
                if (_m.IsError)
                {
                    return(false);
                }
                if (_curToken == Token.EndOfInput)
                {
                    return(true);
                }
                if (!_m.IsEnd && !_m.MatchWhiteSpaces(0))
                {
                    _m.Forward(1);
                }
            }
            if (_m.IsEnd)
            {
                _curToken = Token.EndOfInput;
                return(true);
            }
            switch (_m.Head)
            {
            case '\'':
                _m.UncheckedMove(1);
                return(ParseQuotedString());

            case ',':
                _curToken = Token.Comma;
                return(_m.UncheckedMove(1));

            case '(':
                _curToken = Token.LeftParenthesis;
                return(_m.UncheckedMove(1));

            case ')':
                _curToken = Token.RightParenthesis;
                return(_m.UncheckedMove(1));

            case '$': return(ParseProperty());

            case '!':
                _m.UncheckedMove(1);
                if (_m.TryMatchChar('='))
                {
                    _curToken = Token.NotEqualTo;
                    return(true);
                }
                _curToken = Token.Not;
                return(true);

            case '%': return(_m.SetError("BuiltIn or Custom %(metadata) are not supported.", "Tokenizer"));

            case '@': return(_m.SetError("Item @(lists) are not supported.", "Tokenizer"));

            case '>':
                _m.UncheckedMove(1);
                if (_m.TryMatchChar('='))
                {
                    _curToken = Token.GreaterThanOrEqualTo;
                    return(true);
                }
                _curToken = Token.GreaterThan;
                return(true);

            case '<':
                _m.UncheckedMove(1);
                if (_m.TryMatchChar('='))
                {
                    _curToken = Token.LessThanOrEqualTo;
                    return(true);
                }
                _curToken = Token.LessThan;
                return(true);

            case '=':
                _m.UncheckedMove(1);
                if (!_m.MatchChar('='))
                {
                    return(false);
                }
                _curToken = Token.EqualTo;
                return(true);

            default:
                if (!TryParseNumeric() &&
                    !TryParseIdentifierOrLogicalConnector())
                {
                    return(_m.SetError("Unrecognized token.", "Tokenizer"));
                }
                break;
            }
            return(true);
        }