feat: support function params + stack based compiler!

This commit is contained in:
2025-12-01 13:59:30 +01:00
parent b3498135aa
commit 952df07ce3
5 changed files with 156 additions and 118 deletions

View File

@ -126,8 +126,8 @@ class FnDeclNode : public Node
{
public:
// TODO: support parameters
FnDeclNode(const StringView& name, CompoundNode* body)
: m_name(name), m_body(body) {}
FnDeclNode(const StringView& name, CompoundNode* body, View<StringView> params)
: m_name(name), m_body(body), m_params(params) {}
~FnDeclNode() override {
delete m_body;
}
@ -136,9 +136,11 @@ public:
public:
const StringView& name() const { return m_name; }
const CompoundNode* body() const { return m_body; }
const View<StringView>& params() const { return m_params; }
private:
StringView m_name;
CompoundNode* m_body;
View<StringView> m_params;
};
class FnCallNode : public Node
@ -236,7 +238,13 @@ public:
m_lexer->NextExpect(TokenType::Id);
StringView name = m_lexer->token().string;
m_lexer->NextExpect('(');
// TODO: parse parameters
Builder<StringView> params;
// TODO: support multiple params
if (m_lexer->seek_token()->token != ')')
{
m_lexer->NextExpect(TokenType::Id);
params.Push(m_lexer->token().string);
}
m_lexer->NextExpect(')');
m_lexer->NextExpect('{');
auto compound = new CompoundNode();
@ -245,7 +253,7 @@ public:
compound->addNode(ParseStatement());
}
m_lexer->NextExpect('}');
return new FnDeclNode(name, compound);
return new FnDeclNode(name, compound, params.view());
}
FnCallNode* ParseFnCall(const StringView& name)
@ -253,7 +261,12 @@ public:
// m_lexer->NextExpect(TokenType::Id);
// char* name = strdup(m_lexer->token().string);
m_lexer->NextExpect('(');
Node* arg = ParseExpression();
Node* arg = nullptr;
// TODO: support multiple arguments
if (m_lexer->seek_token()->token != ')')
{
arg = ParseExpression();
}
m_lexer->NextExpect(')');
return new FnCallNode(name, arg);
}