diff --git a/example/c/bindings.nub b/example/c/bindings.nub index 3c4ba44..9738661 100644 --- a/example/c/bindings.nub +++ b/example/c/bindings.nub @@ -1,2 +1,2 @@ -extern func puts(str: string); -extern func printf(fmt: string, ...args: any); \ No newline at end of file +extern func puts(str: string) +extern func printf(fmt: string, ...args: any) \ No newline at end of file diff --git a/example/program.nub b/example/program.nub index 2bb9c3e..8f3a332 100644 --- a/example/program.nub +++ b/example/program.nub @@ -1,10 +1,11 @@ -import c; +import c global func main(argc: i64, argv: i64) { - printf("args: %d, starts at %p\n", argc, argv); - test(12.1); + printf("args: %d, starts at %p\n", argc, argv) + test(12.1) + return 23 } func test(a: f64) { - printf("%f\n", a); + printf("%f\n", a) } \ No newline at end of file diff --git a/src/compiler/Nub.Lang/Backend/Generator.cs b/src/compiler/Nub.Lang/Backend/Generator.cs index 625decc..f45d86a 100644 --- a/src/compiler/Nub.Lang/Backend/Generator.cs +++ b/src/compiler/Nub.Lang/Backend/Generator.cs @@ -229,7 +229,7 @@ public class Generator { _builder.Append($"{FQT(node.ReturnType.Value)} "); } - else + else if (!node.ReturnType.HasValue && node.Name == "main") { _builder.Append("l "); } @@ -237,18 +237,7 @@ public class Generator _builder.Append('$'); _builder.Append(node.Name); - var parameterStrings = new List(); - foreach (var parameter in node.Parameters) - { - if (parameter.Variadic) - { - parameterStrings.Add("..."); - } - else - { - parameterStrings.Add($"{FQT(parameter.Type)} %{parameter.Name}"); - } - } + var parameterStrings = node.Parameters.Select(parameter => parameter.Variadic ? "..." : $"{FQT(parameter.Type)} %{parameter.Name}"); _builder.AppendLine($"({string.Join(", ", parameterStrings)}) {{"); _builder.AppendLine("@start"); @@ -285,9 +274,17 @@ public class Generator } GenerateBlock(node.Body); - if (!node.ReturnType.HasValue) + + if (node.Body.Statements.Last() is not ReturnNode) { - _builder.AppendLine(" ret 0"); + if (!node.ReturnType.HasValue && node.Name == "main") + { + _builder.AppendLine(" ret 0"); + } + else if (!node.ReturnType.HasValue) + { + _builder.AppendLine(" ret"); + } } _builder.AppendLine("}"); @@ -758,8 +755,7 @@ public class Generator } } - throw new NotSupportedException( - $"Binary operator {binaryExpression.Operator} for types left: {binaryExpression.Left.Type}, right: {binaryExpression.Right.Type} not supported"); + throw new NotSupportedException($"Binary operator {binaryExpression.Operator} for types left: {binaryExpression.Left.Type}, right: {binaryExpression.Right.Type} not supported"); } private string GenerateIdentifier(IdentifierNode identifier) diff --git a/src/compiler/Nub.Lang/Frontend/Parsing/Parser.cs b/src/compiler/Nub.Lang/Frontend/Parsing/Parser.cs index b35a595..280926b 100644 --- a/src/compiler/Nub.Lang/Frontend/Parsing/Parser.cs +++ b/src/compiler/Nub.Lang/Frontend/Parsing/Parser.cs @@ -21,7 +21,6 @@ public class Parser if (TryExpectSymbol(Symbol.Import)) { var name = ExpectIdentifier(); - TryExpectSymbol(Symbol.Semicolon); imports.Add(name.Value); } else @@ -77,7 +76,6 @@ public class Parser { throw new Exception($"Modifiers: {string.Join(", ", modifiers)} is not valid for an extern function"); } - ExpectSymbol(Symbol.Semicolon); return new ExternFuncDefinitionNode(name.Value, parameters, returnType); } @@ -112,8 +110,6 @@ public class Parser variableValue = ParseExpression(); } - ExpectSymbol(Symbol.Semicolon); - variables.Add(new StructField(variableName, variableType, variableValue)); } @@ -156,14 +152,11 @@ public class Parser TryExpectSymbol(Symbol.Comma); } - ExpectSymbol(Symbol.Semicolon); - return new FuncCallStatementNode(new FuncCall(identifier.Value, parameters)); } case Symbol.Assign: { var value = ParseExpression(); - ExpectSymbol(Symbol.Semicolon); return new VariableAssignmentNode(identifier.Value, value); } default: @@ -179,8 +172,8 @@ public class Parser Symbol.Return => ParseReturn(), Symbol.If => ParseIf(), Symbol.While => ParseWhile(), - Symbol.Break => ParseBreak(), - Symbol.Continue => ParseContinue(), + Symbol.Break => new BreakNode(), + Symbol.Continue => new ContinueNode(), _ => throw new Exception($"Unexpected symbol {symbol.Symbol}") }; } @@ -197,7 +190,6 @@ public class Parser if (!TryExpectSymbol(Symbol.Semicolon)) { value = ParseExpression(); - ExpectSymbol(Symbol.Semicolon); } return new ReturnNode(value); @@ -226,18 +218,6 @@ public class Parser return new WhileNode(condition, body); } - private BreakNode ParseBreak() - { - ExpectSymbol(Symbol.Semicolon); - return new BreakNode(); - } - - private ContinueNode ParseContinue() - { - ExpectSymbol(Symbol.Semicolon); - return new ContinueNode(); - } - private ExpressionNode ParseExpression(int precedence = 0) { var left = ParsePrimaryExpression(); @@ -349,7 +329,6 @@ public class Parser var name = ExpectIdentifier().Value; ExpectSymbol(Symbol.Assign); var value = ParseExpression(); - TryExpectSymbol(Symbol.Semicolon); initializers.Add(name, value); }