From 7d45d398b43555fa1f7c53d4d0632f9e63ffb5f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Grodzi=C5=84ski?= Date: Wed, 2 Jul 2025 16:45:41 +0900 Subject: [PATCH] Basic statements logging --- src/Logger.cpp | 138 +++++++++++++++++++++++++++++++++++++++++- src/Logger.h | 28 +++++++++ src/Parser/Parser.cpp | 10 ++- src/main.cpp | 15 +++-- 4 files changed, 179 insertions(+), 12 deletions(-) diff --git a/src/Logger.cpp b/src/Logger.cpp index 0210d09..a5368b5 100644 --- a/src/Logger.cpp +++ b/src/Logger.cpp @@ -3,6 +3,17 @@ #include #include "Lexer/Token.h" +#include "Parser/Statement/Statement.h" +#include "Parser/Statement/StatementMetaExternFunction.h" +#include "Parser/Statement/StatementVariable.h" +#include "Parser/Statement/StatementFunction.h" +#include "Parser/Statement/StatementBlock.h" +#include "Parser/Statement/StatementAssignment.h" +#include "Parser/Statement/StatementReturn.h" +#include "Parser/Statement/StatementRepeat.h" +#include "Parser/Statement/StatementExpression.h" + +#include "Parser/Expression/Expression.h" string Logger::toString(shared_ptr token) { switch (token->getKind()) { @@ -83,11 +94,136 @@ string Logger::toString(shared_ptr token) { } } +string Logger::toString(shared_ptr statement) { + switch (statement->getKind()) { + case StatementKind::META_EXTERN_FUNCTION: + return toString(dynamic_pointer_cast(statement)); + case StatementKind::VARIABLE: + return toString(dynamic_pointer_cast(statement)); + case StatementKind::FUNCTION: + return toString(dynamic_pointer_cast(statement)); + case StatementKind::BLOCK: + return toString(dynamic_pointer_cast(statement)); + case StatementKind::ASSIGNMENT: + return toString(dynamic_pointer_cast(statement)); + case StatementKind::RETURN: + return toString(dynamic_pointer_cast(statement)); + case StatementKind::REPEAT: + return toString(dynamic_pointer_cast(statement)); + case StatementKind::EXPRESSION: + return toString(dynamic_pointer_cast(statement)); + } +} + +string Logger::toString(shared_ptr statement) { + string text; + + string argsString; + for (int i = 0; i < statement->getArguments().size(); i++) { + auto arg = statement->getArguments().at(i); + argsString += format("ARG({}, {})", arg.first, toString(arg.second)); + } + text += format("@EXTERN FUN(\"{}\"|{}|{})", statement->getName(), argsString, toString(statement->getReturnValueType())); + + + return text; +} + +string Logger::toString(shared_ptr statement) { + return format("{}({}|)", statement->getName(), toString(statement->getValueType()), toString(statement->getExpression())); +} + +string Logger::toString(shared_ptr statement) { + string text; + + string argsString; + for (int i = 0; i < statement->getArguments().size(); i++) { + auto arg = statement->getArguments().at(i); + argsString += format("ARG({}, {})", arg.first, toString(arg.second)); + } + text += format("FUN(\"{}\"|{}|{}):\n", statement->getName(), argsString, toString(statement->getReturnValueType())); + text += toString(statement->getStatementBlock()); + + return text; +} + +string Logger::toString(shared_ptr statement) { + string text; + + for (int i=0; igetStatements().size(); i++) { + text += toString(statement->getStatements().at(i)); + if (i < statement->getStatements().size() - 1) + text += "\n"; + } + + return text; +} + +string Logger::toString(shared_ptr statement) { + return format("{} <- {}", statement->getName(), toString(statement->getExpression())); +} + +string Logger::toString(shared_ptr statement) { + string text = "RET"; + if (statement != nullptr) + text += format("({})", toString(statement->getExpression())); + return text; +} + +string Logger::toString(shared_ptr statement) { + string text; + + string initStatement; + string preCondition; + string postCondition; + + if (statement->getInitStatement() != nullptr) + initStatement = toString(statement->getInitStatement()); + + if (statement->getPostConditionExpression() != nullptr) + preCondition = toString(statement->getPreConditionExpression()); + + if (statement->getPostConditionExpression() != nullptr) + postCondition = toString(statement->getPostConditionExpression()); + + text += format("REP({}|{}|{}):\n", initStatement, preCondition, postCondition); + text += toString(statement->getBodyBlockStatement()); + + return text; +} + +string Logger::toString(shared_ptr statement) { + return format("EXPR({})", toString(statement->getExpression())); +} + +string Logger::toString(ValueType valueType) { + switch (valueType) { + case ValueType::NONE: + return "NONE"; + case ValueType::BOOL: + return "BOOL"; + case ValueType::SINT32: + return "SINT32"; + case ValueType::REAL32: + return "REAL32"; + } +} + +string Logger::toString(shared_ptr expression) { + return ""; +} + void Logger::print(vector> tokens) { for (int i=0; i> statements) { + for (shared_ptr &statement : statements) { + cout << toString(statement) << endl << endl; + } } \ No newline at end of file diff --git a/src/Logger.h b/src/Logger.h index ff69e26..394f9b5 100644 --- a/src/Logger.h +++ b/src/Logger.h @@ -4,6 +4,19 @@ #include class Token; +class Statement; +class StatementMetaExternFunction; +class StatementVariable; +class StatementFunction; +class StatementBlock; +class StatementAssignment; +class StatementReturn; +class StatementRepeat; +class StatementExpression; + +class Expression; + +enum class ValueType; using namespace std; @@ -11,8 +24,23 @@ class Logger { private: static string toString(shared_ptr token); + static string toString(shared_ptr statement); + static string toString(shared_ptr statement); + static string toString(shared_ptr statement); + static string toString(shared_ptr statement); + static string toString(shared_ptr statement); + static string toString(shared_ptr statement); + static string toString(shared_ptr statement); + static string toString(shared_ptr statement); + static string toString(shared_ptr statement); + + static string toString(shared_ptr expression); + + static string toString(ValueType valueType); + public: static void print(vector> tokens); + static void print(vector> statements); }; #endif \ No newline at end of file diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp index 7a2ae0a..40c196a 100644 --- a/src/Parser/Parser.cpp +++ b/src/Parser/Parser.cpp @@ -339,9 +339,6 @@ shared_ptr Parser::matchStatementExpression() { else if (!expression->isValid()) return make_shared(tokens.at(currentIndex), expression->toString(0)); - // Consume new line - tryMatchingTokenKinds({TokenKind::NEW_LINE}, true, true); - return make_shared(expression); } @@ -578,6 +575,13 @@ shared_ptr Parser::matchExpressionBlock(vector terminalTo if (statement == nullptr || !statement->isValid()) return matchExpressionInvalid("Expected statement"); statements.push_back(statement); + + if (tryMatchingTokenKinds(terminalTokenKinds, false, false)) + break; + + // except new line + if (!tryMatchingTokenKinds({TokenKind::NEW_LINE}, true, true)) + return matchExpressionInvalid("Expected new line"); } return make_shared(statements); diff --git a/src/main.cpp b/src/main.cpp index 522727c..b90ce00 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -56,27 +56,26 @@ int main(int argc, char **argv) { Lexer lexer(source); vector> tokens = lexer.getTokens(); - if (isVerbose) + if (isVerbose) { Logger::print(tokens); + cout << endl; + } Parser parser(tokens); vector> statements = parser.getStatements(); if (isVerbose) { - for (shared_ptr &statement : statements) { - cout << statement->toString(0); - cout << endl; - } - cout << endl << endl; + Logger::print(statements); + cout << endl; } - ModuleBuilder moduleBuilder(moduleName, inputFilePath, statements); + /*ModuleBuilder moduleBuilder(moduleName, inputFilePath, statements); shared_ptr module = moduleBuilder.getModule(); if (isVerbose) { module->print(llvm::outs(), nullptr); } CodeGenerator codeGenerator(module); - codeGenerator.generateObjectFile(outputKind); + codeGenerator.generateObjectFile(outputKind);*/ return 0; } \ No newline at end of file