ast_node.hpp (3364B)
1 #pragma once 2 3 #include "node_type.hpp" 4 #include "type.hpp" 5 6 #include <string> 7 #include <vector> 8 #include <memory> 9 10 class ASTNode { 11 public: 12 int line; 13 int col; 14 15 virtual ~ASTNode() = default; 16 } 17 18 class ProgramNode : ASTNode { 19 public: 20 std::vector<FunctionDeclarationNode> function_declarations; 21 22 ProgramNode(std::vector<FunctionDeclarationNode> function_declarations, int line, int col) : function_declarations(function_declarations), line(line), col(col) { } 23 }; 24 25 class FunctionDeclarationNode : public ASTNode { 26 public: 27 std::string identifier; 28 std::vector<ParameterNode> parameters; 29 Type return_type; 30 std::vector<StatementNode> body; 31 32 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) { } 33 }; 34 35 class ParameterNode : public ASTNode { 36 public: 37 Type type; 38 std::string identifier; 39 40 ParameterNode(Type type, std::string identifier, int line, int column) : type(type), identifier(identifier), line(line), column(column) { } 41 }; 42 43 class ArgumentNode : public ASTNode { 44 ASTNode* expression; 45 ASTNode* variable; 46 47 ArgumentNode(ASTNode* expression, ASTNode* variable, int line int column) : expression(expression), variable(variable), line(line), column(column) { } 48 }; 49 50 class VariableDeclarationNode : public ASTNode { 51 public: 52 Type type; 53 std::string identifier; 54 ASTNode* value; 55 56 VariableDeclarationNode(Type type, std::string identifier, ASTNode* value, int line, int column) : type(type), identifier(identifier), value(value), line(line), column(column) { } 57 }; 58 59 class VariableAssignmentNode : public ASTNode { 60 public: 61 std::string identifier; 62 ASTNode* value; 63 64 VariableAssignmentNode(std::string identifier, ASTNode* value, int line, int column) : identifier(identifier), value(value), line(line), column(column) { } 65 }; 66 67 class ReturnNode : public ASTNode { 68 public: 69 ASTNode* expression; 70 71 ReturnNode(ASTNode* expression, int line, int column) : expression(expression), line(line), column(column) { } 72 }; 73 74 75 class BinaryOperationNode : public ASTNode { 76 char operation; 77 ASTNode* left; 78 ASTNode* right; 79 80 BinaryOperationNode(std::string operation, ASTNode* left, ASTNode* right, int line, int column) : operation(operation), left(left), right(right), line(line), column(column) { } 81 }; 82 83 class UnaryOperationNode : public ASTNode { 84 char operation; 85 ASTNode* operand; 86 87 UnaryOperationNode(char operation, ASTNode* operand, int line, int column) : operation(operation), operand(operand), line(line), column(column) { } 88 }; 89 90 class StringLiteralNode : public ASTNode { 91 std::string value; 92 93 StringLiteralNode(std::string value, int line, int column) : value(value), line(line), column(column) { } 94 }; 95 96 class NumberLiteralNode : public ASTNode { 97 int value; 98 99 NumberLiteralNode(int value, int line, int column) : value(value), line(line), column(column) { } 100 }; 101 102 class ComparisonNode : public ASTNode { 103 std::string operation; 104 ASTNode* left; 105 ASTNode* right; 106 107 ComparisonNode(std::string operation, ASTNode* left, ASTNode* right, int line, int col) : operation(operation), left(left), right(right), line(line), column(column) { } 108 };