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}"); } }
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); }); }
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); }
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); } }
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"); }
public virtual void Visit(TensorDCLNode node) { VisitChildren(node); }