public object Visit(MethodDeclaringNode n, object o) { _currentScopeLevel = 2; if (n.Identifier.Value.Equals("Main")) { Append($"{AddIndent()}public static void {n.Identifier.Value}("); // static Main required by runtime } else { Append($"{AddIndent()}public "); n.Type.Accept(this, null); Append($" {n.Identifier.Value}("); } n.Parameters.Accept(this, null); AppendLine($")"); AppendLine($"{AddIndent()}{{"); IncreaseIndent(); n.VarDeclarings.Accept(this, null); n.Actions.Accept(this, null); n.Return.Accept(this, null); DecreaseIndent(); AppendLine($"{AddIndent()}}}"); AppendLine(); return(null); }
public object Visit(MethodDeclaringNode n, object o) { CheckIfMain(n); _currentScopeLevel = 2; _currentClassST.EnterSymbol(n.Identifier.Value, n); _currentMethodST = new MethodSymbolTable(_currentClassST, n, _errorSummary); n.Parameters.Accept(this, null); n.VarDeclarings.Accept(this, null); n.Actions.Accept(this, null); _currentClassST.AddLocalMethodST(n.Identifier.Value, _currentMethodST); return(null); }
private void CheckIfMain(MethodDeclaringNode n) { if (n.Identifier.Value == "Main" && _hasMainMethod == false) { if (!(n.Type is VoidTypeNode)) { _errorSummary.AddError(new SemanticError("Main method must be of type 'void'", n.SourcePosition)); } else { _hasMainMethod = true; _mainMethodParentClassName = ((ClassDeclaringNode)_currentClassST.ClassDeclaring).Identifier.Value; } } else if (n.Identifier.Value == "Main" && _hasMainMethod == true) { _errorSummary.AddError(new SemanticError("Main method already declared", n.SourcePosition)); } }
private MethodDeclaringNode ParseMethodDeclaring() { MethodDeclaringNode itsAST; SourceCodePosition itsPos = _currentToken.SourcePosition; Accept(Token.TokenType.Method); TypeNode itsType = ReturnType(); IdentifierNode itsName = new IdentifierNode(_currentToken); Accept(Token.TokenType.Identifier); Accept(Token.TokenType.LeftParen); ParameterSequenceNode itsParams = Parameters(); Accept(Token.TokenType.RightParen); Accept(Token.TokenType.LeftBrace); DeclaringSequenceNode itsVars = VariableDeclarings(); ActionSequenceNode itsActions = ActionStatements(); ReturnActionNode itsReturn = ReturnStatement(); Accept(Token.TokenType.RightBrace); itsAST = new MethodDeclaringNode(itsName, itsType, itsParams, itsVars, itsActions, itsReturn, itsPos); return(itsAST); }
private MethodDeclaringNode CreateStdMethod(ParameterSequenceNode parameters, TypeNode type) { MethodDeclaringNode declaring = new MethodDeclaringNode(_dummyIdent, type, parameters, new EmptyDeclaringSequenceNode(_dummyPos), new EmptyActionSequenceNode(_dummyPos), new ReturnActionNode(null, _dummyPos), _dummyPos); return(declaring); }