diff --git a/CMakeLists.txt b/CMakeLists.txt index 49933ec..d9df42c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,6 +6,7 @@ project( set(CMAKE_CXX_STANDARD 20) set(CMAKE_COLOR_DIAGNOSTICS OFF) +set(CMAKE_VERBOSE_MAKEFILE ON) find_package(LLVM REQUIRED CONFIG) include_directories(${LLVM_INCLUDE_DIRS}) diff --git a/src/Compiler/ModuleBuilder.cpp b/src/Compiler/ModuleBuilder.cpp index 833f249..c64e96d 100644 --- a/src/Compiler/ModuleBuilder.cpp +++ b/src/Compiler/ModuleBuilder.cpp @@ -1,5 +1,12 @@ #include "ModuleBuilder.h" +#include "Parser/Statement/StatementExpression.h" +#include "Parser/Statement/StatementBlock.h" +#include "Parser/Statement/StatementFunction.h" +#include "Parser/Statement/StatementVariable.h" +#include "Parser/Statement/StatementReturn.h" +#include "Parser/Statement/StatementMetaExternFunction.h" + ModuleBuilder::ModuleBuilder(string moduleName, string sourceFileName, vector> statements): moduleName(moduleName), sourceFileName(sourceFileName), statements(statements) { context = make_shared(); @@ -23,10 +30,10 @@ shared_ptr ModuleBuilder::getModule() { void ModuleBuilder::buildStatement(shared_ptr statement) { switch (statement->getKind()) { case StatementKind::FUNCTION_DECLARATION: - buildFunctionDeclaration(dynamic_pointer_cast(statement)); + buildFunctionDeclaration(dynamic_pointer_cast(statement)); break; case StatementKind::VAR_DECLARATION: - buildVarDeclaration(dynamic_pointer_cast(statement)); + buildVarDeclaration(dynamic_pointer_cast(statement)); break; case StatementKind::BLOCK: buildBlock(dynamic_pointer_cast(statement)); @@ -45,7 +52,7 @@ void ModuleBuilder::buildStatement(shared_ptr statement) { } } -void ModuleBuilder::buildFunctionDeclaration(shared_ptr statement) { +void ModuleBuilder::buildFunctionDeclaration(shared_ptr statement) { // get argument types vector types; for (pair &arg : statement->getArguments()) { @@ -85,7 +92,7 @@ void ModuleBuilder::buildFunctionDeclaration(shared_ptr statement) { +void ModuleBuilder::buildVarDeclaration(shared_ptr statement) { llvm::Value *value = valueForExpression(statement->getExpression()); llvm::AllocaInst *alloca = builder->CreateAlloca(typeForValueType(statement->getValueType()), nullptr, statement->getName()); allocaMap[statement->getName()] = alloca; diff --git a/src/Compiler/ModuleBuilder.h b/src/Compiler/ModuleBuilder.h index cd88b9d..c48818f 100644 --- a/src/Compiler/ModuleBuilder.h +++ b/src/Compiler/ModuleBuilder.h @@ -11,7 +11,13 @@ #include #include "Parser/Expression.h" -#include "Parser/Statement.h" +#include "Parser/Statement/Statement.h" + +class StatementBlock; +class StatementFunction; +class StatementVariable; +class StatementReturn; +class StatementMetaExternFunction; using namespace std; @@ -34,8 +40,8 @@ private: map funMap; void buildStatement(shared_ptr statement); - void buildFunctionDeclaration(shared_ptr statement); - void buildVarDeclaration(shared_ptr statement); + void buildFunctionDeclaration(shared_ptr statement); + void buildVarDeclaration(shared_ptr statement); void buildBlock(shared_ptr statement); void buildReturn(shared_ptr statement); void buildMetaExternFunction(shared_ptr statement); diff --git a/src/Parser/Expression.cpp b/src/Parser/Expression.cpp index 18a2108..f25a6f6 100644 --- a/src/Parser/Expression.cpp +++ b/src/Parser/Expression.cpp @@ -1,5 +1,8 @@ #include "Expression.h" +#include "Parser/Statement/StatementExpression.h" +#include "Parser/Statement/StatementBlock.h" + Expression::Expression(ExpressionKind kind, ValueType valueType): kind(kind), valueType(valueType) { } diff --git a/src/Parser/Expression.h b/src/Parser/Expression.h index a0a9a03..87dd803 100644 --- a/src/Parser/Expression.h +++ b/src/Parser/Expression.h @@ -2,7 +2,7 @@ #define EXPRESSION_H #include "Lexer/Token.h" -#include "Statement.h" +#include "Parser/Statement/Statement.h" #include "Types.h" class StatementBlock; diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp index 31bed5a..6a6f802 100644 --- a/src/Parser/Parser.cpp +++ b/src/Parser/Parser.cpp @@ -1,5 +1,13 @@ #include "Parser.h" +#include "Parser/Statement/StatementExpression.h" +#include "Parser/Statement/StatementBlock.h" +#include "Parser/Statement/StatementFunction.h" +#include "Parser/Statement/StatementVariable.h" +#include "Parser/Statement/StatementReturn.h" +#include "Parser/Statement/StatementMetaExternFunction.h" +#include "Parser/Statement/StatementInvalid.h" + Parser::Parser(vector> tokens): tokens(tokens) { } @@ -103,7 +111,7 @@ shared_ptr Parser::matchStatementFunctionDeclaration() { if(!tryMatchingTokenKinds({TokenKind::NEW_LINE}, false, true)) return matchStatementInvalid("Expected a new line after a function declaration"); - return make_shared(identifierToken->getLexme(), arguments, returnType, dynamic_pointer_cast(statementBlock)); + return make_shared(identifierToken->getLexme(), arguments, returnType, dynamic_pointer_cast(statementBlock)); } shared_ptr Parser::matchStatementVarDeclaration() { @@ -138,7 +146,7 @@ shared_ptr Parser::matchStatementVarDeclaration() { if (!tryMatchingTokenKinds({TokenKind::NEW_LINE}, false, true)) return matchStatementInvalid("Expected a new line after variable declaration"); - return make_shared(identifierToken->getLexme(), valueType, expression); + return make_shared(identifierToken->getLexme(), valueType, expression); } shared_ptr Parser::matchStatementBlock(vector terminalTokenKinds, bool shouldConsumeTerminal) { diff --git a/src/Parser/Parser.h b/src/Parser/Parser.h index aa8d1ea..4e2d87c 100644 --- a/src/Parser/Parser.h +++ b/src/Parser/Parser.h @@ -5,7 +5,7 @@ #include "Lexer/Token.h" #include "Expression.h" -#include "Statement.h" +#include "Parser/Statement/Statement.h" using namespace std; diff --git a/src/Parser/Statement.cpp b/src/Parser/Statement.cpp deleted file mode 100644 index 832924f..0000000 --- a/src/Parser/Statement.cpp +++ /dev/null @@ -1,223 +0,0 @@ -#include "Statement.h" - -string valueTypeToString(ValueType valueType) { - switch (valueType) { - case ValueType::NONE: - return "NONE"; - case ValueType::BOOL: - return "BOOL"; - case ValueType::SINT32: - return "SINT32"; - case ValueType::REAL32: - return "REAL32"; - } -} - -// -// Statement -Statement::Statement(StatementKind kind): kind(kind) { -} - -StatementKind Statement::getKind() { - return kind; -} - -bool Statement::isValid() { - return kind != StatementKind::INVALID; -} - -string Statement::toString(int indent) { - return "STATEMENT"; -} - -// -// StatementFunctionDeclaration -StatementFunctionDeclaration::StatementFunctionDeclaration(string name, vector> arguments, ValueType returnValueType, shared_ptr statementBlock): -Statement(StatementKind::FUNCTION_DECLARATION), name(name), arguments(arguments), returnValueType(returnValueType), statementBlock(statementBlock) { -} - -string StatementFunctionDeclaration::getName() { - return name; -} - -vector> StatementFunctionDeclaration::getArguments() { - return arguments; -} - -ValueType StatementFunctionDeclaration::getReturnValueType() { - return returnValueType; -} - -shared_ptr StatementFunctionDeclaration::getStatementBlock() { - return statementBlock; -} - -string StatementFunctionDeclaration::toString(int indent) { - string value = ""; - for (int ind=0; indtoString(indent+1); - for (int ind=0; ind expression): -Statement(StatementKind::VAR_DECLARATION), name(name), valueType(valueType), expression(expression) { -} - -string StatementVarDeclaration::getName() { - return name; -} - -ValueType StatementVarDeclaration::getValueType() { - return valueType; -} - -shared_ptr StatementVarDeclaration::getExpression() { - return expression; -} - -string StatementVarDeclaration::toString(int indent) { - string value; - for (int ind=0; indtoString(indent+1); - value += "\n"; - return value; -} - -// -// StatementBlock -StatementBlock::StatementBlock(vector> statements): -Statement(StatementKind::BLOCK), statements(statements) { - if (!statements.empty() && statements.back()->getKind() == StatementKind::EXPRESSION) { - statementExpression = dynamic_pointer_cast(statements.back()); - this->statements.pop_back(); - } -} - -vector> StatementBlock::getStatements() { - return statements; -} - -shared_ptr StatementBlock::getStatementExpression() { - return statementExpression; -} - -string StatementBlock::toString(int indent) { - string value; - for (int i=0; itoString(indent); - } - if (statementExpression != nullptr) { - for (int ind=0; indtoString(indent); - } - for (int ind=0; ind expression): -Statement(StatementKind::RETURN), expression(expression) { -} - -shared_ptr StatementReturn::getExpression() { - return expression; -} - -string StatementReturn::toString(int indent) { - string value; - for (int ind=0; indtoString(indent+1); - } - value += "\n"; - return value; -} - -// -// StatementExpression -StatementExpression::StatementExpression(shared_ptr expression): -Statement(StatementKind::EXPRESSION), expression(expression) { -} - -shared_ptr StatementExpression::getExpression() { - return expression; -} - -string StatementExpression::toString(int indent) { - string value; - for (int ind=0; indtoString(indent); - value += "\n"; - return value; -} - -// -// Statement @ Function -StatementMetaExternFunction::StatementMetaExternFunction(string name, vector> arguments, ValueType returnValueType): -Statement(StatementKind::META_EXTERN_FUNCTION), name(name), arguments(arguments), returnValueType(returnValueType) { -} - -string StatementMetaExternFunction::getName() { - return name; -} - -vector> StatementMetaExternFunction::getArguments() { - return arguments; -} - -ValueType StatementMetaExternFunction::getReturnValueType() { - return returnValueType; -} - -string StatementMetaExternFunction::toString(int indent) { - string value; - for (int ind=0; ind token, string message): -Statement(StatementKind::INVALID), token(token), message(message) { -} - -string StatementInvalid::toString(int indent) { - return "Error for token " + token->toString() + " at " + to_string(token->getLine()) + ":" + to_string(token->getColumn()) + ": " + message + "\n"; -} - -string StatementInvalid::getMessage() { - return message; -} diff --git a/src/Parser/Statement.h b/src/Parser/Statement.h deleted file mode 100644 index f48f2a3..0000000 --- a/src/Parser/Statement.h +++ /dev/null @@ -1,143 +0,0 @@ -#ifndef STATEMENT_H -#define STATEMENT_H - -#include - -#include "Lexer/Token.h" -#include "Expression.h" -#include "Types.h" - -class Expression; -class Statement; -class StatementBlock; -class StatementReturn; -class StatementExpression; -class StatementInvalid; - -using namespace std; - -enum class StatementKind { - FUNCTION_DECLARATION, - VAR_DECLARATION, - BLOCK, - RETURN, - EXPRESSION, - META_EXTERN_FUNCTION, - INVALID -}; - -// -// Statement -class Statement { -private: - StatementKind kind; - -public: - Statement(StatementKind kind); - StatementKind getKind(); - bool isValid(); - virtual string toString(int indent); -}; - -// -// StatementFunctionDeclaration -class StatementFunctionDeclaration: public Statement { -private: - string name; - vector> arguments; - ValueType returnValueType; - shared_ptr statementBlock; - -public: - StatementFunctionDeclaration(string name, vector> arguments, ValueType returnValueType, shared_ptr statementBlock); - string getName(); - vector> getArguments(); - ValueType getReturnValueType(); - shared_ptr getStatementBlock(); - string toString(int indent) override; -}; - -// -// StatementVarDeclaration -class StatementVarDeclaration: public Statement { -private: - string name; - ValueType valueType; - shared_ptr expression; - -public: - StatementVarDeclaration(string name, ValueType valueType, shared_ptr expression); - string getName(); - ValueType getValueType(); - shared_ptr getExpression(); - string toString(int indent) override; -}; - -// -// StatementBlock -class StatementBlock: public Statement { -private: - vector> statements; - shared_ptr statementExpression; - -public: - StatementBlock(vector> statements); - vector> getStatements(); - shared_ptr getStatementExpression(); - string toString(int indent) override; -}; - -// -// StatementReturn -class StatementReturn: public Statement { -private: - shared_ptr expression; - -public: - StatementReturn(shared_ptr expression); - shared_ptr getExpression(); - string toString(int indent) override; -}; - -// -// StatementExpression -class StatementExpression: public Statement { -private: - shared_ptr expression; - -public: - StatementExpression(shared_ptr expression); - shared_ptr getExpression(); - string toString(int indent) override; -}; - -// -// Statement @ Extern Function -class StatementMetaExternFunction: public Statement { -private: - string name; - vector> arguments; - ValueType returnValueType; - -public: - StatementMetaExternFunction(string name, vector> arguments, ValueType returnValueType); - string getName(); - vector> getArguments(); - ValueType getReturnValueType(); - string toString(int indent) override; -}; - -// -// StatementInvalid -class StatementInvalid: public Statement { -private: - shared_ptr token; - string message; - -public: - StatementInvalid(shared_ptr token, string message); - string toString(int indent) override; - string getMessage(); -}; - -#endif \ No newline at end of file diff --git a/src/Parser/Statement/Statement.cpp b/src/Parser/Statement/Statement.cpp new file mode 100644 index 0000000..ed664f8 --- /dev/null +++ b/src/Parser/Statement/Statement.cpp @@ -0,0 +1,16 @@ +#include "Statement.h" + +Statement::Statement(StatementKind kind): +kind(kind) { } + +StatementKind Statement::getKind() { + return kind; +} + +bool Statement::isValid() { + return kind != StatementKind::INVALID; +} + +string Statement::toString(int indent) { + return "STATEMENT"; +} diff --git a/src/Parser/Statement/Statement.h b/src/Parser/Statement/Statement.h new file mode 100644 index 0000000..fc03391 --- /dev/null +++ b/src/Parser/Statement/Statement.h @@ -0,0 +1,40 @@ +#ifndef STATEMENT_H +#define STATEMENT_H + +#include + +#include "Lexer/Token.h" +#include "Parser/Expression.h" +#include "Types.h" + +class Expression; +class Statement; +class StatementBlock; +class StatementReturn; +class StatementExpression; +class StatementInvalid; + +using namespace std; + +enum class StatementKind { + FUNCTION_DECLARATION, + VAR_DECLARATION, + BLOCK, + RETURN, + EXPRESSION, + META_EXTERN_FUNCTION, + INVALID +}; + +class Statement { +private: + StatementKind kind; + +public: + Statement(StatementKind kind); + StatementKind getKind(); + bool isValid(); + virtual string toString(int indent); +}; + +#endif \ No newline at end of file diff --git a/src/Parser/Statement/StatementBlock.cpp b/src/Parser/Statement/StatementBlock.cpp new file mode 100644 index 0000000..960f7c3 --- /dev/null +++ b/src/Parser/Statement/StatementBlock.cpp @@ -0,0 +1,38 @@ +#include "StatementBlock.h" + +#include "Parser/Statement/StatementExpression.h" + +StatementBlock::StatementBlock(vector> statements): +Statement(StatementKind::BLOCK), statements(statements) { + if (!statements.empty() && statements.back()->getKind() == StatementKind::EXPRESSION) { + statementExpression = dynamic_pointer_cast(statements.back()); + this->statements.pop_back(); + } +} + +vector> StatementBlock::getStatements() { + return statements; +} + +shared_ptr StatementBlock::getStatementExpression() { + return statementExpression; +} + +string StatementBlock::toString(int indent) { + string value; + for (int i=0; itoString(indent); + } + if (statementExpression != nullptr) { + for (int ind=0; indtoString(indent); + } + for (int ind=0; ind> statements; + shared_ptr statementExpression; + +public: + StatementBlock(vector> statements); + vector> getStatements(); + shared_ptr getStatementExpression(); + string toString(int indent) override; +}; \ No newline at end of file diff --git a/src/Parser/Statement/StatementExpression.cpp b/src/Parser/Statement/StatementExpression.cpp new file mode 100644 index 0000000..1be2117 --- /dev/null +++ b/src/Parser/Statement/StatementExpression.cpp @@ -0,0 +1,17 @@ +#include "StatementExpression.h" + +StatementExpression::StatementExpression(shared_ptr expression): +Statement(StatementKind::EXPRESSION), expression(expression) { } + +shared_ptr StatementExpression::getExpression() { + return expression; +} + +string StatementExpression::toString(int indent) { + string value; + for (int ind=0; indtoString(indent); + value += "\n"; + return value; +} \ No newline at end of file diff --git a/src/Parser/Statement/StatementExpression.h b/src/Parser/Statement/StatementExpression.h new file mode 100644 index 0000000..2510f71 --- /dev/null +++ b/src/Parser/Statement/StatementExpression.h @@ -0,0 +1,11 @@ +#include "Parser/Statement/Statement.h" + +class StatementExpression: public Statement { +private: + shared_ptr expression; + +public: + StatementExpression(shared_ptr expression); + shared_ptr getExpression(); + string toString(int indent) override; +}; \ No newline at end of file diff --git a/src/Parser/Statement/StatementFunction.cpp b/src/Parser/Statement/StatementFunction.cpp new file mode 100644 index 0000000..6f540d8 --- /dev/null +++ b/src/Parser/Statement/StatementFunction.cpp @@ -0,0 +1,49 @@ +#include "StatementFunction.h" + +#include "Parser/Statement/StatementBlock.h" + +static string valueTypeToString(ValueType valueType) { + switch (valueType) { + case ValueType::NONE: + return "NONE"; + case ValueType::BOOL: + return "BOOL"; + case ValueType::SINT32: + return "SINT32"; + case ValueType::REAL32: + return "REAL32"; + } +} + +StatementFunction::StatementFunction(string name, vector> arguments, ValueType returnValueType, shared_ptr statementBlock): +Statement(StatementKind::FUNCTION_DECLARATION), name(name), arguments(arguments), returnValueType(returnValueType), statementBlock(statementBlock) { } + +string StatementFunction::getName() { + return name; +} + +vector> StatementFunction::getArguments() { + return arguments; +} + +ValueType StatementFunction::getReturnValueType() { + return returnValueType; +} + +shared_ptr StatementFunction::getStatementBlock() { + return statementBlock; +} + +string StatementFunction::toString(int indent) { + string value = ""; + for (int ind=0; indtoString(indent+1); + for (int ind=0; ind> arguments; + ValueType returnValueType; + shared_ptr statementBlock; + +public: + StatementFunction(string name, vector> arguments, ValueType returnValueType, shared_ptr statementBlock); + string getName(); + vector> getArguments(); + ValueType getReturnValueType(); + shared_ptr getStatementBlock(); + string toString(int indent) override; +}; \ No newline at end of file diff --git a/src/Parser/Statement/StatementInvalid.cpp b/src/Parser/Statement/StatementInvalid.cpp new file mode 100644 index 0000000..1d7de6e --- /dev/null +++ b/src/Parser/Statement/StatementInvalid.cpp @@ -0,0 +1,12 @@ +#include "Parser/Statement/StatementInvalid.h" + +StatementInvalid::StatementInvalid(shared_ptr token, string message): +Statement(StatementKind::INVALID), token(token), message(message) { } + +string StatementInvalid::toString(int indent) { + return "Error for token " + token->toString() + " at " + to_string(token->getLine()) + ":" + to_string(token->getColumn()) + ": " + message + "\n"; +} + +string StatementInvalid::getMessage() { + return message; +} \ No newline at end of file diff --git a/src/Parser/Statement/StatementInvalid.h b/src/Parser/Statement/StatementInvalid.h new file mode 100644 index 0000000..5b6e3a3 --- /dev/null +++ b/src/Parser/Statement/StatementInvalid.h @@ -0,0 +1,12 @@ +#include "Parser/Statement/Statement.h" + +class StatementInvalid: public Statement { +private: + shared_ptr token; + string message; + +public: + StatementInvalid(shared_ptr token, string message); + string toString(int indent) override; + string getMessage(); +}; diff --git a/src/Parser/Statement/StatementMetaExternFunction.cpp b/src/Parser/Statement/StatementMetaExternFunction.cpp new file mode 100644 index 0000000..ea09299 --- /dev/null +++ b/src/Parser/Statement/StatementMetaExternFunction.cpp @@ -0,0 +1,40 @@ +#include "Parser/Statement/StatementMetaExternFunction.h" + +static string valueTypeToString(ValueType valueType) { + switch (valueType) { + case ValueType::NONE: + return "NONE"; + case ValueType::BOOL: + return "BOOL"; + case ValueType::SINT32: + return "SINT32"; + case ValueType::REAL32: + return "REAL32"; + } +} + +StatementMetaExternFunction::StatementMetaExternFunction(string name, vector> arguments, ValueType returnValueType): +Statement(StatementKind::META_EXTERN_FUNCTION), name(name), arguments(arguments), returnValueType(returnValueType) { } + +string StatementMetaExternFunction::getName() { + return name; +} + +vector> StatementMetaExternFunction::getArguments() { + return arguments; +} + +ValueType StatementMetaExternFunction::getReturnValueType() { + return returnValueType; +} + +string StatementMetaExternFunction::toString(int indent) { + string value; + for (int ind=0; ind> arguments; + ValueType returnValueType; + +public: + StatementMetaExternFunction(string name, vector> arguments, ValueType returnValueType); + string getName(); + vector> getArguments(); + ValueType getReturnValueType(); + string toString(int indent) override; +}; \ No newline at end of file diff --git a/src/Parser/Statement/StatementReturn.cpp b/src/Parser/Statement/StatementReturn.cpp new file mode 100644 index 0000000..63f9055 --- /dev/null +++ b/src/Parser/Statement/StatementReturn.cpp @@ -0,0 +1,25 @@ +#include "Parser/Statement/StatementReturn.h" + +#include "Parser/Expression.h" + +StatementReturn::StatementReturn(shared_ptr expression): +Statement(StatementKind::RETURN), expression(expression) { } + +shared_ptr StatementReturn::getExpression() { + return expression; +} + +string StatementReturn::toString(int indent) { + string value; + for (int ind=0; indtoString(indent+1); + } + value += "\n"; + return value; +} \ No newline at end of file diff --git a/src/Parser/Statement/StatementReturn.h b/src/Parser/Statement/StatementReturn.h new file mode 100644 index 0000000..73160a5 --- /dev/null +++ b/src/Parser/Statement/StatementReturn.h @@ -0,0 +1,13 @@ +#include "Parser/Statement/Statement.h" + +class Expression; + +class StatementReturn: public Statement { +private: + shared_ptr expression; + +public: + StatementReturn(shared_ptr expression); + shared_ptr getExpression(); + string toString(int indent) override; +}; \ No newline at end of file diff --git a/src/Parser/Statement/StatementVariable.cpp b/src/Parser/Statement/StatementVariable.cpp new file mode 100644 index 0000000..05d8ab4 --- /dev/null +++ b/src/Parser/Statement/StatementVariable.cpp @@ -0,0 +1,43 @@ +#include "StatementVariable.h" + +static string valueTypeToString(ValueType valueType) { + switch (valueType) { + case ValueType::NONE: + return "NONE"; + case ValueType::BOOL: + return "BOOL"; + case ValueType::SINT32: + return "SINT32"; + case ValueType::REAL32: + return "REAL32"; + } +} + +StatementVariable::StatementVariable(string name, ValueType valueType, shared_ptr expression): +Statement(StatementKind::VAR_DECLARATION), name(name), valueType(valueType), expression(expression) { } + +string StatementVariable::getName() { + return name; +} + +ValueType StatementVariable::getValueType() { + return valueType; +} + +shared_ptr StatementVariable::getExpression() { + return expression; +} + +string StatementVariable::toString(int indent) { + string value; + for (int ind=0; indtoString(indent+1); + value += "\n"; + return value; +} \ No newline at end of file diff --git a/src/Parser/Statement/StatementVariable.h b/src/Parser/Statement/StatementVariable.h new file mode 100644 index 0000000..f67ad40 --- /dev/null +++ b/src/Parser/Statement/StatementVariable.h @@ -0,0 +1,15 @@ +#include "Parser/Statement/Statement.h" + +class StatementVariable: public Statement { +private: + string name; + ValueType valueType; + shared_ptr expression; + +public: + StatementVariable(string name, ValueType valueType, shared_ptr expression); + string getName(); + ValueType getValueType(); + shared_ptr getExpression(); + string toString(int indent) override; +}; \ No newline at end of file