diff --git a/src/Logger.cpp b/src/Logger.cpp index a5368b5..fd438d8 100644 --- a/src/Logger.cpp +++ b/src/Logger.cpp @@ -3,6 +3,7 @@ #include #include "Lexer/Token.h" + #include "Parser/Statement/Statement.h" #include "Parser/Statement/StatementMetaExternFunction.h" #include "Parser/Statement/StatementVariable.h" @@ -14,6 +15,13 @@ #include "Parser/Statement/StatementExpression.h" #include "Parser/Expression/Expression.h" +#include "Parser/Expression/ExpressionBinary.h" +#include "Parser/Expression/ExpressionIfElse.h" +#include "Parser/Expression/ExpressionVariable.h" +#include "Parser/Expression/ExpressionGrouping.h" +#include "Parser/Expression/ExpressionLiteral.h" +#include "Parser/Expression/ExpressionCall.h" +#include "Parser/Expression/ExpressionBlock.h" string Logger::toString(shared_ptr token) { switch (token->getKind()) { @@ -130,7 +138,7 @@ string Logger::toString(shared_ptr statement) { } string Logger::toString(shared_ptr statement) { - return format("{}({}|)", statement->getName(), toString(statement->getValueType()), toString(statement->getExpression())); + return format("{}({}|{})", statement->getName(), toString(statement->getValueType()), toString(statement->getExpression())); } string Logger::toString(shared_ptr statement) { @@ -165,7 +173,7 @@ string Logger::toString(shared_ptr statement) { string Logger::toString(shared_ptr statement) { string text = "RET"; - if (statement != nullptr) + if (statement->getExpression() != nullptr) text += format("({})", toString(statement->getExpression())); return text; } @@ -210,9 +218,105 @@ string Logger::toString(ValueType valueType) { } string Logger::toString(shared_ptr expression) { - return ""; + switch (expression->getKind()) { + case ExpressionKind::BINARY: + return toString(dynamic_pointer_cast(expression)); + case ExpressionKind::IF_ELSE: + return toString(dynamic_pointer_cast(expression)); + case ExpressionKind::VAR: + return toString(dynamic_pointer_cast(expression)); + case ExpressionKind::GROUPING: + return toString(dynamic_pointer_cast(expression)); + case ExpressionKind::LITERAL: + return toString(dynamic_pointer_cast(expression)); + case ExpressionKind::CALL: + return toString(dynamic_pointer_cast(expression)); + case ExpressionKind::BLOCK: + return toString(dynamic_pointer_cast(expression)); + } } +string Logger::toString(shared_ptr expression) { + switch (expression->getOperation()) { + case ExpressionBinaryOperation::EQUAL: + return "{= " + toString(expression->getLeft()) + " " + toString(expression->getRight()) + "}"; + case ExpressionBinaryOperation::NOT_EQUAL: + return "{!= " + toString(expression->getLeft()) + " " + toString(expression->getRight()) + "}"; + case ExpressionBinaryOperation::LESS: + return "{< " + toString(expression->getLeft()) + " " + toString(expression->getRight()) + "}"; + case ExpressionBinaryOperation::LESS_EQUAL: + return "{<= " + toString(expression->getLeft()) + " " + toString(expression->getRight()) + "}"; + case ExpressionBinaryOperation::GREATER: + return "{> " + toString(expression->getLeft()) + " " + toString(expression->getRight()) + "}"; + case ExpressionBinaryOperation::GREATER_EQUAL: + return "{<= " + toString(expression->getLeft()) + " " + toString(expression->getRight()) + "}"; + case ExpressionBinaryOperation::ADD: + return "{+ " + toString(expression->getLeft()) + " " + toString(expression->getRight()) + "}"; + case ExpressionBinaryOperation::SUB: + return "{- " + toString(expression->getLeft()) + " " + toString(expression->getRight()) + "}"; + case ExpressionBinaryOperation::MUL: + return "{* " + toString(expression->getLeft()) + " " + toString(expression->getRight()) + "}"; + case ExpressionBinaryOperation::DIV: + return "{/ " + toString(expression->getLeft()) + " " + toString(expression->getRight()) + "}"; + case ExpressionBinaryOperation::MOD: + return "{% " + toString(expression->getLeft()) + " " + toString(expression->getRight()) + "}"; + } +} + +string Logger::toString(shared_ptr expression) { + string text; + + text += format("IF({}):\n", toString(expression->getCondition())); + text += toString(expression->getThenBlock()); + if (expression->getElseBlock() != nullptr) { + text += "\nELSE:\n"; + text += toString(expression->getElseBlock()); + } + text += "\n;"; + + return text; +} + +string Logger::toString(shared_ptr expression) { + return format("VAR({})", expression->getName()); +} + +string Logger::toString(shared_ptr expression) { + return format("({})", toString(expression->getExpression())); +} + +string Logger::toString(shared_ptr expression) { + switch (expression->getValueType()) { + case ValueType::NONE: + return "NONE"; + case ValueType::BOOL: + return expression->getBoolValue() ? "true" : "false"; + case ValueType::SINT32: + return to_string(expression->getSint32Value()); + case ValueType::REAL32: + return to_string(expression->getReal32Value()); + } +} + +string Logger::toString(shared_ptr expression) { + string argsString; + for (int i = 0; i < expression->getArgumentExpressions().size(); i++) { + argsString += toString(expression->getArgumentExpressions().at(i)); + if (i < expression->getArgumentExpressions().size() - 1) + argsString += ", "; + } + return format("CALL({}|{})", expression->getName(), argsString); +} + +string Logger::toString(shared_ptr expression) { + string text; + text += toString(expression->getStatementBlock()); + if (expression->getResultStatementExpression() != nullptr) + text += toString(expression->getResultStatementExpression()); + return text; +} + + void Logger::print(vector> tokens) { for (int i=0; i statement); static string toString(shared_ptr expression); + static string toString(shared_ptr expression); + static string toString(shared_ptr expression); + static string toString(shared_ptr expression); + static string toString(shared_ptr expression); + static string toString(shared_ptr expression); + static string toString(shared_ptr expression); + static string toString(shared_ptr expression); static string toString(ValueType valueType); diff --git a/src/Parser/Expression/ExpressionBlock.cpp b/src/Parser/Expression/ExpressionBlock.cpp index e3e40c3..77f734c 100644 --- a/src/Parser/Expression/ExpressionBlock.cpp +++ b/src/Parser/Expression/ExpressionBlock.cpp @@ -11,7 +11,7 @@ Expression(ExpressionKind::BLOCK, ValueType::NONE) { valueType = resultStatementExpression->getExpression()->getValueType(); statements.pop_back(); } else { - resultStatementExpression = make_shared(ExpressionLiteral::NONE); + resultStatementExpression = make_shared(make_shared()); } statementBlock = make_shared(statements); } diff --git a/src/Parser/Expression/ExpressionLiteral.cpp b/src/Parser/Expression/ExpressionLiteral.cpp index 0db92f7..c69688d 100644 --- a/src/Parser/Expression/ExpressionLiteral.cpp +++ b/src/Parser/Expression/ExpressionLiteral.cpp @@ -1,7 +1,5 @@ #include "ExpressionLiteral.h" -shared_ptr ExpressionLiteral::NONE; - ExpressionLiteral::ExpressionLiteral(): Expression(ExpressionKind::LITERAL, ValueType::NONE) { } diff --git a/src/Parser/Expression/ExpressionLiteral.h b/src/Parser/Expression/ExpressionLiteral.h index 0fc1578..852f7e3 100644 --- a/src/Parser/Expression/ExpressionLiteral.h +++ b/src/Parser/Expression/ExpressionLiteral.h @@ -6,12 +6,10 @@ private: int32_t sint32Value; float real32Value; - ExpressionLiteral(); - + public: - static shared_ptr NONE; - ExpressionLiteral(shared_ptr token); + ExpressionLiteral(); bool getBoolValue(); int32_t getSint32Value(); float getReal32Value();