private VisitResult VisitReturnStatement(ASTReturn node) { return(new VisitResult { ControlType = ControlType.Return, Value = node.Expression != null?Visit(node.Expression).Value : null }); }
private Symbol VisitReturnStatement(ASTReturn node) { if (node.Expression != null) { return(Visit(node.Expression)); } return(_currentScope.LookupSingle("void")); }
protected override bool Visit(ASTReturn node) { if (!Visit(node.Child)) { return(false); } _lastNode = new CReturn { Child = _lastNode }; return(true); }
protected override bool Visit(ASTReturn node) { if (!Visit(node.Child)) { return(false); } var lambda = _procedureStack.Peek(); var returnType = ((ProcedureType)lambda.TypeInfo).Return; node.TypeInfo = node.Child.TypeInfo; return(Expect(node.Position, returnType, node.TypeInfo)); }
public override void VisitReturn(ASTReturn n) { CFlatType actual = CheckSubTree(n.ReturnValue); CFlatType expected = _currentMethod.ReturnType; if (actual.IsSupertype(expected)) { n.CFlatType = expected; _lastSeenType = expected; _currentMethod.RegisterReturnStatement(); } else { ReportError(n.Location, "Type mismatch in return statement. Expected: {0} Got: {1}", TypeToFriendlyName(expected), TypeToFriendlyName(actual)); } }
public override void VisitReturn(ASTReturn n) { n.ReturnValue.Visit(this); _gen.Emit(OpCodes.Ret); }
public bool Visit(ASTReturn node) { throw new NotImplementedException(); }
protected abstract bool Visit(ASTReturn node);
private static ASTNode ParseSingleStatement() { ASTNode ret = null; if (currentTokens[currentToken] is StringToken) { ret = new ASTString { String = currentTokens[currentToken].Token }; currentToken++; } else if (currentTokens[currentToken] is NumberToken) { double dResult; if (double.TryParse(currentTokens[currentToken].Token, NumberStyles.Any, CultureInfo.GetCultureInfo("en"), out dResult)) { ret = new ASTNumber { Number = dResult }; } else { throw new ParserException(string.Format("Number {0} is not valid.", currentTokens[currentToken].Token), currentTokens[currentToken].LineNumber); } currentToken++; } else if (currentTokens[currentToken] is ReservedWordToken) { if (currentTokens[currentToken].Token == "this" || currentTokens[currentToken].Token == "VM") { string scope = currentTokens[currentToken].Token; currentToken++; if (currentTokens[currentToken] is SpecialToken && currentTokens[currentToken].Token == ".") { currentToken++; ret = ParseFunctionCallOrParameterAccess(scope); } else { throw new ParserException(string.Format("Expected '.' instead of '{0}'.", currentTokens[currentToken].Token), currentTokens[currentToken].LineNumber); } } else if (currentTokens[currentToken].Token == "object" || currentTokens[currentToken].Token == "string" || currentTokens[currentToken].Token == "number") { VMType type = currentTokens[currentToken].Token == "number" ? VMType.Number : (currentTokens[currentToken].Token == "string" ? VMType.String : VMType.Object); currentToken++; if (currentTokens[currentToken] is IdentifierToken) { ret = new ASTLocalVariable() { Type = type, Name = currentTokens[currentToken].Token }; } else { throw new ParserException("Expected Identifier.", currentTokens[currentToken].LineNumber); } currentToken++; } else if (currentTokens[currentToken].Token == "new") { currentToken++; ASTNode createClass = ParseFunctionCallOrParameterAccess("constructor"); if (createClass is ASTFunctionCall) { ASTFunctionCall fc = (ASTFunctionCall)createClass; ret = new ASTCreateClass() { Scope = fc.FunctionName, FunctionName = fc.FunctionName, Parameter = fc.Parameter }; } else { throw new ParserException("Error with new.", currentTokens[currentToken].LineNumber); } } else if (currentTokens[currentToken].Token == "return") { currentToken++; ret = new ASTReturn() { Return = ParseStatement() }; // Point to ';' again!!! --currentToken; } else { throw new ParserException(string.Format("Reserved Word {0} is not legal in Statement.", currentTokens[currentToken].Token), currentTokens[currentToken].LineNumber); } } else if (currentTokens[currentToken] is IdentifierToken) { string identifierOrScope = currentTokens[currentToken].Token; currentToken++; if (currentTokens[currentToken] is SpecialToken) { if (currentTokens[currentToken].Token == ".") { currentToken++; TokenBase isFunction = currentTokens[currentToken + 1]; ret = ParseFunctionCallOrParameterAccess(identifierOrScope); } else if (currentTokens[currentToken].Token == "(") { // Set focus again to the function name --currentToken; ret = ParseFunctionCallOrParameterAccess("this"); } else if (currentTokens[currentToken].Token == "[") { currentToken++; ASTStatement statement = ParseStatement(); if (statement == null) { throw new ParserException("Expected Statement for Parameter Access.", currentTokens[currentToken].LineNumber); } ret = new ASTClassParameter() { Scope = identifierOrScope, Parameter = statement }; } else { ret = new ASTIdentifier() { Identifier = identifierOrScope }; } } else { ret = new ASTIdentifier() { Identifier = identifierOrScope }; } } if (ret == null) { throw new ParserException(String.Format("Problems parsing the Identifier/Function Call/String/Number {0}.", currentTokens[currentToken].Token), currentTokens[currentToken].LineNumber); } return(ret); }