Esempio n. 1
0
 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);
 }
Esempio n. 2
0
 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);
 }
Esempio n. 3
0
 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));
     }
 }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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);
        }