...
This commit is contained in:
@@ -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)
|
||||||
@@ -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)
|
||||||
}
|
}
|
||||||
@@ -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)
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user