Esempio n. 1
0
        public override void VisitAssignment(AssignmentStatement assignment)
        {
            Visit(assignment.Value);
            var newCommand = new Assignment(assignment.VariableName.Name, ExpressionStack.Pop());

            Program.Add(newCommand);
        }
Esempio n. 2
0
        public override void VisitPrint(PrintStatement printStatement)
        {
            Visit(printStatement.Expression);
            var print = new Print(ExpressionStack.Pop(), printStatement.NewLine);

            Program.Add(print);
        }
Esempio n. 3
0
        public override void VisitUnaryExpression(UnaryExpression unaryExpression)
        {
            Visit(unaryExpression.Operand);
            var unaryOp    = new UnaryOperation(unaryExpression.Operation, ExpressionStack.Pop());
            var variable   = new Identifier(NewVariable);
            var assignment = new Assignment(variable.Name, unaryOp);

            Program.Add(assignment);
            ExpressionStack.Push(variable);
        }
Esempio n. 4
0
        public override void VisitBinaryExpression(BinaryExpression binaryExpression)
        {
            Visit(binaryExpression.Left);
            var leftExpression = ExpressionStack.Pop();

            Visit(binaryExpression.Right);
            var rightExpression = ExpressionStack.Pop();
            var variable        = new Identifier(NewVariable);
            var binOp           = new BinaryOperation(leftExpression, binaryExpression.Operation, rightExpression);

            Program.Add(new Assignment(variable.Name, binOp));
            ExpressionStack.Push(variable);
        }
Esempio n. 5
0
        public override void VisitWhile(WhileStatement whileStatement)
        {
            Visit(whileStatement.Condition);
            var condition  = ExpressionStack.Pop();
            var beginWhile = NewLabel;
            var endWhile   = NewLabel;

            Program.Add(new ConditionalGoto(
                            endWhile,
                            new BinaryOperation(condition, Operation.Equal, 0))
            {
                Label = beginWhile
            });
            Visit(whileStatement.Body);
            Program.Add(new Goto(beginWhile));
            Program.Add(new NoOperation(endWhile));
        }
Esempio n. 6
0
        public override void VisitFor(ForStatement forStatement)
        {
            Visit(forStatement.From);
            Program.Add(new Assignment(forStatement.ForVariable.Name, ExpressionStack.Pop()));
            var forBegin    = NewLabel;
            var forEnd      = NewLabel;
            var forVariable = new Identifier(forStatement.ForVariable.Name);

            Visit(forStatement.To);
            var forTo = ExpressionStack.Pop();
            var check = new ConditionalGoto(
                forEnd,
                new BinaryOperation(forVariable, Operation.Greater, forTo))
            {
                Label = forBegin
            };

            Program.Add(check);
            Visit(forStatement.Body);
            Program.Add(Assignment.Increment(forVariable.Name));
            Program.Add(new Goto(forBegin));
            Program.Add(new NoOperation(forEnd));
        }
Esempio n. 7
0
        public override void VisitIf(IfStatement ifStatement)
        {
            Visit(ifStatement.Condition);
            var condition  = ExpressionStack.Pop();
            var endIfLabel = NewLabel;
            var elseLabel  = ifStatement.ElseBody == null ? endIfLabel : NewLabel;

            Program.Add(new ConditionalGoto(
                            elseLabel,
                            new BinaryOperation(condition, Operation.Equal, 0)));
            Visit(ifStatement.ThenBody);

            if (ifStatement.ElseBody != null)
            {
                Program.Add(new Goto(endIfLabel));
                Program.Add(new NoOperation(elseLabel));
                Visit(ifStatement.ElseBody);
                Program.Add(new NoOperation(endIfLabel));
            }
            else
            {
                Program.Add(new NoOperation(elseLabel));
            }
        }
Esempio n. 8
0
 public override void VisitLabelledStatement(LabelledStatement labelledStatement)
 {
     Program.Add(new NoOperation(labelledStatement.Label));
     Visit(labelledStatement.Statement);
 }
Esempio n. 9
0
 public override void VisitGotoStatement(GotoStatement gotoStatement)
 {
     Program.Add(new Goto(gotoStatement.Label));
 }