コード例 #1
0
ファイル: Parser.cs プロジェクト: furesoft/SharpHSQL
        private Expression ReadTerm()
        {
            Expression r = null;

            if (iToken == ExpressionType.DatabaseColumn) {
                string name = sToken;

                r = new Expression (sTable, sToken);

                Read ();

                if (iToken == ExpressionType.Open) {
                    Function f = new Function (dDatabase.GetAlias (name), cChannel);
                    /*int len = */f.GetArgCount ();
                    int i = 0;

                    Read ();

                    if (iToken != ExpressionType.Close) {
                        while (true) {
                            f.SetArgument (i++, ReadOr ());

                            if (iToken != ExpressionType.Comma) {
                                break;
                            }

                            Read ();
                        }
                    }

                    ReadThis (ExpressionType.Close);

                    r = new Expression (f);
                }
            } else if (iToken == ExpressionType.Negate) {
                ExpressionType type = iToken;

                Read ();

                r = new Expression (type, ReadTerm (), null);
            } else if (iToken == ExpressionType.Plus) {
                Read ();

                r = ReadTerm ();
            } else if (iToken == ExpressionType.Open) {
                Read ();

                r = ReadOr ();

                if (iToken != ExpressionType.Close) {
                    throw TracingHelper.Error (TracingHelper.UnexpectedToken, sToken);
                }

                Read ();
            } else if (iToken == ExpressionType.Value) {
                r = new Expression (iType, oData);

                Read ();
            } else if (iToken == ExpressionType.Select) {
                r = new Expression (ParseSelect ());

                Read ();
            } else if (iToken == ExpressionType.Multiply) {
                r = new Expression (sTable, null);

                Read ();
            } else if (iToken == ExpressionType.IfNull || iToken == ExpressionType.Concat) {
                ExpressionType type = iToken;

                Read ();
                ReadThis (ExpressionType.Open);

                r = ReadOr ();

                ReadThis (ExpressionType.Comma);

                r = new Expression (type, r, ReadOr ());

                ReadThis (ExpressionType.Close);
            } else if (iToken == ExpressionType.CaseWhen) {
                ExpressionType type = iToken;

                Read ();
                ReadThis (ExpressionType.Open);

                r = ReadOr ();

                ReadThis (ExpressionType.Comma);

                Expression thenelse = ReadOr ();

                ReadThis (ExpressionType.Comma);

                // thenelse part is never evaluated; only init
                thenelse = new Expression (type, thenelse, ReadOr ());
                r = new Expression (type, r, thenelse);

                ReadThis (ExpressionType.Close);
            } else if (iToken == ExpressionType.Convert) {
                ExpressionType type = iToken;

                Read ();
                ReadThis (ExpressionType.Open);

                r = ReadOr ();

                ReadThis (ExpressionType.Comma);

                ColumnType t = Column.GetColumnType (sToken);

                r = new Expression (type, r, null);

                r.SetDataType (t);
                Read ();
                ReadThis (ExpressionType.Close);
            } else if (iToken == ExpressionType.Cast) {
                Read ();
                ReadThis (ExpressionType.Open);

                r = ReadOr ();

                TracingHelper.Check (sToken.Equals ("AS"), TracingHelper.UnexpectedToken, sToken);
                Read ();

                ColumnType t = Column.GetColumnType (sToken);

                r = new Expression (ExpressionType.Convert, r, null);

                r.SetDataType (t);
                Read ();
                ReadThis (ExpressionType.Close);
            } else if (iToken == ExpressionType.Variable) {
                ExpressionType type = iToken;

                r = new Expression (null, sToken);
                r.Type = type;

                string columnType = tTokenizer.GetString ();

                if (Column.IsValidDataType (columnType)) {
                    ColumnType iType = Column.GetColumnType (columnType);

                    if (iType == ColumnType.VarChar && dDatabase.IsIgnoreCase) {
                        iType = ColumnType.VarCharIgnoreCase;
                    }

                    r.SetDataType (iType);
                    r.SetArg (null);
                } else {
                    tTokenizer.Back ();

                    Declare declare = cChannel.GetDeclare (r.ColumnName);
                    if (declare != null) {
                        r = declare.Expression;
                    } else {
                        throw TracingHelper.Error (TracingHelper.VARIABLE_NOT_DECLARED, sToken);
                    }
                }

                Read ();
            } else if (iToken == ExpressionType.SquareBracketLeft) {
                ReadThis (ExpressionType.SquareBracketLeft);
                var t = ReadTerm ();
                if (t.Type != ExpressionType.DatabaseColumn) {
                    throw TracingHelper.Error (TracingHelper.FIELD_OF_TABLE_IS_EXPECTED, /*tTokenizer.GetString()*/ "???");
                }
                ReadThis (ExpressionType.SquareBracketRight);
                return t;
            } else {
                throw TracingHelper.Error (TracingHelper.UnexpectedToken, sToken);
            }

            return r;
        }