コード例 #1
0
        private static void ParsePrimary(ParseState state, Program program)
        {
            if (state.CurrentToken == TokenType.LParen)
            {
                state.Advance();

                ParseClause(state, program);

                state.ExpectToken(TokenType.RParen);
                state.Advance();
            }
            else
            {
                ParseExpression(state, program);

                if (state.IsCompOp)                 // expr op expr
                {
                    var inst = GetInstruction(state.CurrentToken);

                    state.Advance();

                    ParseExpression(state, program);

                    program.Emit(inst);
                }
                else if (state.IsSymbol("NOT"))                 // expr NOT IN (expr, expr, etc)
                {
                    state.Advance();
                    state.ExpectSymbol("IN");

                    ParseInValueList(state, program, true);
                }
                else if (state.IsSymbol("IN"))                 // expr IN (expr, expr, etc)
                {
                    ParseInValueList(state, program, false);
                }
                else if (state.IsSymbol("IS"))                 // expr IS [NOT] NULL
                {
                    state.Advance();

                    bool negate = false;

                    if (state.IsSymbol("NOT"))
                    {
                        negate = true;
                        state.Advance();
                    }

                    state.ExpectSymbol("NULL");
                    state.Advance();

                    program.Emit(negate ? Instruction.NotNull : Instruction.IsNull);
                }
                else
                {
                    throw SyntaxError(state.Index, "Expected expr, IN, or IS; got {0}",
                                      state.CurrentTokenString);
                }
            }
        }