feat: while/loop, array indexing (hIndexPtr/hAssign/hLoad), hAssign for assignment expressions
This commit is contained in:
@@ -223,6 +223,67 @@ func CBE_EmitExpr(cbe: *CEmitter, node: *HirNode) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// While
|
||||||
|
if kind == hWhile {
|
||||||
|
StringBuilder_Append(&cbe.sb, "while (");
|
||||||
|
CBE_EmitExpr(cbe, node.child1);
|
||||||
|
StringBuilder_Append(&cbe.sb, ") {\n");
|
||||||
|
if node.child2 != null as *HirNode {
|
||||||
|
cbe.indent = cbe.indent + 1;
|
||||||
|
CBE_EmitExpr(cbe, node.child2);
|
||||||
|
cbe.indent = cbe.indent - 1;
|
||||||
|
}
|
||||||
|
var sp: int = 0;
|
||||||
|
while sp < cbe.indent {
|
||||||
|
StringBuilder_Append(&cbe.sb, " ");
|
||||||
|
sp = sp + 1;
|
||||||
|
}
|
||||||
|
StringBuilder_Append(&cbe.sb, "}");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Loop (infinite)
|
||||||
|
if kind == hLoop {
|
||||||
|
StringBuilder_Append(&cbe.sb, "while (1) {\n");
|
||||||
|
if node.child1 != null as *HirNode {
|
||||||
|
cbe.indent = cbe.indent + 1;
|
||||||
|
CBE_EmitExpr(cbe, node.child1);
|
||||||
|
cbe.indent = cbe.indent - 1;
|
||||||
|
}
|
||||||
|
var sp: int = 0;
|
||||||
|
while sp < cbe.indent {
|
||||||
|
StringBuilder_Append(&cbe.sb, " ");
|
||||||
|
sp = sp + 1;
|
||||||
|
}
|
||||||
|
StringBuilder_Append(&cbe.sb, "}");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Index: arr[idx] — emit as arr[idx]
|
||||||
|
if kind == hIndexPtr {
|
||||||
|
CBE_EmitExpr(cbe, node.child1);
|
||||||
|
StringBuilder_Append(&cbe.sb, "[");
|
||||||
|
CBE_EmitExpr(cbe, node.child2);
|
||||||
|
StringBuilder_Append(&cbe.sb, "]");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load: *ptr — emit as *ptr (dereference)
|
||||||
|
if kind == hLoad {
|
||||||
|
StringBuilder_Append(&cbe.sb, "(*");
|
||||||
|
CBE_EmitExpr(cbe, node.child1);
|
||||||
|
StringBuilder_Append(&cbe.sb, ")");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Assign: target = value
|
||||||
|
if kind == hAssign {
|
||||||
|
CBE_EmitExpr(cbe, node.child1);
|
||||||
|
StringBuilder_Append(&cbe.sb, " = ");
|
||||||
|
CBE_EmitExpr(cbe, node.child2);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Cast
|
// Cast
|
||||||
if kind == hCast {
|
if kind == hCast {
|
||||||
StringBuilder_Append(&cbe.sb, "((");
|
StringBuilder_Append(&cbe.sb, "((");
|
||||||
|
|||||||
@@ -66,6 +66,13 @@ func Lcx_LowerExpr(ctx: *LowerCtx, expr: *Expr) -> *HirNode {
|
|||||||
|
|
||||||
// Binary
|
// Binary
|
||||||
if kind == ekBinary {
|
if kind == ekBinary {
|
||||||
|
// Assignment operator → use hAssign
|
||||||
|
if expr.intValue == tkAssign {
|
||||||
|
n.kind = hAssign;
|
||||||
|
n.child1 = Lcx_LowerExpr(ctx, expr.child1);
|
||||||
|
n.child2 = Lcx_LowerExpr(ctx, expr.child2);
|
||||||
|
return n;
|
||||||
|
}
|
||||||
n.kind = hBinary;
|
n.kind = hBinary;
|
||||||
n.intValue = expr.intValue; // operator
|
n.intValue = expr.intValue; // operator
|
||||||
n.child1 = Lcx_LowerExpr(ctx, expr.child1);
|
n.child1 = Lcx_LowerExpr(ctx, expr.child1);
|
||||||
@@ -106,6 +113,22 @@ func Lcx_LowerExpr(ctx: *LowerCtx, expr: *Expr) -> *HirNode {
|
|||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Index: arr[idx]
|
||||||
|
if kind == ekIndex {
|
||||||
|
n.kind = hIndexPtr;
|
||||||
|
n.child1 = Lcx_LowerExpr(ctx, expr.child1);
|
||||||
|
n.child2 = Lcx_LowerExpr(ctx, expr.child2);
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Assign: target = value
|
||||||
|
if kind == ekAssign {
|
||||||
|
n.kind = hAssign;
|
||||||
|
n.child1 = Lcx_LowerExpr(ctx, expr.child1); // target
|
||||||
|
n.child2 = Lcx_LowerExpr(ctx, expr.child2); // value
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
// Cast
|
// Cast
|
||||||
if kind == ekCast {
|
if kind == ekCast {
|
||||||
n.kind = hCast;
|
n.kind = hCast;
|
||||||
|
|||||||
@@ -223,6 +223,67 @@ func CBE_EmitExpr(cbe: *CEmitter, node: *HirNode) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// While
|
||||||
|
if kind == hWhile {
|
||||||
|
StringBuilder_Append(&cbe.sb, "while (");
|
||||||
|
CBE_EmitExpr(cbe, node.child1);
|
||||||
|
StringBuilder_Append(&cbe.sb, ") {\n");
|
||||||
|
if node.child2 != null as *HirNode {
|
||||||
|
cbe.indent = cbe.indent + 1;
|
||||||
|
CBE_EmitExpr(cbe, node.child2);
|
||||||
|
cbe.indent = cbe.indent - 1;
|
||||||
|
}
|
||||||
|
var sp: int = 0;
|
||||||
|
while sp < cbe.indent {
|
||||||
|
StringBuilder_Append(&cbe.sb, " ");
|
||||||
|
sp = sp + 1;
|
||||||
|
}
|
||||||
|
StringBuilder_Append(&cbe.sb, "}");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Loop (infinite)
|
||||||
|
if kind == hLoop {
|
||||||
|
StringBuilder_Append(&cbe.sb, "while (1) {\n");
|
||||||
|
if node.child1 != null as *HirNode {
|
||||||
|
cbe.indent = cbe.indent + 1;
|
||||||
|
CBE_EmitExpr(cbe, node.child1);
|
||||||
|
cbe.indent = cbe.indent - 1;
|
||||||
|
}
|
||||||
|
var sp: int = 0;
|
||||||
|
while sp < cbe.indent {
|
||||||
|
StringBuilder_Append(&cbe.sb, " ");
|
||||||
|
sp = sp + 1;
|
||||||
|
}
|
||||||
|
StringBuilder_Append(&cbe.sb, "}");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Index: arr[idx] — emit as arr[idx]
|
||||||
|
if kind == hIndexPtr {
|
||||||
|
CBE_EmitExpr(cbe, node.child1);
|
||||||
|
StringBuilder_Append(&cbe.sb, "[");
|
||||||
|
CBE_EmitExpr(cbe, node.child2);
|
||||||
|
StringBuilder_Append(&cbe.sb, "]");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load: *ptr — emit as *ptr (dereference)
|
||||||
|
if kind == hLoad {
|
||||||
|
StringBuilder_Append(&cbe.sb, "(*");
|
||||||
|
CBE_EmitExpr(cbe, node.child1);
|
||||||
|
StringBuilder_Append(&cbe.sb, ")");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Assign: target = value
|
||||||
|
if kind == hAssign {
|
||||||
|
CBE_EmitExpr(cbe, node.child1);
|
||||||
|
StringBuilder_Append(&cbe.sb, " = ");
|
||||||
|
CBE_EmitExpr(cbe, node.child2);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Cast
|
// Cast
|
||||||
if kind == hCast {
|
if kind == hCast {
|
||||||
StringBuilder_Append(&cbe.sb, "((");
|
StringBuilder_Append(&cbe.sb, "((");
|
||||||
|
|||||||
@@ -66,6 +66,13 @@ func Lcx_LowerExpr(ctx: *LowerCtx, expr: *Expr) -> *HirNode {
|
|||||||
|
|
||||||
// Binary
|
// Binary
|
||||||
if kind == ekBinary {
|
if kind == ekBinary {
|
||||||
|
// Assignment operator → use hAssign
|
||||||
|
if expr.intValue == tkAssign {
|
||||||
|
n.kind = hAssign;
|
||||||
|
n.child1 = Lcx_LowerExpr(ctx, expr.child1);
|
||||||
|
n.child2 = Lcx_LowerExpr(ctx, expr.child2);
|
||||||
|
return n;
|
||||||
|
}
|
||||||
n.kind = hBinary;
|
n.kind = hBinary;
|
||||||
n.intValue = expr.intValue; // operator
|
n.intValue = expr.intValue; // operator
|
||||||
n.child1 = Lcx_LowerExpr(ctx, expr.child1);
|
n.child1 = Lcx_LowerExpr(ctx, expr.child1);
|
||||||
@@ -106,6 +113,22 @@ func Lcx_LowerExpr(ctx: *LowerCtx, expr: *Expr) -> *HirNode {
|
|||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Index: arr[idx]
|
||||||
|
if kind == ekIndex {
|
||||||
|
n.kind = hIndexPtr;
|
||||||
|
n.child1 = Lcx_LowerExpr(ctx, expr.child1);
|
||||||
|
n.child2 = Lcx_LowerExpr(ctx, expr.child2);
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Assign: target = value
|
||||||
|
if kind == ekAssign {
|
||||||
|
n.kind = hAssign;
|
||||||
|
n.child1 = Lcx_LowerExpr(ctx, expr.child1); // target
|
||||||
|
n.child2 = Lcx_LowerExpr(ctx, expr.child2); // value
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
// Cast
|
// Cast
|
||||||
if kind == ekCast {
|
if kind == ekCast {
|
||||||
n.kind = hCast;
|
n.kind = hCast;
|
||||||
|
|||||||
Reference in New Issue
Block a user