Exemple #1
0
        public Tree Parse(string text)
        {
            this._scanner = new Scanner(text);
            this._tree    = new Tree();
            Token token = this.NextToken();

            if (token != Token.EndOfFile)
            {
                this.CheckStartableToken(token);
                while (token != Token.EndOfFile)
                {
                    MemberOp expression;
                    if (IsConstTocken(token))
                    {
                        this.ParseConst();
                        goto Label_022A;
                    }
                    if (this._tree._isStart && ((token == Token.Subtract) || (token == Token.Add)))
                    {
                        Constant expr = new Constant(0);
                        this._tree.AddOperand(expr);
                        BinaryOp op = BinaryOp.CreateOp(token);
                        this._tree.AddOperator(op);
                        goto Label_022A;
                    }
                    if (IsBinaryOp(token))
                    {
                        this.ParseBinaryOp();
                        goto Label_022A;
                    }
                    if (IsUnaryOp(token))
                    {
                        this.ParseUnaryOp();
                        goto Label_022A;
                    }
                    switch (token)
                    {
                    case Token.LeftIndexer:
                        this.ParseIndexer();
                        goto Label_022A;

                    case Token.RightIndexer:
                        this._tree.Pop('[');
                        goto Label_022A;

                    case Token.ConditionalIf:
                        this.ParseConditional();
                        goto Label_022A;

                    case Token.ConditionalSemicolon:
                        this.ParseConditionalSemicolon();
                        goto Label_022A;

                    case Token.Member:
                        this.ParseMember();
                        goto Label_022A;

                    case Token.LeftParen:
                        if (this._tree._top.Expression is MemberOp)
                        {
                            expression = (MemberOp)this._tree._top.Expression;
                            if (expression.IsFunction)
                            {
                                throw new ParserException("()()not allowed");
                            }
                            break;
                        }
                        goto Label_01E3;

                    case Token.RightParen:
                        this._tree.Pop('(');
                        goto Label_022A;

                    case Token.Comma:
                        this._tree.Pop(',');
                        this._tree.Push(',');
                        goto Label_022A;

                    case Token.Identifier:
                        this.ParseIdentifier();
                        goto Label_022A;

                    default:
                        throw this.BuildException(Error.InternalError);
                    }
                    expression.IsFunction = true;
Label_01E3:
                    this._tree.Push('(');
Label_022A:
                    token = this.NextToken();
                }
                this._tree.Complete();
            }
            return(this._tree);
        }