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) { }
};
|