feat: beta compiling to fasm (codegen) + hello world example let's goooo

This commit is contained in:
2025-11-30 22:04:35 +01:00
parent 22f745e8dc
commit 16cc06b788
14 changed files with 1141 additions and 135 deletions

View File

@ -19,16 +19,15 @@ enum class NodeType
COUNT_NODES,
};
#define NODE_TYPE(x) \
NodeType GetType() const override { return NodeType::x; }
class Node
{
public:
virtual NodeType GetType() const = 0;
virtual ~Node() {}
};
#define NODE_TYPE(x) \
NodeType GetType() const override { return NodeType::x; }
};
class ExpressionNode : public Node
{
@ -79,79 +78,15 @@ class ExternNode : public Node
{
public:
// TODO: support multiple extern symbols
ExternNode(char* symbol)
ExternNode(StringView symbol)
: m_symbol(symbol) {}
~ExternNode() override {
delete m_symbol;
}
~ExternNode() override = default;
NODE_TYPE(Extern)
private:
char* m_symbol;
};
class FnDeclNode : public Node
{
public:
// TODO: support parameters
FnDeclNode(char* name, Node* body)
: m_name(name), m_body(body) {}
~FnDeclNode() override {
delete m_name;
delete m_body;
}
NODE_TYPE(FnDecl)
const StringView& symbol() const { return m_symbol; }
private:
char* m_name;
Node* m_body;
};
class FnCallNode : public Node
{
public:
// TODO: support multiple arguments
FnCallNode(char* name, Node* arg)
: m_name(name), m_arg(arg) {}
~FnCallNode() override {
delete m_name;
delete m_arg;
}
NODE_TYPE(FnCall)
private:
char* m_name;
Node* m_arg;
};
class VariableNode : public Node
{
public:
VariableNode(char* name)
: m_name(name) {}
~VariableNode() override {
delete m_name;
}
NODE_TYPE(Variable)
private:
char* m_name;
};
class VarDeclNode : public Node
{
public:
VarDeclNode(char* name, Node* value)
: m_name(name), m_value(value) {}
~VarDeclNode() override {
delete m_name;
delete m_value;
}
NODE_TYPE(VarDecl)
private:
char* m_name;
Node* m_value;
StringView m_symbol;
};
class CompoundNode : public Node
@ -187,6 +122,77 @@ private:
std::vector<Node*> m_nodes;
};
class FnDeclNode : public Node
{
public:
// TODO: support parameters
FnDeclNode(const StringView& name, CompoundNode* body)
: m_name(name), m_body(body) {}
~FnDeclNode() override {
delete m_body;
}
NODE_TYPE(FnDecl)
public:
const StringView& name() const { return m_name; }
const CompoundNode* body() const { return m_body; }
private:
StringView m_name;
CompoundNode* m_body;
};
class FnCallNode : public Node
{
public:
// TODO: support multiple arguments
FnCallNode(const StringView& name, Node* arg)
: m_name(name), m_arg(arg) {}
~FnCallNode() override {
delete m_arg;
}
NODE_TYPE(FnCall)
public:
const StringView& name() const { return m_name; }
// TODO: support multiple args
const Node* arg() const { return m_arg; }
private:
StringView m_name;
Node* m_arg;
};
class VariableNode : public Node
{
public:
VariableNode(const StringView& name)
: m_name(name) {}
~VariableNode() override = default;
NODE_TYPE(Variable)
public:
const StringView& name() const { return m_name; }
private:
StringView m_name;
};
class VarDeclNode : public Node
{
public:
VarDeclNode(const StringView& name, Node* value)
: m_name(name), m_value(value) {}
~VarDeclNode() override {
delete m_value;
}
NODE_TYPE(VarDecl)
public:
const StringView& name() const { return m_name; }
const Node* value() const { return m_value; }
private:
StringView m_name;
Node* m_value;
};
class ProgramNode : public Node
{
public:
@ -203,6 +209,9 @@ public:
{
m_externs.push_back(extrn);
}
public:
const std::vector<ExternNode*> externs() const { return m_externs; }
const std::vector<FnDeclNode*> funcs() const { return m_funcs; }
private:
std::vector<FnDeclNode*> m_funcs;
std::vector<ExternNode*> m_externs;
@ -225,7 +234,7 @@ public:
{
// Function Declaration
m_lexer->NextExpect(TokenType::Id);
char *name = strdup(m_lexer->token().string);
StringView name = m_lexer->token().string;
m_lexer->NextExpect('(');
// TODO: parse parameters
m_lexer->NextExpect(')');
@ -239,7 +248,7 @@ public:
return new FnDeclNode(name, compound);
}
FnCallNode* ParseFnCall(char* name)
FnCallNode* ParseFnCall(const StringView& name)
{
// m_lexer->NextExpect(TokenType::Id);
// char* name = strdup(m_lexer->token().string);
@ -264,7 +273,7 @@ public:
case TokenType::Id: // variable name or function call
{
m_lexer->NextExpect(TokenType::Id);
char *name = strdup(m_lexer->token().string);
auto name = m_lexer->token().string;
token = m_lexer->seek_token();
if (token->token == '(')
{
@ -341,7 +350,7 @@ public:
{
m_lexer->NextExpect(TokenType::Local);
m_lexer->NextExpect(TokenType::Id);
char *name = strdup(m_lexer->token().string);
auto name = m_lexer->token().string;
m_lexer->NextExpect('=');
Node* value = ParseExpression();
return new VarDeclNode(name, value);