Esempio n. 1
0
        public Token Read()
        {
            this.op    = (Operator)null;
            this.token = Token.None;
            bool flag;

            do
            {
                flag          = true;
                this.startPos = this.reader.Position;
                char c = this.reader.Read();
                switch (c)
                {
                case char.MinValue:
                    this.token = Token.EOF;
                    break;

                case '\t':
                case '\n':
                case '\r':
                case ' ':
                    this.ReadWhiteSpaces();
                    flag = false;
                    break;

                case '"':
                    this.ReadString('"');
                    this.CheckToken(Token.StringConst);
                    break;

                case '#':
                    this.ReadDate();
                    this.CheckToken(Token.Date);
                    break;

                case '%':
                    this.op    = Operator.Modulo;
                    this.token = Token.BinaryOp;
                    break;

                case '&':
                    this.op    = Operator.BitwiseAnd;
                    this.token = Token.BinaryOp;
                    break;

                case '\'':
                    this.ReadString('\'');
                    this.CheckToken(Token.StringConst);
                    break;

                case '(':
                    this.token = Token.LeftParen;
                    break;

                case ')':
                    this.token = Token.RightParen;
                    break;

                case '*':
                    this.op    = Operator.Multiply;
                    this.token = Token.BinaryOp;
                    break;

                case '+':
                    this.op    = Operator.Plus;
                    this.token = Token.BinaryOp;
                    break;

                case ',':
                    this.token = Token.ListSeparator;
                    break;

                case '-':
                    this.op    = Operator.Minus;
                    this.token = Token.BinaryOp;
                    break;

                case '.':
                    if (this.client.PrevOperand == OperandType.None)
                    {
                        this.ReadNumber();
                        break;
                    }
                    this.token = Token.Dot;
                    break;

                case '/':
                    this.op    = Operator.Divide;
                    this.token = Token.BinaryOp;
                    break;

                case '<':
                    this.token = Token.BinaryOp;
                    this.ReadWhiteSpaces();
                    if ('=' == this.reader.Current)
                    {
                        this.op = Operator.LessOrEqual;
                        int num = (int)this.reader.Read();
                        break;
                    }
                    if ('>' == this.reader.Current)
                    {
                        this.op = Operator.NotEqual;
                        int num = (int)this.reader.Read();
                        break;
                    }
                    this.op = Operator.LessThen;
                    break;

                case '=':
                    this.op    = Operator.EqualTo;
                    this.token = Token.BinaryOp;
                    break;

                case '>':
                    this.token = Token.BinaryOp;
                    this.ReadWhiteSpaces();
                    if ('=' == this.reader.Current)
                    {
                        this.op = Operator.GreaterOrEqual;
                        int num = (int)this.reader.Read();
                        break;
                    }
                    this.op = Operator.GreaterThen;
                    break;

                case '@':
                    this.token = Token.Parameter;
                    break;

                case '[':
                    this.ReadName(']', '\\', "]\\");
                    this.CheckToken(Token.Name);
                    break;

                case '^':
                    this.op    = Operator.BitwiseXor;
                    this.token = Token.BinaryOp;
                    break;

                case '`':
                    this.ReadName('`', '`', "`");
                    this.CheckToken(Token.Name);
                    break;

                case '|':
                    this.op    = Operator.BitwiseOr;
                    this.token = Token.BinaryOp;
                    break;

                case '~':
                    this.op    = Operator.BitwiseNot;
                    this.token = Token.BinaryOp;
                    break;

                default:
                    if ('0' == c && ('x' == this.reader.Current || 'X' == this.reader.Current))
                    {
                        int num = (int)this.reader.Read();
                        this.ReadHex();
                        this.token = Token.NumericHex;
                        break;
                    }
                    if (char.IsDigit(c))
                    {
                        this.ReadNumber();
                        break;
                    }
                    this.ReadReserved();
                    if (this.token == Token.None)
                    {
                        if (char.IsLetter(c) || '_' == c)
                        {
                            this.ReadName();
                            if (this.token != Token.None)
                            {
                                this.CheckToken(Token.Name);
                                break;
                            }
                        }
                        this.token = Token.Unknown;
                        throw LexicalException.UnknownToken(this.TokenString, this.startPos + 1);
                    }
                    break;
                }
            }while (!flag);
            return(this.token);
        }
Esempio n. 2
0
        public Token Read()
        {
            bool toStop = true;

            this.op    = null;
            this.token = Token.None;

            do
            {
                toStop        = true;
                this.startPos = this.reader.Position;

                char ch = this.reader.Read();
                switch (ch)
                {
                case '\0':
                    this.token = Token.EOF;
                    break;

                case ' ':
                case '\t':
                case '\n':
                case '\r':
                    this.ReadWhiteSpaces();
                    toStop = false;
                    break;

                case '(':
                    this.token = Token.LeftParen;
                    break;

                case ')':
                    this.token = Token.RightParen;
                    break;

                case '+':
                    this.op    = Operator.Plus;
                    this.token = Token.BinaryOp;
                    break;

                case '-':
                    this.op    = Operator.Minus;
                    this.token = Token.BinaryOp;
                    break;

                case '*':
                    this.op    = Operator.Multiply;
                    this.token = Token.BinaryOp;
                    break;

                case '/':
                    this.op    = Operator.Divide;
                    this.token = Token.BinaryOp;
                    break;

                case '%':
                    this.op    = Operator.Modulo;
                    this.token = Token.BinaryOp;
                    break;

                case '&':
                    this.op    = Operator.BitwiseAnd;
                    this.token = Token.BinaryOp;
                    break;

                case '|':
                    this.op    = Operator.BitwiseOr;
                    this.token = Token.BinaryOp;
                    break;

                case '^':
                    this.op    = Operator.BitwiseXor;
                    this.token = Token.BinaryOp;
                    break;

                case '~':
                    this.op    = Operator.BitwiseNot;
                    this.token = Token.BinaryOp;
                    break;

                case '=':
                    this.op    = Operator.EqualTo;
                    this.token = Token.BinaryOp;
                    break;

                case '<':
                    this.token = Token.BinaryOp;
                    this.ReadWhiteSpaces();
                    if ('=' == this.reader.Current)
                    {
                        this.op = Operator.LessOrEqual;
                        this.reader.Read();
                    }
                    else if ('>' == this.reader.Current)
                    {
                        this.op = Operator.NotEqual;
                        this.reader.Read();
                    }
                    else
                    {
                        this.op = Operator.LessThen;
                    }
                    break;

                case '>':
                    this.token = Token.BinaryOp;
                    this.ReadWhiteSpaces();
                    if ('=' == this.reader.Current)
                    {
                        this.op = Operator.GreaterOrEqual;
                        this.reader.Read();
                    }
                    else
                    {
                        this.op = Operator.GreaterThen;
                    }
                    break;

                case '#':   // date
                    this.ReadDate();
                    this.CheckToken(Token.Date);
                    break;

                case '\'':  // string const
                    this.ReadString('\'');
                    this.CheckToken(Token.StringConst);
                    break;

                case '"':  // string const
                    this.ReadString('"');
                    this.CheckToken(Token.StringConst);
                    break;

                case '`':
                    this.ReadName('`', '`', "`");
                    this.CheckToken(Token.Name);
                    break;

                case '[':
                    this.ReadName(']', Lexer.Escape, @"]\");
                    this.CheckToken(Token.Name);
                    break;

                case '.':
                    if (OperandType.None == this.client.PrevOperand)
                    {
                        this.ReadNumber();
                    }
                    else
                    {
                        this.token = Token.Dot;
                    }
                    break;

                case ',':
                    this.token = Token.ListSeparator;
                    break;


                case '@':
                    this.token = Token.Parameter;
                    break;

                //case '!':
                //        break;

                default:
                    if ('0' == ch && ('x' == this.reader.Current || 'X' == this.reader.Current))
                    {
                        this.reader.Read();

                        this.ReadHex();
                        this.token = Token.NumericHex;
                    }
                    else if (char.IsDigit(ch))
                    {
                        this.ReadNumber();
                    }
                    else
                    {
                        this.ReadReserved();
                        if (Token.None == this.token)
                        {
                            if (char.IsLetter(ch) || '_' == ch)
                            {
                                this.ReadName();
                                if (Token.None != this.token)
                                {
                                    this.CheckToken(Token.Name);
                                    break;
                                }
                            }
                            this.token = Token.Unknown;
                            throw LexicalException.UnknownToken(this.TokenString, this.startPos + 1);
                        }
                    }
                    break;
                }
            } while (!toStop);

            return(this.token);
        }