diff --git a/Upsilon/Binder/Binder.cs b/Upsilon/Binder/Binder.cs index f433c5b..bc20d8b 100644 --- a/Upsilon/Binder/Binder.cs +++ b/Upsilon/Binder/Binder.cs @@ -509,8 +509,11 @@ namespace Upsilon.Binder private BoundStatement BindReturnStatement(ReturnStatementSyntax e) { + if (e.Expression == null) + return new BoundReturnStatement(null, e.Span); + var expression = BindExpression(e.Expression); - if (expression.Type != Type.Unknown && expression.Type != Type.Unknown && + if (expression.Type != Type.Unknown && expression.Type != Type.Unknown && Scope.ReturnType != Type.Unknown && Scope.ReturnType != Type.Nil) { if (expression.Type != Scope.ReturnType) diff --git a/Upsilon/Evaluator/Evaluator.cs b/Upsilon/Evaluator/Evaluator.cs index 93961bc..1da322d 100644 --- a/Upsilon/Evaluator/Evaluator.cs +++ b/Upsilon/Evaluator/Evaluator.cs @@ -423,7 +423,7 @@ namespace Upsilon.Evaluator private void EvaluateReturnStatement(BoundReturnStatement b) { - _returnValue = EvaluateExpression(b.Expression); + _returnValue = b.Expression == null ? null : EvaluateExpression(b.Expression); _lastValue = _returnValue; HasReturned = true; } diff --git a/Upsilon/Parser/Parser.cs b/Upsilon/Parser/Parser.cs index 12b9c4e..53018e6 100644 --- a/Upsilon/Parser/Parser.cs +++ b/Upsilon/Parser/Parser.cs @@ -283,7 +283,9 @@ namespace Upsilon.Parser private StatementSyntax ParseReturnStatement() { var returnToken = MatchToken(SyntaxKind.ReturnKeyword); - var expression = ParseExpression(); + ExpressionSyntax expression = null; + if (Current.Kind != SyntaxKind.EndKeyword) + expression = ParseExpression(); return new ReturnStatementSyntax(returnToken, expression); } diff --git a/Upsilon/Parser/StatementSyntax/ReturnStatementSyntax.cs b/Upsilon/Parser/StatementSyntax/ReturnStatementSyntax.cs index e4d0241..4aba7de 100644 --- a/Upsilon/Parser/StatementSyntax/ReturnStatementSyntax.cs +++ b/Upsilon/Parser/StatementSyntax/ReturnStatementSyntax.cs @@ -9,7 +9,9 @@ namespace Upsilon.Parser { ReturnToken = returnToken; Expression = expression; - Span = new TextSpan(returnToken.Span.Start, expression.Span.End - returnToken.Span.Start); + var end = returnToken.Span.End; + if (expression != null) end = expression.Span.End; + Span = new TextSpan(returnToken.Span.Start, end - returnToken.Span.Start); } public SyntaxToken ReturnToken { get; }