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); }
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); }