Tup.Cobar4Net.Parser.Recognizer.Mysql.Syntax.MySqlDdlParser.DataType C# (CSharp) Метод

DataType() приватный Метод

private DataType ( ) : DataType
Результат Tup.Cobar4Net.Parser.Ast.Fragment.Ddl.DataType
        private DdlDatatype DataType()
        {
            var typeName = DataTypeName.None;
            var unsigned = false;
            var zerofill = false;
            var binary = false;
            IExpression length = null;
            IExpression decimals = null;
            Identifier charSet = null;
            Identifier collation = null;
            IList<IExpression> collectionVals = null;
            switch (lexer.Token())
            {
                case MySqlToken.KwTinyint:
                {
                    // | TINYINT[(length)] [UNSIGNED] [ZEROFILL]
                    typeName = DataTypeName.Tinyint;
                    if (lexer.NextToken() == MySqlToken.PuncLeftParen)
                    {
                        lexer.NextToken();
                        length = exprParser.Expression();
                        Match(MySqlToken.PuncRightParen);
                    }
                    if (lexer.Token() == MySqlToken.KwUnsigned)
                    {
                        unsigned = true;
                        lexer.NextToken();
                    }
                    if (lexer.Token() == MySqlToken.KwZerofill)
                    {
                        zerofill = true;
                        lexer.NextToken();
                    }
                    goto typeName_break;
                }

                case MySqlToken.KwSmallint:
                {
                    // | SMALLINT[(length)] [UNSIGNED] [ZEROFILL]
                    typeName = DataTypeName.Smallint;
                    if (lexer.NextToken() == MySqlToken.PuncLeftParen)
                    {
                        lexer.NextToken();
                        length = exprParser.Expression();
                        Match(MySqlToken.PuncRightParen);
                    }
                    if (lexer.Token() == MySqlToken.KwUnsigned)
                    {
                        unsigned = true;
                        lexer.NextToken();
                    }
                    if (lexer.Token() == MySqlToken.KwZerofill)
                    {
                        zerofill = true;
                        lexer.NextToken();
                    }
                    goto typeName_break;
                }

                case MySqlToken.KwMediumint:
                {
                    // | MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]
                    typeName = DataTypeName.Mediumint;
                    if (lexer.NextToken() == MySqlToken.PuncLeftParen)
                    {
                        lexer.NextToken();
                        length = exprParser.Expression();
                        Match(MySqlToken.PuncRightParen);
                    }
                    if (lexer.Token() == MySqlToken.KwUnsigned)
                    {
                        unsigned = true;
                        lexer.NextToken();
                    }
                    if (lexer.Token() == MySqlToken.KwZerofill)
                    {
                        zerofill = true;
                        lexer.NextToken();
                    }
                    goto typeName_break;
                }

                case MySqlToken.KwInteger:
                case MySqlToken.KwInt:
                {
                    // | INT[(length)] [UNSIGNED] [ZEROFILL]
                    // | INTEGER[(length)] [UNSIGNED] [ZEROFILL]
                    typeName = DataTypeName.Int;
                    if (lexer.NextToken() == MySqlToken.PuncLeftParen)
                    {
                        lexer.NextToken();
                        length = exprParser.Expression();
                        Match(MySqlToken.PuncRightParen);
                    }
                    if (lexer.Token() == MySqlToken.KwUnsigned)
                    {
                        unsigned = true;
                        lexer.NextToken();
                    }
                    if (lexer.Token() == MySqlToken.KwZerofill)
                    {
                        zerofill = true;
                        lexer.NextToken();
                    }
                    goto typeName_break;
                }

                case MySqlToken.KwBigint:
                {
                    // | BIGINT[(length)] [UNSIGNED] [ZEROFILL]
                    typeName = DataTypeName.Bigint;
                    if (lexer.NextToken() == MySqlToken.PuncLeftParen)
                    {
                        lexer.NextToken();
                        length = exprParser.Expression();
                        Match(MySqlToken.PuncRightParen);
                    }
                    if (lexer.Token() == MySqlToken.KwUnsigned)
                    {
                        unsigned = true;
                        lexer.NextToken();
                    }
                    if (lexer.Token() == MySqlToken.KwZerofill)
                    {
                        zerofill = true;
                        lexer.NextToken();
                    }
                    goto typeName_break;
                }

                case MySqlToken.KwReal:
                {
                    // | REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]
                    typeName = DataTypeName.Real;
                    if (lexer.NextToken() == MySqlToken.PuncLeftParen)
                    {
                        lexer.NextToken();
                        length = exprParser.Expression();
                        Match(MySqlToken.PuncComma);
                        decimals = exprParser.Expression();
                        Match(MySqlToken.PuncRightParen);
                    }
                    if (lexer.Token() == MySqlToken.KwUnsigned)
                    {
                        unsigned = true;
                        lexer.NextToken();
                    }
                    if (lexer.Token() == MySqlToken.KwZerofill)
                    {
                        zerofill = true;
                        lexer.NextToken();
                    }
                    goto typeName_break;
                }

                case MySqlToken.KwDouble:
                {
                    // | DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]
                    typeName = DataTypeName.Double;
                    if (lexer.NextToken() == MySqlToken.PuncLeftParen)
                    {
                        lexer.NextToken();
                        length = exprParser.Expression();
                        Match(MySqlToken.PuncComma);
                        decimals = exprParser.Expression();
                        Match(MySqlToken.PuncRightParen);
                    }
                    if (lexer.Token() == MySqlToken.KwUnsigned)
                    {
                        unsigned = true;
                        lexer.NextToken();
                    }
                    if (lexer.Token() == MySqlToken.KwZerofill)
                    {
                        zerofill = true;
                        lexer.NextToken();
                    }
                    goto typeName_break;
                }

                case MySqlToken.KwFloat:
                {
                    // | FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]
                    typeName = DataTypeName.Float;
                    if (lexer.NextToken() == MySqlToken.PuncLeftParen)
                    {
                        lexer.NextToken();
                        length = exprParser.Expression();
                        Match(MySqlToken.PuncComma);
                        decimals = exprParser.Expression();
                        Match(MySqlToken.PuncRightParen);
                    }
                    if (lexer.Token() == MySqlToken.KwUnsigned)
                    {
                        unsigned = true;
                        lexer.NextToken();
                    }
                    if (lexer.Token() == MySqlToken.KwZerofill)
                    {
                        zerofill = true;
                        lexer.NextToken();
                    }
                    goto typeName_break;
                }

                case MySqlToken.KwNumeric:
                case MySqlToken.KwDecimal:
                case MySqlToken.KwDec:
                {
                    // | DECIMAL[(length[,decimals])] [UNSIGNED] [ZEROFILL]
                    // | NUMERIC[(length[,decimals])] [UNSIGNED] [ZEROFILL]
                    typeName = DataTypeName.Decimal;
                    if (lexer.NextToken() == MySqlToken.PuncLeftParen)
                    {
                        lexer.NextToken();
                        length = exprParser.Expression();
                        if (lexer.Token() == MySqlToken.PuncComma)
                        {
                            Match(MySqlToken.PuncComma);
                            decimals = exprParser.Expression();
                        }
                        Match(MySqlToken.PuncRightParen);
                    }
                    if (lexer.Token() == MySqlToken.KwUnsigned)
                    {
                        unsigned = true;
                        lexer.NextToken();
                    }
                    if (lexer.Token() == MySqlToken.KwZerofill)
                    {
                        zerofill = true;
                        lexer.NextToken();
                    }
                    goto typeName_break;
                }

                case MySqlToken.KwChar:
                {
                    // | CHAR[(length)] [CHARACTER SET charset_name] [COLLATE
                    // collation_name]
                    typeName = DataTypeName.Char;
                    if (lexer.NextToken() == MySqlToken.PuncLeftParen)
                    {
                        lexer.NextToken();
                        length = exprParser.Expression();
                        Match(MySqlToken.PuncRightParen);
                    }
                    if (lexer.Token() == MySqlToken.KwCharacter)
                    {
                        lexer.NextToken();
                        Match(MySqlToken.KwSet);
                        charSet = Identifier();
                    }
                    if (lexer.Token() == MySqlToken.KwCollate)
                    {
                        lexer.NextToken();
                        collation = Identifier();
                    }
                    goto typeName_break;
                }

                case MySqlToken.KwVarchar:
                {
                    // | VARCHAR(length) [CHARACTER SET charset_name] [COLLATE
                    // collation_name]
                    typeName = DataTypeName.Varchar;
                    lexer.NextToken();
                    Match(MySqlToken.PuncLeftParen);
                    length = exprParser.Expression();
                    Match(MySqlToken.PuncRightParen);
                    if (lexer.Token() == MySqlToken.KwCharacter)
                    {
                        lexer.NextToken();
                        Match(MySqlToken.KwSet);
                        charSet = Identifier();
                    }
                    if (lexer.Token() == MySqlToken.KwCollate)
                    {
                        lexer.NextToken();
                        collation = Identifier();
                    }
                    goto typeName_break;
                }

                case MySqlToken.KwBinary:
                {
                    // | BINARY[(length)]
                    typeName = DataTypeName.Binary;
                    if (lexer.NextToken() == MySqlToken.PuncLeftParen)
                    {
                        lexer.NextToken();
                        length = exprParser.Expression();
                        Match(MySqlToken.PuncRightParen);
                    }
                    goto typeName_break;
                }

                case MySqlToken.KwVarbinary:
                {
                    // | VARBINARY(length)
                    typeName = DataTypeName.Varbinary;
                    lexer.NextToken();
                    Match(MySqlToken.PuncLeftParen);
                    length = exprParser.Expression();
                    Match(MySqlToken.PuncRightParen);
                    goto typeName_break;
                }

                case MySqlToken.KwTinyblob:
                {
                    typeName = DataTypeName.Tinyblob;
                    lexer.NextToken();
                    goto typeName_break;
                }

                case MySqlToken.KwBlob:
                {
                    typeName = DataTypeName.Blob;
                    lexer.NextToken();
                    goto typeName_break;
                }

                case MySqlToken.KwMediumblob:
                {
                    typeName = DataTypeName.Mediumblob;
                    lexer.NextToken();
                    goto typeName_break;
                }

                case MySqlToken.KwLongblob:
                {
                    typeName = DataTypeName.Longblob;
                    lexer.NextToken();
                    goto typeName_break;
                }

                case MySqlToken.KwTinytext:
                {
                    // | TINYTEXT [BINARY] [CHARACTER SET charset_name] [COLLATE
                    // collation_name]
                    typeName = DataTypeName.Tinytext;
                    if (lexer.NextToken() == MySqlToken.KwBinary)
                    {
                        lexer.NextToken();
                        binary = true;
                    }
                    if (lexer.Token() == MySqlToken.KwCharacter)
                    {
                        lexer.NextToken();
                        Match(MySqlToken.KwSet);
                        charSet = Identifier();
                    }
                    if (lexer.Token() == MySqlToken.KwCollate)
                    {
                        lexer.NextToken();
                        collation = Identifier();
                    }
                    goto typeName_break;
                }

                case MySqlToken.KwMediumtext:
                {
                    // | MEDIUMTEXT [BINARY] [CHARACTER SET charset_name] [COLLATE
                    // collation_name]
                    typeName = DataTypeName.Mediumtext;
                    if (lexer.NextToken() == MySqlToken.KwBinary)
                    {
                        lexer.NextToken();
                        binary = true;
                    }
                    if (lexer.Token() == MySqlToken.KwCharacter)
                    {
                        lexer.NextToken();
                        Match(MySqlToken.KwSet);
                        charSet = Identifier();
                    }
                    if (lexer.Token() == MySqlToken.KwCollate)
                    {
                        lexer.NextToken();
                        collation = Identifier();
                    }
                    goto typeName_break;
                }

                case MySqlToken.KwLongtext:
                {
                    // | LONGTEXT [BINARY] [CHARACTER SET charset_name] [COLLATE
                    // collation_name]
                    typeName = DataTypeName.Longtext;
                    if (lexer.NextToken() == MySqlToken.KwBinary)
                    {
                        lexer.NextToken();
                        binary = true;
                    }
                    if (lexer.Token() == MySqlToken.KwCharacter)
                    {
                        lexer.NextToken();
                        Match(MySqlToken.KwSet);
                        charSet = Identifier();
                    }
                    if (lexer.Token() == MySqlToken.KwCollate)
                    {
                        lexer.NextToken();
                        collation = Identifier();
                    }
                    goto typeName_break;
                }

                case MySqlToken.KwSet:
                {
                    // | SET(value1,value2,value3,...) [CHARACTER SET charset_name]
                    // [COLLATE collation_name]
                    typeName = DataTypeName.Set;
                    lexer.NextToken();
                    Match(MySqlToken.PuncLeftParen);
                    for (var i = 0; lexer.Token() != MySqlToken.PuncRightParen; ++i)
                    {
                        if (i > 0)
                        {
                            Match(MySqlToken.PuncComma);
                        }
                        else
                        {
                            collectionVals = new List<IExpression>(2);
                        }
                        collectionVals.Add(exprParser.Expression());
                    }
                    Match(MySqlToken.PuncRightParen);
                    if (lexer.Token() == MySqlToken.KwCharacter)
                    {
                        lexer.NextToken();
                        Match(MySqlToken.KwSet);
                        charSet = Identifier();
                    }
                    if (lexer.Token() == MySqlToken.KwCollate)
                    {
                        lexer.NextToken();
                        collation = Identifier();
                    }
                    goto typeName_break;
                }

                case MySqlToken.Identifier:
                {
                    var si = specialIdentifiers.GetValue(lexer.GetStringValueUppercase());
                    if (si != SpecialIdentifier.None)
                    {
                        switch (si)
                        {
                            case SpecialIdentifier.Bit:
                            {
                                // BIT[(length)]
                                typeName = DataTypeName.Bit;
                                if (lexer.NextToken() == MySqlToken.PuncLeftParen)
                                {
                                    lexer.NextToken();
                                    length = exprParser.Expression();
                                    Match(MySqlToken.PuncRightParen);
                                }
                                goto typeName_break;
                            }

                            case SpecialIdentifier.Date:
                            {
                                typeName = DataTypeName.Date;
                                lexer.NextToken();
                                goto typeName_break;
                            }

                            case SpecialIdentifier.Time:
                            {
                                typeName = DataTypeName.Time;
                                lexer.NextToken();
                                goto typeName_break;
                            }

                            case SpecialIdentifier.Timestamp:
                            {
                                typeName = DataTypeName.Timestamp;
                                lexer.NextToken();
                                goto typeName_break;
                            }

                            case SpecialIdentifier.Datetime:
                            {
                                typeName = DataTypeName.Datetime;
                                lexer.NextToken();
                                goto typeName_break;
                            }

                            case SpecialIdentifier.Year:
                            {
                                typeName = DataTypeName.Year;
                                lexer.NextToken();
                                goto typeName_break;
                            }

                            case SpecialIdentifier.Text:
                            {
                                // | TEXT [BINARY] [CHARACTER SET charset_name] [COLLATE
                                // collation_name]
                                typeName = DataTypeName.Text;
                                if (lexer.NextToken() == MySqlToken.KwBinary)
                                {
                                    lexer.NextToken();
                                    binary = true;
                                }
                                if (lexer.Token() == MySqlToken.KwCharacter)
                                {
                                    lexer.NextToken();
                                    Match(MySqlToken.KwSet);
                                    charSet = Identifier();
                                }
                                if (lexer.Token() == MySqlToken.KwCollate)
                                {
                                    lexer.NextToken();
                                    collation = Identifier();
                                }
                                goto typeName_break;
                            }

                            case SpecialIdentifier.Enum:
                            {
                                // | ENUM(value1,value2,value3,...) [CHARACTER SET
                                // charset_name] [COLLATE collation_name]
                                typeName = DataTypeName.Enum;
                                lexer.NextToken();
                                Match(MySqlToken.PuncLeftParen);
                                for (var i_1 = 0; lexer.Token() != MySqlToken.PuncRightParen; ++i_1)
                                {
                                    if (i_1 > 0)
                                    {
                                        Match(MySqlToken.PuncComma);
                                    }
                                    else
                                    {
                                        collectionVals = new List<IExpression>(2);
                                    }
                                    collectionVals.Add(exprParser.Expression());
                                }
                                Match(MySqlToken.PuncRightParen);
                                if (lexer.Token() == MySqlToken.KwCharacter)
                                {
                                    lexer.NextToken();
                                    Match(MySqlToken.KwSet);
                                    charSet = Identifier();
                                }
                                if (lexer.Token() == MySqlToken.KwCollate)
                                {
                                    lexer.NextToken();
                                    collation = Identifier();
                                }
                                goto typeName_break;
                            }
                        }
                    }
                    goto default;
                }

                default:
                {
                    return null;
                }
            }
            typeName_break:
            ;
            return new DdlDatatype(typeName, unsigned
                , zerofill, binary, length, decimals, charSet, collation, collectionVals);
        }