valeri/src/compiler.hpp

50 lines
1.7 KiB
C++
Raw Normal View History

#pragma once
#include "common.hpp"
2024-08-04 19:38:56 +00:00
struct Context;
struct Expression {
Expression() {}
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;
};
class Compiler {
public:
2024-08-09 22:45:06 +00:00
Compiler() {}
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);
Result<Expression> compile_constant(Context& context, Value& value);
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);
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);
Result<Expression> compile_fn(Context& context, Symbol& op, Pair& expr);
Result<Expression> compile_body(Context& context, Pair& expr);
Result<Expression> compile_function_call(Context& context, Pair& expr);
};
Result<Value> compile(Value& expr);