2024-07-30 22:52:23 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "common.hpp"
|
|
|
|
|
2024-08-04 19:38:56 +00:00
|
|
|
struct Context;
|
|
|
|
|
|
|
|
struct Expression {
|
|
|
|
Expression() {}
|
2024-08-10 20:47:07 +00:00
|
|
|
Expression(Array&& code) : reg(0), code(std::move(code)) {}
|
|
|
|
|
|
|
|
static Result<Expression> create() {
|
|
|
|
Array c = TRY(Array::create());
|
|
|
|
|
|
|
|
return Expression(std::move(c));
|
|
|
|
}
|
|
|
|
Result<void> add_opcode(Oc opcode, OpArg arg1 = {0, 0}, OpArg arg2 = {0, 0},
|
|
|
|
OpArg arg3 = {0, 0}, OpArg arg4 = {0, 0});
|
|
|
|
|
|
|
|
Result<void> add_code(Array& c) {
|
|
|
|
code = TRY(code.concat(c));
|
|
|
|
return Result<void>();
|
|
|
|
}
|
2024-08-04 19:38:56 +00:00
|
|
|
uint64_t reg;
|
|
|
|
Array code;
|
|
|
|
};
|
|
|
|
|
2024-07-30 22:52:23 +00:00
|
|
|
class Compiler {
|
|
|
|
public:
|
2024-08-09 22:45:06 +00:00
|
|
|
Compiler() {}
|
2024-07-30 22:52:23 +00:00
|
|
|
|
|
|
|
Result<Value> compile(Value& expr);
|
2024-08-04 19:38:56 +00:00
|
|
|
Result<Expression> compile_expr(Context& context, Value& expr);
|
|
|
|
Result<Expression> compile_list(Context& context, Pair& expr);
|
2024-08-10 10:17:20 +00:00
|
|
|
Result<Expression> compile_primop(Context& context, Symbol& op, Pair& expr);
|
2024-08-23 20:30:05 +00:00
|
|
|
Result<Expression> compile_comparison(Context& context, Symbol& op,
|
|
|
|
Pair& expr);
|
2024-08-24 23:55:11 +00:00
|
|
|
Result<Expression> compile_constant(Context& context, Value& value);
|
2024-08-17 11:33:45 +00:00
|
|
|
Result<Expression> compile_symbol(Context& context, Symbol& value);
|
2024-08-15 00:18:05 +00:00
|
|
|
Result<Expression> compile_bool(Context& context, Bool& value);
|
|
|
|
Result<Expression> compile_if(Context& context, Symbol& op, Pair& expr);
|
2024-08-27 21:31:13 +00:00
|
|
|
Result<Expression> compile_and(Context& context, Symbol& op, Pair& expr);
|
|
|
|
Result<Expression> compile_or(Context& context, Symbol& op, Pair& expr);
|
|
|
|
Result<Expression> compile_not(Context& context, Symbol& op, Pair& expr);
|
2024-08-23 21:08:02 +00:00
|
|
|
Result<Expression> compile_fn(Context& context, Symbol& op, Pair& expr);
|
2024-08-28 22:57:01 +00:00
|
|
|
Result<Expression> compile_let(Context& context, Symbol& op, Pair& expr);
|
2024-08-17 11:33:45 +00:00
|
|
|
Result<Expression> compile_body(Context& context, Pair& expr);
|
2024-08-17 22:22:21 +00:00
|
|
|
Result<Expression> compile_function_call(Context& context, Pair& expr);
|
2024-07-30 22:52:23 +00:00
|
|
|
};
|
2024-08-11 20:37:37 +00:00
|
|
|
|
|
|
|
Result<Value> compile(Value& expr);
|