Exemplo n.º 1
0
        public override void Visit(TensorDCLNode node)
        {
            if (SymbolTable.Retrieve(node.ID) is null)
            {
                SymbolTable.Insert(node.ID, node.Type, false, node.Rows, node.Columns);
            }
            else
            {
                throw new VariableAlreadyDeclaredException(
                          $"The variable \"{node.ID}\" could not be declared, as it has already been declared in the current or parent scope.");
            }

            base.Visit(node);

            int initColumns = -1;
            int initRows    = -1;

            if (node.Init is TensorInitNode init)
            {
                initColumns = init.FirstRowElements.Count;
                initRows    = (init.Elements.Count / initColumns) + 1;
            }
            else if (node.Init.Rows is not null && node.Init.Columns is not null)
            {
                initColumns = (int)node.Init.Columns;
                initRows    = (int)node.Init.Rows;
            }

            if (initColumns != node.Columns || initRows != node.Rows)
            {
                throw new Exception(
                          $"Declared dimensions rows: {node.Rows} - {initRows}, columns: {node.Columns} - {initColumns}");
            }
        }
Exemplo n.º 2
0
        public void IllegalTensorMultiplicationTest()
        {
            // tensor a[2][1] = { [2.4], [5.1] }
            // tensor b[5][2] = { [1, 1],
            //                    [1, 1],
            //                    [1, 1],
            //                    [1, 1],
            //                    [1, 1] }
            // tensor c[2][2] = a*b;

            TensorInitNode aInit = new TensorInitNode();

            aInit.FirstRowElements = new List <ExpressionNode>()
            {
                new DoubleNode(2.4)
            };
            aInit.Elements = new List <ExpressionNode>()
            {
                new DoubleNode(5.1)
            };
            TensorDCLNode a = new TensorDCLNode("tensor", "a", 2, 1, aInit);

            TensorInitNode bInit = new TensorInitNode();

            bInit.FirstRowElements = new List <ExpressionNode>()
            {
                new DoubleNode(1), new DoubleNode(1)
            };
            bInit.Elements = new List <ExpressionNode>()
            {
                new DoubleNode(1), new DoubleNode(1),
                new DoubleNode(1), new DoubleNode(1),
                new DoubleNode(1), new DoubleNode(1),
                new DoubleNode(1), new DoubleNode(1)
            };
            TensorDCLNode b = new TensorDCLNode("tensor", "b", 5, 2, bInit);

            MultiplicationNode mulNode = new MultiplicationNode("*");

            mulNode.Left  = new IDNode("a");
            mulNode.Right = new IDNode("b");

            SymbolTable symbolTable             = new SymbolTable();
            TypeCheckSymbolTableVisitor visitor = new TypeCheckSymbolTableVisitor(symbolTable);

            visitor.Visit(a);
            visitor.Visit(b);
            Assert.ThrowsException <InvalidOperandsException>(() =>
            {
                visitor.Visit(mulNode);
            });
        }
Exemplo n.º 3
0
        public override Node VisitTensorDecl(ML4DParser.TensorDeclContext context)
        {
            TensorDCLNode tensorDclNode;

            if (context.init is not null)
            {
                tensorDclNode = new TensorDCLNode(context.type.Text, context.id.Text, int.Parse(context.rows.Text), int.Parse(context.coloumns.Text), (TensorInitNode)Visit(context.init));
            }
            else
            {
                tensorDclNode = new TensorDCLNode(context.type.Text, context.id.Text, int.Parse(context.rows.Text), int.Parse(context.coloumns.Text), (ExpressionNode)Visit(context.assignInit));
            }

            return(tensorDclNode);
        }
Exemplo n.º 4
0
 public override void Visit(TensorDCLNode node)
 {
     if (SymbolTable.Retrieve(node.ID) is null)
     {
         Emit("Tensor* " + node.ID + " = ");
         PrintTensorDCL(node);
     }
     else
     {
         GlobalScope = true;
         Emit("static Tensor* " + node.ID + ";\n");
         GlobalScope = false;
         Emit(node.ID + " = ");
         PrintTensorDCL(node);
     }
 }
Exemplo n.º 5
0
        private void PrintTensorDCL(TensorDCLNode node)
        {
            if (node.Init is TensorInitNode initNode)
            {
                Emit($"newTensor((double[]){{");

                List <Node> children = initNode.GetChildren();
                for (int i = 0; i < children.Count - 1; i++)
                {
                    Visit(children[i]);
                    Emit(",");
                }
                Visit(children.Last());

                Emit($"}}, {node.Rows}, {node.Columns})");
            }
            else
            {
                Visit(node.Init);
            }
            Emit(";\n");
        }
Exemplo n.º 6
0
 public virtual void Visit(TensorDCLNode node)
 {
     VisitChildren(node);
 }