コード例 #1
0
ファイル: PrettyPrinter.cs プロジェクト: matroberts/Compiler
 public void Visit(TimesOperator node)
 {
     builder.AppendLine($"Times");
     builder.Indent();
     node.Left.Accept(this);
     node.Right.Accept(this);
     builder.Outdent();
 }
コード例 #2
0
        public void Visit(TimesOperator times)
        {
            times.Left.Accept(this);
            var leftOperand = tacs.Last().Result;

            times.Right.Accept(this);
            var rightOperand = tacs.Last().Result;

            tacs.Add(Tac.Times(leftOperand, rightOperand, MakeNewTemp()));
        }
コード例 #3
0
        public void ProcessAction(Stack <Ast> semanticStack, Symbol symbol, Token lastToken)
        {
            switch (symbol)
            {
            case Symbol.MakePlus:
            {
                var right = semanticStack.Pop();
                var left  = semanticStack.Pop();
                var node  = new PlusOperator(position: 0, left: (Expr)left, right: (Expr)right);
                semanticStack.Push(node);
                return;
            }

            case Symbol.MakeTimes:
            {
                var right = semanticStack.Pop();
                var left  = semanticStack.Pop();
                var node  = new TimesOperator(position: 0, left: (Expr)left, right: (Expr)right);
                semanticStack.Push(node);
                return;
            }

            case Symbol.MakeIdentifier:
            {
                var value = lastToken.Value;
                var node  = new Identifier(position: 0, value: value);
                semanticStack.Push(node);
                return;
            }

            case Symbol.MakeIntegerLiteral:
            {
                var node = new IntegerLiteral(position: 0, value: lastToken.Value);
                semanticStack.Push(node);
                return;
            }

            case Symbol.MakeMakeBooleanTrueLiteral:
            {
                var node = new BooleanLiteral(position: 0, value: true);
                semanticStack.Push(node);
                return;
            }

            case Symbol.MakeMakeBooleanFalseLiteral:
            {
                var node = new BooleanLiteral(position: 0, value: false);
                semanticStack.Push(node);
                return;
            }

            default:
                throw new ArgumentOutOfRangeException(nameof(symbol), symbol, null);
            }
        }
コード例 #4
0
        public void TimesOperator_ShouldPrint()
        {
            var ast = new TimesOperator
                      (
                position: 0,
                left: new Identifier(0, "x"),
                right: new Identifier(0, "y")
                      );

            Assert.That(PrettyPrinter.ToString(ast), Is.EqualTo(
                            @"Times
    Identifier(x)
    Identifier(y)
"));
        }
コード例 #5
0
ファイル: AstTests.cs プロジェクト: matroberts/Compiler
        public void BinaryOperator_ShouldImplement_ValueEquality()
        {
            var binaryOperator = new TimesOperator
                                 (
                position: 0,
                left: new Identifier(0, "left"),
                right: new Identifier(0, "right")
                                 );

            Assert.That(binaryOperator.Equals(null), Is.False);
            Assert.That(binaryOperator.Equals(new Identifier(0, "a")), Is.False);
            Assert.That(binaryOperator.Equals(new TimesOperator
                                              (
                                                  position: 0,
                                                  left: new Identifier(0, "wrong"),
                                                  right: new Identifier(0, "right")
                                              )), Is.False);
            Assert.That(binaryOperator.Equals(new PlusOperator
                                              (
                                                  position: 0,
                                                  left: new Identifier(0, "left"),
                                                  right: new Identifier(0, "right")
                                              )), Is.False);
            Assert.That(binaryOperator.Equals(new TimesOperator
                                              (
                                                  position: 0,
                                                  left: new Identifier(0, "left"),
                                                  right: new Identifier(0, "wrong")
                                              )), Is.False);
            Assert.That(binaryOperator.Equals(new TimesOperator
                                              (
                                                  position: 0,
                                                  left: new Identifier(0, "left"),
                                                  right: new Identifier(0, "right")
                                              )), Is.True);
        }