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 printf(fmt: string, ...args: any);
extern func puts(str: string)
extern func printf(fmt: string, ...args: any)

View File

@@ -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)
}

View File

@@ -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<string>();
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)

View File

@@ -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);
}