aboutsummaryrefslogtreecommitdiff
path: root/include/ast_node.hpp
blob: 5338034928828b6d6608b6d80e4660b592aca79a (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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#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<FunctionDeclarationNode> function_declarations;

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

class FunctionDeclarationNode : public ASTNode {
public:
    std::string identifier;
    std::vector<ParameterNode> parameters;
    Type return_type;
    std::vector<StatementNode> body;

    FunctionDeclarationNode(std::string identifier, std::vector<ParameterNode> parameters, Type return_type, std::vector<StatementNode> body, int line, int col) : identifier(identifier), parameters(parameters), return_type(return_type), body(body), line(line), col(col) { }
};

class ParameterNode : public ASTNode {
public:
    Type type;
    std::string identifier;

    ParameterNode(Type type, std::string identifier, int line, int column) : type(type), identifier(identifier), line(line), column(column) { }
};

class ArgumentNode : public ASTNode {
    ASTNode* expression;
    ASTNode* variable;

    ArgumentNode(ASTNode* expression, ASTNode* variable, int line int column) : expression(expression), variable(variable), line(line), column(column) { }
};

class VariableDeclarationNode : public ASTNode {
public:
    Type type;
    std::string identifier;
    ASTNode* value;

    VariableDeclarationNode(Type type, std::string identifier, ASTNode* value, int line, int column) : type(type), identifier(identifier), value(value), line(line), column(column) { }
};

class VariableAssignmentNode : public ASTNode {
public:
    std::string identifier;
    ASTNode* value;

    VariableAssignmentNode(std::string identifier, ASTNode* value, int line, int column) : identifier(identifier), value(value), line(line), column(column) { }
};

class ReturnNode : public ASTNode {
public:
    ASTNode* expression;

    ReturnNode(ASTNode* expression, int line, int column) : expression(expression), line(line), column(column) { }
};


class BinaryOperationNode : public ASTNode {
    char operation;
    ASTNode* left;
    ASTNode* right;

    BinaryOperationNode(std::string operation, ASTNode* left, ASTNode* right, int line, int column) : operation(operation), left(left), right(right), line(line), column(column) { }
};

class UnaryOperationNode : public ASTNode {
    char operation;
    ASTNode* operand;
    
    UnaryOperationNode(char operation, ASTNode* operand, int line, int column) : operation(operation), operand(operand), line(line), column(column) { }
};

class StringLiteralNode : public ASTNode {
    std::string value;

    StringLiteralNode(std::string value, int line, int column) : value(value), line(line), column(column) { }
};

class NumberLiteralNode : public ASTNode {
    int value;

    NumberLiteralNode(int value, int line, int column) : value(value), line(line), column(column) { }
};

class ComparisonNode : public ASTNode {
    std::string operation;
    ASTNode* left;
    ASTNode* right;

    ComparisonNode(std::string operation, ASTNode* left, ASTNode* right, int line, int col) : operation(operation), left(left), right(right), line(line), column(column) { }
};