From 4665a1f5f57baa05212fb4fd3a7f2cca370c371c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Grodzi=C5=84ski?= Date: Tue, 3 Jun 2025 12:04:43 +0900 Subject: [PATCH] wip --- src/ModuleBuilder.cpp | 4 +-- src/ModuleBuilder.h | 4 +-- src/Parser.cpp | 61 +++++++++++++++++--------------- src/Parser.h | 15 ++++---- src/Statement.cpp | 82 +++++++++++++++++++++++++++++++++++-------- src/Statement.h | 77 ++++++++++++++++++++++++++++++++++------ src/main.cpp | 15 ++++---- 7 files changed, 184 insertions(+), 74 deletions(-) diff --git a/src/ModuleBuilder.cpp b/src/ModuleBuilder.cpp index 56ea3ab..4a9f9de 100644 --- a/src/ModuleBuilder.cpp +++ b/src/ModuleBuilder.cpp @@ -3,7 +3,7 @@ #include "llvm/IR/Constants.h" #include "llvm/Support/raw_ostream.h" -ModuleBuilder::ModuleBuilder(vector> statements): statements(statements) { +/*ModuleBuilder::ModuleBuilder(vector> statements): statements(statements) { context = make_shared(); module = make_shared("dummy", *context); builder = make_shared>(*context); @@ -88,4 +88,4 @@ shared_ptr ModuleBuilder::getModule() { buildCodeForStatement(statement); } return module; -} \ No newline at end of file +}*/ \ No newline at end of file diff --git a/src/ModuleBuilder.h b/src/ModuleBuilder.h index fb11686..75e6b30 100644 --- a/src/ModuleBuilder.h +++ b/src/ModuleBuilder.h @@ -10,7 +10,7 @@ using namespace std; class ModuleBuilder { -private: +/*private: shared_ptr context; shared_ptr module; shared_ptr> builder; @@ -29,7 +29,7 @@ private: public: ModuleBuilder(vector> statements); - shared_ptr getModule(); + shared_ptr getModule();*/ }; #endif \ No newline at end of file diff --git a/src/Parser.cpp b/src/Parser.cpp index aba3907..9a1670c 100644 --- a/src/Parser.cpp +++ b/src/Parser.cpp @@ -1,17 +1,19 @@ #include "Parser.h" -Parser::Parser(vector tokens): tokens(tokens) { +Parser::Parser(vector> tokens): tokens(tokens) { } vector> Parser::getStatements() { vector> statements; - while (tokens.at(currentIndex).getKind() != Token::Kind::END) { + while (tokens.at(currentIndex)->getKind() != Token::Kind::END) { shared_ptr statement = nextStatement(); // Abort parsing if we got an error if (!statement->isValid()) { - cerr << "Unexpected token '" << statement->getToken()->getLexme() << "' at " << statement->getToken()->getLine() << ":" << statement->getToken()->getColumn() << endl; - return vector>(); + //cerr << "Unexpected token '" << statement->getToken()->getLexme() << "' at " << statement->getToken()->getLine() << ":" << statement->getToken()->getColumn() << endl; + cerr << statement->toString(); + //return vector>(); + exit(1); } statements.push_back(statement); } @@ -23,7 +25,7 @@ vector> Parser::getStatements() { // Statement // shared_ptr Parser::nextStatement() { - { + /*{ shared_ptr statement = matchFunctionDeclarationStatement(); if (statement->isValid()) return statement; @@ -39,12 +41,12 @@ shared_ptr Parser::nextStatement() { shared_ptr statement = matchExpressionStatement(); if (statement->isValid()) return statement; - } + }*/ return matchInvalidStatement(); } -shared_ptr Parser::matchFunctionDeclarationStatement() { +/*shared_ptr Parser::matchFunctionDeclarationStatement() { if (!matchesTokenKinds({Token::Kind::IDENTIFIER, Token::Kind::COLON, Token::Kind::FUNCTION})) return make_shared(Statement::Kind::INVALID, make_shared(tokens.at(currentIndex)), nullptr, nullptr, vector>(), ""); @@ -53,7 +55,7 @@ shared_ptr Parser::matchFunctionDeclarationStatement() { currentIndex++; // skip colon currentIndex++; // skip fun - while (tokens.at(currentIndex).getKind() != Token::Kind::NEW_LINE) { + while (tokens.at(currentIndex)->getKind() != Token::Kind::NEW_LINE) { currentIndex++; } currentIndex++; // new line @@ -62,12 +64,12 @@ shared_ptr Parser::matchFunctionDeclarationStatement() { return blockStatement; return make_shared(Statement::Kind::FUNCTION_DECLARATION, nullptr, nullptr, blockStatement, vector>(), identifierToken.getLexme()); -} +}*/ -shared_ptr Parser::matchBlockStatement() { +/*shared_ptr Parser::matchBlockStatement() { vector> statements; - while (tokens.at(currentIndex).getKind() != Token::Kind::SEMICOLON) { + while (tokens.at(currentIndex)->getKind() != Token::Kind::SEMICOLON) { shared_ptr statement = nextStatement(); if (!statement->isValid()) return statement; @@ -75,17 +77,17 @@ shared_ptr Parser::matchBlockStatement() { } currentIndex++; // skip ; - if (!tokens.at(currentIndex).isOfKind({Token::Kind::NEW_LINE, Token::Kind::END})) + if (!tokens.at(currentIndex)->isOfKind({Token::Kind::NEW_LINE, Token::Kind::END})) return make_shared(Statement::Kind::INVALID, make_shared(tokens.at(currentIndex)), nullptr, nullptr, vector>(), ""); - if (tokens.at(currentIndex).getKind() == Token::Kind::NEW_LINE) + if (tokens.at(currentIndex)->getKind() == Token::Kind::NEW_LINE) currentIndex++; return make_shared(Statement::Kind::BLOCK, nullptr, nullptr, nullptr, statements, ""); -} +}*/ -shared_ptr Parser::matchReturnStatement() { - if (tokens.at(currentIndex).getKind() != Token::Kind::RETURN) +/*shared_ptr Parser::matchReturnStatement() { + if (tokens.at(currentIndex)->getKind() != Token::Kind::RETURN) return make_shared(Statement::Kind::INVALID, make_shared(tokens.at(currentIndex)), nullptr, nullptr, vector>(), ""); currentIndex++; @@ -94,37 +96,38 @@ shared_ptr Parser::matchReturnStatement() { if (!expression->isValid()) expression = nullptr; - if (tokens.at(currentIndex).getKind() != Token::Kind::NEW_LINE) + if (tokens.at(currentIndex)->getKind() != Token::Kind::NEW_LINE) return make_shared(Statement::Kind::INVALID, make_shared(tokens.at(currentIndex)), nullptr, nullptr, vector>(), ""); currentIndex++; // new line return make_shared(Statement::Kind::RETURN, nullptr, expression, nullptr, vector>(), ""); -} +}*/ -shared_ptr Parser::matchInvalidStatement() { - return make_shared(Statement::Kind::INVALID, make_shared(tokens.at(currentIndex)), nullptr, nullptr, vector>(), ""); +shared_ptr Parser::matchInvalidStatement() { + //return make_shared(Statement::Kind::INVALID, make_shared(tokens.at(currentIndex)), nullptr, nullptr, vector>(), ""); + return make_shared(); } // // Expression // -shared_ptr Parser::matchExpressionStatement() { +/*shared_ptr Parser::matchExpressionStatement() { shared_ptr expression = term(); - if (expression->isValid() && tokens.at(currentIndex).isOfKind({Token::Kind::NEW_LINE, Token::Kind::END})) { + if (expression->isValid() && tokens.at(currentIndex)->isOfKind({Token::Kind::NEW_LINE, Token::Kind::END})) { currentIndex++; return make_shared(Statement::Kind::EXPRESSION, nullptr, expression, nullptr, vector>(), ""); } else { return make_shared(Statement::Kind::INVALID, make_shared(tokens.at(currentIndex)), expression, nullptr, vector>(), ""); } -} +}*/ -shared_ptr Parser::term() { +/*shared_ptr Parser::term() { shared_ptr expression = factor(); if (!expression->isValid()) return expression; - while (tokens.at(currentIndex).isOfKind({Token::Kind::PLUS, Token::Kind::MINUS})) { + while (tokens.at(currentIndex)->isOfKind({Token::Kind::PLUS, Token::Kind::MINUS})) { expression = matchBinary(expression); } @@ -136,7 +139,7 @@ shared_ptr Parser::factor() { if (!expression->isValid()) return expression; - while (tokens.at(currentIndex).isOfKind({Token::Kind::STAR, Token::Kind::SLASH, Token::Kind::PERCENT})) { + while (tokens.at(currentIndex)->isOfKind({Token::Kind::STAR, Token::Kind::SLASH, Token::Kind::PERCENT})) { expression = matchBinary(expression); } @@ -177,7 +180,7 @@ shared_ptr Parser::matchGrouping() { // has grouped expression failed? if (!expression->isValid()) return expression; - if (tokens.at(currentIndex).getKind() == Token::Kind::RIGHT_PAREN) { + if (tokens.at(currentIndex)->getKind() == Token::Kind::RIGHT_PAREN) { currentIndex++; return make_shared(Expression::Kind::GROUPING, token, expression, nullptr); } @@ -205,8 +208,8 @@ bool Parser::matchesTokenKinds(vector kinds) { return false; for (int i=0; igetKind()) return false; } return true; -} +}*/ diff --git a/src/Parser.h b/src/Parser.h index 4281b63..f271f6e 100644 --- a/src/Parser.h +++ b/src/Parser.h @@ -11,17 +11,17 @@ using namespace std; class Parser { private: - vector tokens; + vector> tokens; int currentIndex = 0; shared_ptr nextStatement(); - shared_ptr matchFunctionDeclarationStatement(); - shared_ptr matchBlockStatement(); - shared_ptr matchReturnStatement(); - shared_ptr matchInvalidStatement(); + //shared_ptr matchFunctionDeclarationStatement(); + //shared_ptr matchBlockStatement(); + //shared_ptr matchReturnStatement(); + shared_ptr matchInvalidStatement(); - shared_ptr matchExpressionStatement(); + /*shared_ptr matchExpressionStatement(); shared_ptr term(); // +, - shared_ptr factor(); // *, /, % shared_ptr primary(); // integer, () @@ -31,9 +31,10 @@ private: shared_ptr matchBinary(shared_ptr left); bool matchesTokenKinds(vector kinds); + */ public: - Parser(vector tokens); + Parser(vector> tokens); vector> getStatements(); }; diff --git a/src/Statement.cpp b/src/Statement.cpp index 38a6519..8cb9ab4 100644 --- a/src/Statement.cpp +++ b/src/Statement.cpp @@ -1,39 +1,41 @@ #include "Statement.h" -Statement::Statement(Kind kind, shared_ptr token, shared_ptr expression, shared_ptr blockStatement, vector> statements, string name): +/*Statement::Statement(Kind kind, shared_ptr token, shared_ptr expression, shared_ptr blockStatement, vector> statements, string name): kind(kind), token(token), expression(expression), blockStatement(blockStatement), statements(statements), name(name) { +}*/ +Statement::Statement(Kind kind): kind(kind) { } Statement::Kind Statement::getKind() { return kind; } -shared_ptr Statement::getToken() { +/*shared_ptr Statement::getToken() { return token; -} +}*/ -shared_ptr Statement::getExpression() { +/*shared_ptr Statement::getExpression() { return expression; -} +}*/ -shared_ptr Statement::getBlockStatement() { +/*shared_ptr Statement::getBlockStatement() { return blockStatement; -} +}*/ -vector> Statement::getStatements() { +/*vector> Statement::getStatements() { return statements; -} +}*/ -string Statement::getName() { +/*string Statement::getName() { return name; -} +}*/ bool Statement::isValid() { return kind != Statement::Kind::INVALID; } string Statement::toString() { - switch (kind) { + /*switch (kind) { case EXPRESSION: return expression->toString(); case BLOCK: { @@ -56,5 +58,57 @@ string Statement::toString() { } case INVALID: return "INVALID"; - } -} \ No newline at end of file + }*/ + return "abc"; +} + +// +// StatementFunctionDeclaration +StatementFunctionDeclaration::StatementFunctionDeclaration(string name, shared_ptr statementBlock): + Statement(Statement::Kind::FUNCTION_DECLARATION), name(name), statementBlock(statementBlock) { +} + +string StatementFunctionDeclaration::getName() { + return name; +} + +shared_ptr StatementFunctionDeclaration::getStatementBlock() { + return statementBlock; +} + +// +// StatementBlock +StatementBlock::StatementBlock(vector> statements): + Statement(Statement::Kind::BLOCK), statements(statements) { +} + +vector> StatementBlock::getStatements() { + return statements; +} + +// +// StatementReturn +StatementReturn::StatementReturn(shared_ptr expression): + Statement(Statement::Kind::RETURN), expression(expression) { + +} + +shared_ptr StatementReturn::getExpression() { + return expression; +} + +// +// StatementExpression +StatementExpression::StatementExpression(shared_ptr expression): + Statement(Statement::Kind::EXPRESSION), expression(expression) { +} + +shared_ptr StatementExpression::getExpression() { + return expression; +} + +// +// StatementInvalid +StatementInvalid::StatementInvalid(): + Statement(Statement::Kind::INVALID) { +} diff --git a/src/Statement.h b/src/Statement.h index fb13598..eb24d73 100644 --- a/src/Statement.h +++ b/src/Statement.h @@ -8,6 +8,12 @@ using namespace std; +class Statement; +class StatementBlock; +class StatementReturn; +class StatementExpression; +class StatementInvalid; + class Statement { public: enum Kind { @@ -20,22 +26,71 @@ public: private: Kind kind; - shared_ptr token; - shared_ptr expression; - shared_ptr blockStatement; - vector> statements; - string name; + //shared_ptr token; + //shared_ptr expression; + //shared_ptr blockStatement; + //vector> statements; + //string name; public: - Statement(Kind kind, shared_ptr token, shared_ptr expression, shared_ptr blockStatement, vector> statements, string name); + Statement(Kind kind); + //Statement(Kind kind, shared_ptr token, shared_ptr expression, shared_ptr blockStatement, vector> statements, string name); Kind getKind(); - shared_ptr getToken(); - shared_ptr getExpression(); - shared_ptr getBlockStatement(); - vector> getStatements(); - string getName(); + //shared_ptr getToken(); + //shared_ptr getExpression(); + //shared_ptr getBlockStatement(); + //vector> getStatements(); + //string getName(); bool isValid(); string toString(); }; +class StatementFunctionDeclaration: public Statement { +private: + string name; + shared_ptr statementBlock; + +public: + StatementFunctionDeclaration(string name, shared_ptr statementBlock); + string getName(); + shared_ptr getStatementBlock(); +}; + +class StatementBlock: public Statement { +private: + vector> statements; + +public: + StatementBlock(vector> statements); + vector> getStatements(); +}; + +class StatementReturn: public Statement { +private: + shared_ptr expression; + +public: + StatementReturn(shared_ptr expression); + shared_ptr getExpression(); +}; + +class StatementExpression: public Statement { +private: + shared_ptr expression; + +public: + StatementExpression(shared_ptr expression); + shared_ptr getExpression(); +}; + +class StatementInvalid: public Statement { +//private: +// string message; + +public: + StatementInvalid(); + //StatementInvalid(string message); + //string getMessage(); +}; + #endif \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 2b5aeef..371bfa5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -43,15 +43,12 @@ int main(int argc, char **argv) { } std::cout << std::endl; - //Parser parser(tokens); - //vector> statements = parser.getStatements(); - //if (statements.empty()) { - // exit(1); - //} - //for (shared_ptr &statement : statements) { - // cout << statement->toString(); - // cout << endl; - //} + Parser parser(tokens); + vector> statements = parser.getStatements(); + for (shared_ptr &statement : statements) { + cout << statement->toString(); + cout << endl; + } //ModuleBuilder moduleBuilder(statements); //shared_ptr module = moduleBuilder.getModule();