feat: beta compiling to fasm (codegen) + hello world example let's goooo
This commit is contained in:
163
include/ast.hpp
163
include/ast.hpp
@ -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);
|
||||
|
||||
Reference in New Issue
Block a user