This commit is contained in:
2026-02-08 17:55:15 +01:00
parent 423ec4c798
commit 4761cd1f83
4 changed files with 245 additions and 9 deletions

View File

@@ -159,6 +159,7 @@ public sealed class Generator(List<NodeDefinition> nodes)
{
EmitStatement(statement.Block);
}
writer.WriteLine("}");
}
@@ -166,6 +167,7 @@ public sealed class Generator(List<NodeDefinition> nodes)
{
return node switch
{
NodeExpressionBinary expression => EmitExpressionBinary(expression),
NodeExpressionBoolLiteral expression => expression.Value.Value ? "true" : "false",
NodeExpressionIntLiteral expression => expression.Value.Value.ToString(),
NodeExpressionStringLiteral expression => $"(struct string){{ \"{expression.Value.Value}\", {expression.Value.Value.Length} }}",
@@ -174,6 +176,32 @@ public sealed class Generator(List<NodeDefinition> nodes)
};
}
private string EmitExpressionBinary(NodeExpressionBinary expression)
{
var left = EmitExpression(expression.Left);
var right = EmitExpression(expression.Right);
return expression.Operation switch
{
NodeExpressionBinary.Op.Add => $"({left} + {right})",
NodeExpressionBinary.Op.Subtract => $"({left} - {right})",
NodeExpressionBinary.Op.Multiply => $"({left} * {right})",
NodeExpressionBinary.Op.Divide => $"({left} / {right})",
NodeExpressionBinary.Op.Modulo => $"({left} % {right})",
NodeExpressionBinary.Op.Equal => $"({left} == {right})",
NodeExpressionBinary.Op.NotEqual => $"({left} != {right})",
NodeExpressionBinary.Op.LessThan => $"({left} < {right})",
NodeExpressionBinary.Op.LessThanOrEqual => $"({left} <= {right})",
NodeExpressionBinary.Op.GreaterThan => $"({left} > {right})",
NodeExpressionBinary.Op.GreaterThanOrEqual => $"({left} >= {right})",
NodeExpressionBinary.Op.LeftShift => $"({left} << {right})",
NodeExpressionBinary.Op.RightShift => $"({left} >> {right})",
NodeExpressionBinary.Op.LogicalAnd => $"({left} && {right})",
NodeExpressionBinary.Op.LogicalOr => $"({left} || {right})",
_ => throw new ArgumentOutOfRangeException()
};
}
private static string CType(NodeType node, string? varName = null)
{
return node switch