Exemplo n.º 1
0
        private bool ParseIfStatement(TokenReader reader, out Statement statement)
        {
            Token start = reader.Peek();
            statement = null;

            if (!this.Expect(reader, Keyword.If))
            {
                return false;
            }

            IfStatement ifStatement = new IfStatement(start);
            Expression condition = null;
            if (!this.ParseExpression(reader, out condition))
            {
                return false;
            }

            ifStatement.Condition = condition;
            if (!this.Expect(reader, Keyword.Then))
            {
                return false;
            }

            Statement trueStatement = null;
            if (!this.ParseStatement(reader, out trueStatement))
            {
                return false;
            }

            ifStatement.TrueStatement = trueStatement;
            Token tok = reader.Peek();
            if (tok.Is(Keyword.Else))
            {
                reader.Read();
                Statement falseStatement = null;
                if (!this.ParseStatement(reader, out falseStatement))
                {
                    return false;
                }

                ifStatement.FalseStatement = falseStatement;
            }

            statement = ifStatement;
            return true;
        }
Exemplo n.º 2
0
        private bool ParseDeleteStatement(TokenReader reader, out Statement statement)
        {
            statement = null;
            Token start = reader.Peek();
            if (!this.Expect(reader, Keyword.Delete))
            {
                return false;
            }

            Expression operand = null;
            if (!this.ParseExpression(reader, out operand))
            {
                return false;
            }

            statement = new DeleteStatement(start, operand);
            return true;
        }
Exemplo n.º 3
0
        private bool ParseWhileStatement(TokenReader reader, out Statement statement)
        {
            Token start = reader.Peek();
            statement = null;
            if (!this.Expect(reader, Keyword.While))
            {
                return false;
            }

            WhileStatement whileStatement = new WhileStatement(start);
            Expression condition = null;
            if (!this.ParseExpression(reader, out condition))
            {
                return false;
            }

            whileStatement.Condition = condition;
            if (!this.Expect(reader, Keyword.Do))
            {
                return false;
            }

            Statement bodyStatement = null;
            if (!this.ParseStatement(reader, out bodyStatement))
            {
                return false;
            }

            whileStatement.BodyStatement = bodyStatement;
            statement = whileStatement;
            return true;
        }
Exemplo n.º 4
0
        private bool ParseStatement(TokenReader reader, out Statement result)
        {
            result = null;
            Token tok = reader.Peek();
            Token start = tok;

            if (tok.Is(Keyword.SemiColon))
            {
                return true; // empty statement.
            }

            if (tok.Is(Keyword.If))
            {
                return this.ParseIfStatement(reader, out result);
            }

            if (tok.Is(Keyword.While))
            {
                return this.ParseWhileStatement(reader, out result);
            }

            if (tok.Is(Keyword.Delete))
            {
                return this.ParseDeleteStatement(reader, out result);
            }

            if (tok.Is(Keyword.Begin))
            {
                BlockStatement block = null;
                bool success = this.ParseBlockStatement(reader, out block);
                result = block;
                return success;
            }

            ReferenceExpression lhs = null;
            if (!this.ParseReferenceExpression(reader, out lhs))
            {
                return false;
            }

            tok = reader.Peek();
            if (tok.Is(Keyword.Assign))
            {
                reader.Read();
                Expression rhs = null;
                if (!this.ParseExpression(reader, out rhs))
                {
                    return false;
                }

                result = new AssignmentStatement(start, lhs, rhs);
                return true;
            }
            else
            {
                result = new CallStatement(start, lhs);
                return true;
            }
        }
Exemplo n.º 5
0
        private bool TryEmitStatement(
            Statement statement,
            CompilerContext context,
            Scope scope,
            MethodImpl method)
        {
            AssignmentStatement assignmentStatement = statement as AssignmentStatement;
            if (assignmentStatement != null)
            {
                return TryEmitAssignment(assignmentStatement, context, scope, method);
            }
            else
            {
                CallStatement callStatement = statement as CallStatement;
                if (callStatement != null)
                {
                    return TryEmitCall(callStatement, context, scope, method);
                }
                else
                {
                    IfStatement ifStatement = statement as IfStatement;
                    if (ifStatement != null)
                    {
                        return TryEmitIfStatement(ifStatement, context, scope, method);
                    }
                    else
                    {
                        WhileStatement whileStatement = statement as WhileStatement;
                        if (whileStatement != null)
                        {
                            return TryEmitWhileStatement(whileStatement, context, scope, method);
                        }
                        else
                        {
                            BlockStatement blockStatement = statement as BlockStatement;
                            if (blockStatement != null)
                            {
                                return TryEmitBlockStatement(blockStatement, context, scope, method);
                            }
                            else
                            {
                                DeleteStatement deleteStatement = statement as DeleteStatement;
                                if (deleteStatement != null)
                                {
                                    return TryEmitDeleteStatement(deleteStatement, context, scope, method);
                                }
                            }
                        }
                    }
                }
            }

            return false;
        }
Exemplo n.º 6
0
 public void AddStatement(Statement statement)
 {
     this.statements.Add(statement);
 }