multiple expr per print

This commit is contained in:
uan
2026-02-06 11:15:44 +01:00
parent a1c99b8b9e
commit 5602765b67
4 changed files with 54 additions and 31 deletions

View File

@@ -33,13 +33,13 @@ fn get_type_format(type string) string {
} }
fn (mut g Generator) get_print_label(expr Expr) string { fn (mut g Generator) get_print_label(expr Expr) string {
return match expr { return match expr {
Variable { expr.name } Variable { expr.name }
MemberAccess { MemberAccess {
"${g.get_print_label(expr.from)}.${expr.member}" "${g.get_print_label(expr.from)}.${expr.member}"
}
else { "" }
} }
else { "" }
}
} }
fn (mut g Generator) get_c_type(typ string) string { fn (mut g Generator) get_c_type(typ string) string {
@@ -80,7 +80,7 @@ fn (mut g Generator) gen_class_print_func(stmt ClassDecl) {
} }
g.out.writeln('for(int i=0; i<indent; i++) printf(" ");') g.out.writeln('for(int i=0; i<indent; i++) printf(" ");')
g.out.writeln('printf("}\\n");') g.out.writeln('printf("}\");')
g.out.writeln('}') g.out.writeln('}')
} }
@@ -169,25 +169,37 @@ fn (mut g Generator) gen_expr(expr Expr) {
g.out.write_string(')') g.out.write_string(')')
} }
PrintExpr { PrintExpr {
label := g.get_print_label(expr.expr) mut i := 0;
if g.symbols.lookup_class(expr.type) != none { for i < expr.exprs.len {
class_name := mangle_struct(expr.type) inner_expr := expr.exprs[i];
if label != "" { expr_type := expr.types[i];
g.out.write_string('printf("${label}: ");') label := g.get_print_label(inner_expr);
} if g.symbols.lookup_class(expr_type) != none {
g.out.write_string('print_${class_name}(') class_name := mangle_struct(expr_type)
g.gen_expr(expr.expr) /*if label != "" {
g.out.write_string(', 0)') g.out.write_string('${label}: ");')
} else { }*/
g.out.write_string('printf(\"') g.out.write_string('print_${class_name}(')
if label != "" { g.gen_expr(inner_expr)
g.out.write_string('${label}: ') g.out.write_string(', 0);')
} } else {
format := get_type_format(expr.type) g.out.write_string('printf(\"')
g.out.write_string('%${format}\\n\", ') dump(label);
g.gen_expr(expr.expr) if label != "" {
g.out.write_string(')') g.out.write_string('${label}')
} g.out.write_string(': ');
}
format := get_type_format(expr_type)
g.out.write_string('%${format}\", ')
g.gen_expr(inner_expr)
g.out.write_string(');')
}
i++;
if i < expr.exprs.len {
g.out.write_string('printf(\", \");')
}
}
g.out.write_string('printf(\"\\n\");\n')
} }
TypeCast { TypeCast {
c_type := g.mangle_if_class(g.get_c_type(expr.type)) c_type := g.mangle_if_class(g.get_c_type(expr.type))

2
main.v
View File

@@ -32,6 +32,6 @@ fn main() {
out_c := generator.gen_c(statements) out_c := generator.gen_c(statements)
compile(out_c, 'exec', true, 'clang') compile(out_c, 'exec', true, 'gcc')
} }

BIN
one

Binary file not shown.

View File

@@ -183,8 +183,8 @@ struct ParenExpr {
} }
struct PrintExpr { struct PrintExpr {
expr Expr exprs []Expr
type string types []string
} }
struct FnCall { struct FnCall {
@@ -408,9 +408,20 @@ fn (mut p Parser) parse_call(name string) FnCall {
fn (mut p Parser) parse_print() PrintExpr { fn (mut p Parser) parse_print() PrintExpr {
p.expect(.lparen) p.expect(.lparen)
expr := p.parse_expr(.lowest) mut exprs := []Expr{}
mut types := []string{}
for p.peek().type != .rparen {
expr := p.parse_expr(.lowest)
exprs << expr
types << p.get_expr_type(expr)
if p.peek().type == .comma {
p.next()
} else {
break
}
}
p.expect(.rparen) p.expect(.rparen)
return PrintExpr{expr: expr, type: p.get_expr_type(expr)} return PrintExpr{exprs: exprs, types: types}
} }
fn (mut p Parser) parse_binary(left Expr, op string, prec Precedence) BinaryExpr { fn (mut p Parser) parse_binary(left Expr, op string, prec Precedence) BinaryExpr {