diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2024-02-11 23:09:00 -0500 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2024-02-11 23:09:00 -0500 |
| commit | ddd9f6e5d542fca3186558e4d6603c4b05967121 (patch) | |
| tree | dc70fdf5b0efecf30058c704ca10d7808c543fdf /compile.c | |
| parent | 7d6af5f4c7663bddf4dad4a58c770dbdd299e022 (diff) | |
Fix operator precedence and boolification
Diffstat (limited to 'compile.c')
| -rw-r--r-- | compile.c | 23 |
1 files changed, 16 insertions, 7 deletions
@@ -20,7 +20,7 @@ CORD compile_statement(ast_t *ast) { switch (ast->tag) { case If: case For: case While: case FunctionDef: case Return: case StructDef: case EnumDef: - case Declare: case Assign: case UpdateAssign: + case Declare: case Assign: case UpdateAssign: case DocTest: return compile(ast); default: return CORD_asprintf("(void)%r;", compile(ast)); @@ -61,12 +61,12 @@ CORD compile(ast_t *ast) case BINOP_MINUS: return CORD_asprintf("(%r - %r)", lhs, rhs); case BINOP_LSHIFT: return CORD_asprintf("(%r << %r)", lhs, rhs); case BINOP_RSHIFT: return CORD_asprintf("(%r >> %r)", lhs, rhs); - case BINOP_EQ: return CORD_asprintf("(%r == %r)", lhs, rhs); - case BINOP_NE: return CORD_asprintf("(%r != %r)", lhs, rhs); - case BINOP_LT: return CORD_asprintf("(%r < %r)", lhs, rhs); - case BINOP_LE: return CORD_asprintf("(%r <= %r)", lhs, rhs); - case BINOP_GT: return CORD_asprintf("(%r > %r)", lhs, rhs); - case BINOP_GE: return CORD_asprintf("(%r >= %r)", lhs, rhs); + case BINOP_EQ: return CORD_asprintf("__eq(%r, %r)", lhs, rhs); + case BINOP_NE: return CORD_asprintf("__ne(%r, %r)", lhs, rhs); + case BINOP_LT: return CORD_asprintf("__lt(%r, %r)", lhs, rhs); + case BINOP_LE: return CORD_asprintf("__le(%r, %r)", lhs, rhs); + case BINOP_GT: return CORD_asprintf("__gt(%r, %r)", lhs, rhs); + case BINOP_GE: return CORD_asprintf("__ge(%r, %r)", lhs, rhs); case BINOP_AND: return CORD_asprintf("and(%r, %r)", lhs, rhs); case BINOP_OR: return CORD_asprintf("or(%r, %r)", lhs, rhs); case BINOP_XOR: return CORD_asprintf("xor(%r, %r)", lhs, rhs); @@ -285,6 +285,15 @@ CORD compile(ast_t *ast) code = CORD_cat(code, "} __data;\n};\n"); return code; } + case DocTest: { + auto test = Match(ast, DocTest); + CORD src = heap_strn(test->expr->start, (size_t)(test->expr->end - test->expr->start)); + return CORD_asprintf( + "__test(%r, %r, %r);\n", + compile(WrapAST(test->expr, StringLiteral, .cord=src)), + compile(test->expr), + compile(WrapAST(test->expr, StringLiteral, .cord=test->output))); + } // Index, FieldAccess, // DocTest, // Use, |
