diff options
Diffstat (limited to 'boot/transpile.c')
| -rw-r--r-- | boot/transpile.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/boot/transpile.c b/boot/transpile.c index d5a718a..0627bcb 100644 --- a/boot/transpile.c +++ b/boot/transpile.c @@ -505,6 +505,26 @@ transpile_visit_expression_construct(struct Visit* visit, struct Expression* exp TRANSPILE_WRITE("}"); } +void +transpile_visit_expression_increment_decrement(struct Visit* visit, struct Expression* expression) +{ + TRANSPILE_PREAMBLE + + const ascii* op = + expression->value.increment_decrement.operation == INCREMENT_DECREMENT_INCREMENT + ? "++" + : "--"; + if (expression->value.increment_decrement.prefix) { + TRANSPILE_WRITE("%s", op); + transpile_emit_expression( + visit, expression->value.increment_decrement.subject, TRANSPILE_PRECEDENCE_UNARY); + } else { + transpile_emit_expression( + visit, expression->value.increment_decrement.subject, TRANSPILE_PRECEDENCE_POSTFIX); + TRANSPILE_WRITE("%s", op); + } +} + // statements always emit their own indentation and trailing newline. // the dispatcher writes the indentation then routes via normal statement apparatus. void @@ -684,6 +704,7 @@ struct Visit_Table transpile_body_visit_functions = { .visit_expression_subscript = transpile_visit_expression_subscript, .visit_expression_cast = transpile_visit_expression_cast, .visit_expression_construct = transpile_visit_expression_construct, + .visit_expression_increment_decrement = transpile_visit_expression_increment_decrement, }; // walk a lowered translation unit and emit c source into the transpiler's output. |
