public override void Visit(FunctionDCLNode node) { InsideFunc = true; _FuncPrototypes.Append(node.Type + " " + node.ID + "("); Emit(node.Type + " " + node.ID + "("); foreach (FunctionArgumentNode argumentNode in node.Arguments) { if (argumentNode != node.Arguments[^ 1]) { _FuncPrototypes.Append(argumentNode.Type + " " + argumentNode.ID + ", "); Emit(argumentNode.Type + " " + argumentNode.ID + ", "); } else { _FuncPrototypes.Append(argumentNode.Type + " " + argumentNode.ID); Emit(argumentNode.Type + " " + argumentNode.ID); } } _FuncPrototypes.Append(");\n"); Emit(") {\n"); Visit(node.Body); Emit("}\n"); InsideFunc = false; }
public override void Visit(FunctionDCLNode node) { Console.WriteLine(node.Type + " " + node.ID); i += 2; VisitChildren(node, Inden()); i -= 2; }
public void DuplicateFunctionDeclarationErrorTest() { FunctionDCLNode funcDclNode1 = new FunctionDCLNode("void", "myFunction"); funcDclNode1.Body = new LinesNode(); FunctionDCLNode funcDclNode2 = new FunctionDCLNode("int", "myFunction"); funcDclNode2.Body = new LinesNode(); SymbolTable symbolTable = new SymbolTable(); TypeCheckSymbolTableVisitor visitor = new TypeCheckSymbolTableVisitor(symbolTable); visitor.Visit(funcDclNode1); Assert.ThrowsException <FunctionAlreadyDeclaredException>(() => { visitor.Visit(funcDclNode2); }); }
public override Node VisitFuncDecl(ML4DParser.FuncDeclContext context) { FunctionDCLNode functionDclNode; switch (context.type.type.Type) { case ML4DLexer.INT: functionDclNode = new FunctionDCLNode("int", context.id.Text); break; case ML4DLexer.DOUBLE: functionDclNode = new FunctionDCLNode("double", context.id.Text); break; case ML4DLexer.BOOL: functionDclNode = new FunctionDCLNode("bool", context.id.Text); break; case ML4DLexer.VOID: functionDclNode = new FunctionDCLNode("void", context.id.Text); break; default: throw new NotSupportedException( $"The function {context.id.Text}, was declared with an illegal type."); } for (int i = 0; i < context._argid.Count; i++) { functionDclNode.Arguments.Add(new FunctionArgumentNode( context._argtype[i].type.Text, context._argid[i].Text)); } functionDclNode.Body = VisitLines(context.body); return(functionDclNode); }
public override void Visit(FunctionDCLNode node) { if (SymbolTable.GetCurrentFunctionType() is null) { if (SymbolTable.Retrieve(node.ID) is null) { SymbolTable.Insert(node.ID, node.Type, true); } else { throw new FunctionAlreadyDeclaredException(node, $"The function \"{node.ID}\" has already been declared in the current or parent scope."); } } else { throw new Exception( $"The function \"{node.ID}\" was declared in a function. Nested function are not allowed in ML4D."); } SymbolTable.OpenScope(node.Type); base.Visit(node); SymbolTable.CloseScope(); }
public FunctionAlreadyDeclaredException(FunctionDCLNode node, string message) : base(message) { Node = node; }
public virtual void Visit(FunctionDCLNode node) { VisitChildren(node); }