aboutsummaryrefslogtreecommitdiff
path: root/include/ast_node.hpp
blob: f1fcaf231e35ceb1c83afc7aef7ee9f145579c59 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#pragma once

#include "node_type.hpp"
#include "type.hpp"

#include <string>
#include <vector>
#include <memory>

class ASTNode {
public:
    int line;
    int col;

    virtual ~ASTNode() = default;
};

class ProgramNode : ASTNode {
public:
    std::vector<ASTNode> function_declarations;

    ProgramNode(std::vector<ASTNode> function_declarations, int line, int col) : function_declarations(function_declarations), line(line), col(col) { }
};

class FunctionDeclNode : ASTNode {
    Type type;
    std::vector<ParameterNode> parameters;
    std::vector<ASTNode> body;

    FunctionDeclNode(Type type, std::vector<ASTNode> parameters, std::vector<ASTNode> body, int line, int col) : type(type), parameters(parameters), body(body), line(line), col(col) { }
};

class ParameterNode : ASTNode {
    std::string name;
    Type type;

    ParameterNode(std::string name, std::string type, int line, int col) : name(name), type(type), line(line) col(col) { }
};

class VarDeclNode : ASTNode {
    std::string name;
    Type type;

    VarDeclNode(std::string name, std::string type, int line, int col) : name(name), type(type), line(line), col(col) { }
};

class AssignmentNode : ASTNode {
    std::string var_name;
    Type var_type;
    ASTNode* value;
    
    AssignmentNode(std::string var_name, Type var_type, ASTNode* value) : var_name(var_name), var_type(var_type), value(value), line(line), col(col) { }
};

class IfStatementNode : ASTNode {
    ASTNode* expression;
    ASTNode* body;
    ASTNode* else_statement = nullptr;
    ASTNode* elif_statement = nullptr;

    IfStatementNode(ASTNode* expression, ASTNode* body, ASTNode* else_statement, ASTNode* elif_statement, int line, int col) : expression(expression), body(body), else_statement(else_statement), elif_statement(elif_statement), line(line), col(col) { }
};

class WhileStatementNode : ASTNode {
    ASTNode* expression;
    ASTNode* body;

    WhileStatementNode(ASTNode* expression, ASTNode* body, int line, int col) : expression(expression), body(body), line(line), col(col) { }
};

class ForStatementNode : ASTNode {
    StatementNode* init;
    ASTNode* 
};