valeri/src/compiler.hpp

73 lines
2.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() {}
Compiler(String&& fname) : _fname(std::move(fname)) {}
static Result<Compiler> create(const String& fname);
Result<Value> compile(const Value& expr);
Result<Expression> compile_expr(Context& context, const Value& expr);
Result<Expression> compile_list(Context& context, const Value& expr);
Result<Expression> compile_primop(Context& context, Symbol& op,
const Value& expr);
2024-08-23 20:30:05 +00:00
Result<Expression> compile_comparison(Context& context, Symbol& op,
const Value& expr);
Result<Expression> compile_constant(Context& context, const Value& value);
Result<Expression> compile_symbol(Context& context, const Value& value);
Result<Expression> compile_if(Context& context, Symbol& op,
const Value& expr);
2024-09-28 19:03:38 +00:00
Result<Expression> compile_when(Context& context, Symbol& op,
const Value& expr);
Result<Expression> compile_and(Context& context, Symbol& op,
const Value& expr);
Result<Expression> compile_or(Context& context, Symbol& op,
const Value& expr);
Result<Expression> compile_not(Context& context, Symbol& op,
const Value& expr);
Result<Expression> compile_def(Context& context, Symbol& op,
const Value& expr);
Result<Expression> compile_quote(Context& context, Symbol& op,
const Value& expr);
2024-09-09 21:56:06 +00:00
Result<Expression> compile_syntax(Context& context, Symbol& op,
const Value& expr);
Result<Expression> compile_fn(Context& context, Symbol& op,
const Value& expr);
Result<Expression> compile_let(Context& context, Symbol& op,
const Value& expr);
Result<Expression> compile_body(Context& context, const Value& expr);
Result<Expression> compile_function_call(Context& context, const Value& expr);
Result<Expression> syntax_error(const Value& expr, const char* message);
private:
String _fname;
};
Result<Value> compile(const String& fname, const Value& expr);