feat: support function params + stack based compiler!
This commit is contained in:
@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user