This commit is contained in:
nub31
2025-05-16 21:09:05 +02:00
parent 57ccd0a38a
commit ecd0e01aac
4 changed files with 22 additions and 46 deletions

View File

@@ -1,2 +1,2 @@
extern func puts(str: string); extern func puts(str: string)
extern func printf(fmt: string, ...args: any); extern func printf(fmt: string, ...args: any)

View File

@@ -1,10 +1,11 @@
import c; import c
global func main(argc: i64, argv: i64) { global func main(argc: i64, argv: i64) {
printf("args: %d, starts at %p\n", argc, argv); printf("args: %d, starts at %p\n", argc, argv)
test(12.1); test(12.1)
return 23
} }
func test(a: f64) { func test(a: f64) {
printf("%f\n", a); printf("%f\n", a)
} }

View File

@@ -229,7 +229,7 @@ public class Generator
{ {
_builder.Append($"{FQT(node.ReturnType.Value)} "); _builder.Append($"{FQT(node.ReturnType.Value)} ");
} }
else else if (!node.ReturnType.HasValue && node.Name == "main")
{ {
_builder.Append("l "); _builder.Append("l ");
} }
@@ -237,18 +237,7 @@ public class Generator
_builder.Append('$'); _builder.Append('$');
_builder.Append(node.Name); _builder.Append(node.Name);
var parameterStrings = new List<string>(); var parameterStrings = node.Parameters.Select(parameter => parameter.Variadic ? "..." : $"{FQT(parameter.Type)} %{parameter.Name}");
foreach (var parameter in node.Parameters)
{
if (parameter.Variadic)
{
parameterStrings.Add("...");
}
else
{
parameterStrings.Add($"{FQT(parameter.Type)} %{parameter.Name}");
}
}
_builder.AppendLine($"({string.Join(", ", parameterStrings)}) {{"); _builder.AppendLine($"({string.Join(", ", parameterStrings)}) {{");
_builder.AppendLine("@start"); _builder.AppendLine("@start");
@@ -285,9 +274,17 @@ public class Generator
} }
GenerateBlock(node.Body); 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("}"); _builder.AppendLine("}");
@@ -758,8 +755,7 @@ public class Generator
} }
} }
throw new NotSupportedException( throw new NotSupportedException($"Binary operator {binaryExpression.Operator} for types left: {binaryExpression.Left.Type}, right: {binaryExpression.Right.Type} not supported");
$"Binary operator {binaryExpression.Operator} for types left: {binaryExpression.Left.Type}, right: {binaryExpression.Right.Type} not supported");
} }
private string GenerateIdentifier(IdentifierNode identifier) private string GenerateIdentifier(IdentifierNode identifier)

View File

@@ -21,7 +21,6 @@ public class Parser
if (TryExpectSymbol(Symbol.Import)) if (TryExpectSymbol(Symbol.Import))
{ {
var name = ExpectIdentifier(); var name = ExpectIdentifier();
TryExpectSymbol(Symbol.Semicolon);
imports.Add(name.Value); imports.Add(name.Value);
} }
else else
@@ -77,7 +76,6 @@ public class Parser
{ {
throw new Exception($"Modifiers: {string.Join(", ", modifiers)} is not valid for an extern function"); throw new Exception($"Modifiers: {string.Join(", ", modifiers)} is not valid for an extern function");
} }
ExpectSymbol(Symbol.Semicolon);
return new ExternFuncDefinitionNode(name.Value, parameters, returnType); return new ExternFuncDefinitionNode(name.Value, parameters, returnType);
} }
@@ -112,8 +110,6 @@ public class Parser
variableValue = ParseExpression(); variableValue = ParseExpression();
} }
ExpectSymbol(Symbol.Semicolon);
variables.Add(new StructField(variableName, variableType, variableValue)); variables.Add(new StructField(variableName, variableType, variableValue));
} }
@@ -156,14 +152,11 @@ public class Parser
TryExpectSymbol(Symbol.Comma); TryExpectSymbol(Symbol.Comma);
} }
ExpectSymbol(Symbol.Semicolon);
return new FuncCallStatementNode(new FuncCall(identifier.Value, parameters)); return new FuncCallStatementNode(new FuncCall(identifier.Value, parameters));
} }
case Symbol.Assign: case Symbol.Assign:
{ {
var value = ParseExpression(); var value = ParseExpression();
ExpectSymbol(Symbol.Semicolon);
return new VariableAssignmentNode(identifier.Value, value); return new VariableAssignmentNode(identifier.Value, value);
} }
default: default:
@@ -179,8 +172,8 @@ public class Parser
Symbol.Return => ParseReturn(), Symbol.Return => ParseReturn(),
Symbol.If => ParseIf(), Symbol.If => ParseIf(),
Symbol.While => ParseWhile(), Symbol.While => ParseWhile(),
Symbol.Break => ParseBreak(), Symbol.Break => new BreakNode(),
Symbol.Continue => ParseContinue(), Symbol.Continue => new ContinueNode(),
_ => throw new Exception($"Unexpected symbol {symbol.Symbol}") _ => throw new Exception($"Unexpected symbol {symbol.Symbol}")
}; };
} }
@@ -197,7 +190,6 @@ public class Parser
if (!TryExpectSymbol(Symbol.Semicolon)) if (!TryExpectSymbol(Symbol.Semicolon))
{ {
value = ParseExpression(); value = ParseExpression();
ExpectSymbol(Symbol.Semicolon);
} }
return new ReturnNode(value); return new ReturnNode(value);
@@ -226,18 +218,6 @@ public class Parser
return new WhileNode(condition, body); 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) private ExpressionNode ParseExpression(int precedence = 0)
{ {
var left = ParsePrimaryExpression(); var left = ParsePrimaryExpression();
@@ -349,7 +329,6 @@ public class Parser
var name = ExpectIdentifier().Value; var name = ExpectIdentifier().Value;
ExpectSymbol(Symbol.Assign); ExpectSymbol(Symbol.Assign);
var value = ParseExpression(); var value = ParseExpression();
TryExpectSymbol(Symbol.Semicolon);
initializers.Add(name, value); initializers.Add(name, value);
} }