diff --git a/src/Compiler/ModuleBuilder.cpp b/src/Compiler/ModuleBuilder.cpp index d754425..35f883c 100644 --- a/src/Compiler/ModuleBuilder.cpp +++ b/src/Compiler/ModuleBuilder.cpp @@ -1,19 +1,18 @@ #include "ModuleBuilder.h" -#include "Parser/Expression/Expression.h" -#include "Parser/Expression/ExpressionLiteral.h" -#include "Parser/Expression/ExpressionIfElse.h" #include "Parser/Expression/ExpressionGrouping.h" -#include "Parser/Expression/ExpressionBinary.h" +#include "Parser/Expression/ExpressionLiteral.h" #include "Parser/Expression/ExpressionVariable.h" #include "Parser/Expression/ExpressionCall.h" +#include "Parser/Expression/ExpressionIfElse.h" +#include "Parser/Expression/ExpressionBinary.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/StatementExpression.h" #include "Parser/Statement/StatementMetaExternFunction.h" +#include "Parser/Statement/StatementBlock.h" ModuleBuilder::ModuleBuilder(string moduleName, string sourceFileName, vector> statements): moduleName(moduleName), sourceFileName(sourceFileName), statements(statements) { diff --git a/src/Compiler/ModuleBuilder.h b/src/Compiler/ModuleBuilder.h index c26868b..b3cafba 100644 --- a/src/Compiler/ModuleBuilder.h +++ b/src/Compiler/ModuleBuilder.h @@ -13,21 +13,21 @@ #include "Types.h" class Expression; -class ExpressionLiteral; -class ExpressionIfElse; class ExpressionGrouping; -class ExpressionBinary; -enum class ExpressionBinaryOperation; +class ExpressionLiteral; class ExpressionVariable; class ExpressionCall; +class ExpressionIfElse; +class ExpressionBinary; +enum class ExpressionBinaryOperation; class Statement; -class StatementBlock; -class StatementReturn; class StatementFunction; class StatementVariable; -class StatementMetaExternFunction; +class StatementReturn; class StatementExpression; +class StatementMetaExternFunction; +class StatementBlock; using namespace std; diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp index b2e02f2..6af6ba7 100644 --- a/src/Parser/Parser.cpp +++ b/src/Parser/Parser.cpp @@ -1,21 +1,20 @@ #include "Parser.h" -#include "Parser/Expression/Expression.h" -#include "Parser/Expression/ExpressionLiteral.h" #include "Parser/Expression/ExpressionGrouping.h" -#include "Parser/Expression/ExpressionIfElse.h" -#include "Parser/Expression/ExpressionBlock.h" -#include "Parser/Expression/ExpressionBinary.h" +#include "Parser/Expression/ExpressionLiteral.h" #include "Parser/Expression/ExpressionVariable.h" #include "Parser/Expression/ExpressionCall.h" +#include "Parser/Expression/ExpressionIfElse.h" +#include "Parser/Expression/ExpressionBinary.h" +#include "Parser/Expression/ExpressionBlock.h" #include "Parser/Expression/ExpressionInvalid.h" -#include "Parser/Statement/StatementExpression.h" -#include "Parser/Statement/StatementBlock.h" -#include "Parser/Statement/StatementReturn.h" #include "Parser/Statement/StatementFunction.h" #include "Parser/Statement/StatementVariable.h" +#include "Parser/Statement/StatementReturn.h" +#include "Parser/Statement/StatementExpression.h" #include "Parser/Statement/StatementMetaExternFunction.h" +#include "Parser/Statement/StatementBlock.h" #include "Parser/Statement/StatementInvalid.h" Parser::Parser(vector> tokens): tokens(tokens) { @@ -43,7 +42,7 @@ vector> Parser::getStatements() { shared_ptr Parser::nextStatement() { shared_ptr statement; - statement = matchStatementFunctionDeclaration(); + statement = matchStatementFunction(); if (statement != nullptr) return statement; @@ -66,7 +65,7 @@ shared_ptr Parser::nextStatement() { return matchStatementInvalid("Unexpected token"); } -shared_ptr Parser::matchStatementFunctionDeclaration() { +shared_ptr Parser::matchStatementFunction() { if (!tryMatchingTokenKinds({TokenKind::IDENTIFIER, TokenKind::FUNCTION}, true, false)) return nullptr; @@ -159,26 +158,6 @@ shared_ptr Parser::matchStatementVariable() { return make_shared(identifierToken->getLexme(), valueType, expression); } -shared_ptr Parser::matchStatementBlock(vector terminalTokenKinds, bool shouldConsumeTerminal) { - vector> statements; - - bool hasNewLineTerminal = find(terminalTokenKinds.begin(), terminalTokenKinds.end(), TokenKind::NEW_LINE) != terminalTokenKinds.end(); - while (!tryMatchingTokenKinds(terminalTokenKinds, false, shouldConsumeTerminal)) { - shared_ptr statement = nextStatement(); - if (statement == nullptr) - return matchStatementInvalid(); - else if (!statement->isValid()) - return statement; - else - statements.push_back(statement); - - if (hasNewLineTerminal && tokens.at(currentIndex-1)->getKind() == TokenKind::NEW_LINE) - currentIndex--; - } - - return make_shared(statements); -} - shared_ptr Parser::matchStatementReturn() { if (!tryMatchingTokenKinds({TokenKind::RETURN}, true, true)) return nullptr; @@ -259,6 +238,26 @@ shared_ptr Parser::matchStatementMetaExternFunction() { return make_shared(identifierToken->getLexme(), arguments, returnType); } +shared_ptr Parser::matchStatementBlock(vector terminalTokenKinds, bool shouldConsumeTerminal) { + vector> statements; + + bool hasNewLineTerminal = find(terminalTokenKinds.begin(), terminalTokenKinds.end(), TokenKind::NEW_LINE) != terminalTokenKinds.end(); + while (!tryMatchingTokenKinds(terminalTokenKinds, false, shouldConsumeTerminal)) { + shared_ptr statement = nextStatement(); + if (statement == nullptr) + return matchStatementInvalid(); + else if (!statement->isValid()) + return statement; + else + statements.push_back(statement); + + if (hasNewLineTerminal && tokens.at(currentIndex-1)->getKind() == TokenKind::NEW_LINE) + currentIndex--; + } + + return make_shared(statements); +} + shared_ptr Parser::matchStatementInvalid(string message) { return make_shared(tokens.at(currentIndex), message); } @@ -277,7 +276,7 @@ shared_ptr Parser::nextExpression() { if (expression != nullptr) return expression; - expression = matchExpressionVar(); + expression = matchExpressionVariable(); if (expression != nullptr) return expression; @@ -331,30 +330,21 @@ shared_ptr Parser::matchFactor() { shared_ptr Parser::matchPrimary() { shared_ptr expression; - expression = matchExpressionLiteral(); - if (expression != nullptr) - return expression; - - expression = matchExpressionCall(); - if (expression != nullptr) - return expression; - - expression = matchExpressionVar(); - if (expression != nullptr) - return expression; - expression = matchExpressionGrouping(); if (expression != nullptr) return expression; - return nullptr; -} + expression = matchExpressionLiteral(); + if (expression != nullptr) + return expression; -shared_ptr Parser::matchExpressionLiteral() { - shared_ptr token = tokens.at(currentIndex); - - if (tryMatchingTokenKinds(Token::tokensLiteral, false, true)) - return make_shared(token); + expression = matchExpressionVariable(); + if (expression != nullptr) + return expression; + + expression = matchExpressionCall(); + if (expression != nullptr) + return expression; return nullptr; } @@ -378,31 +368,49 @@ shared_ptr Parser::matchExpressionGrouping() { return nullptr; } -shared_ptr Parser::matchExpressionBinary(shared_ptr left) { +shared_ptr Parser::matchExpressionLiteral() { shared_ptr token = tokens.at(currentIndex); - shared_ptr right; - // What level of binary expression are we having? - if (tryMatchingTokenKinds(Token::tokensEquality, false, true)) { - right = matchComparison(); - } else if (tryMatchingTokenKinds(Token::tokensComparison, false, true)) { - right = matchTerm(); - } else if (tryMatchingTokenKinds(Token::tokensTerm, false, true)) { - right = matchFactor(); - } else if (tryMatchingTokenKinds(Token::tokensFactor, false, true)) { - right = matchPrimary(); - } - if (right == nullptr) { - return matchExpressionInvalid(); - } else if (!right->isValid()) { - return right; - } else { - return make_shared(token, left, right); - } + if (tryMatchingTokenKinds(Token::tokensLiteral, false, true)) + return make_shared(token); return nullptr; } +shared_ptr Parser::matchExpressionVariable() { + shared_ptr token = tokens.at(currentIndex); + + if (tryMatchingTokenKinds({TokenKind::IDENTIFIER}, true, true)) + return make_shared(token->getLexme()); + + return nullptr; +} + +shared_ptr Parser::matchExpressionCall() { + if (!tryMatchingTokenKinds({TokenKind::IDENTIFIER, TokenKind::LEFT_PAREN}, true, false)) + return nullptr; + + shared_ptr identifierToken = tokens.at(currentIndex); + currentIndex++; // identifier + currentIndex++; // left parenthesis + + vector> argumentExpressions; + do { + tryMatchingTokenKinds({TokenKind::NEW_LINE}, true, true); // optional new line + + shared_ptr argumentExpression = nextExpression(); + if (argumentExpression == nullptr || !argumentExpression->isValid()) + return argumentExpression; + argumentExpressions.push_back(argumentExpression); + } while (tryMatchingTokenKinds({TokenKind::COMMA}, true, true)); + + tryMatchingTokenKinds({TokenKind::NEW_LINE}, true, true); // optional new line + if (!tryMatchingTokenKinds({TokenKind::RIGHT_PAREN}, true, true)) + return matchExpressionInvalid(); + + return make_shared(identifierToken->getLexme(), argumentExpressions); +} + shared_ptr Parser::matchExpressionIfElse() { // Try maching '?' shared_ptr token = tokens.at(currentIndex); @@ -448,38 +456,29 @@ shared_ptr Parser::matchExpressionIfElse() { return make_shared(condition, dynamic_pointer_cast(thenBlock), dynamic_pointer_cast(elseBlock)); } -shared_ptr Parser::matchExpressionVar() { +shared_ptr Parser::matchExpressionBinary(shared_ptr left) { shared_ptr token = tokens.at(currentIndex); + shared_ptr right; + // What level of binary expression are we having? + if (tryMatchingTokenKinds(Token::tokensEquality, false, true)) { + right = matchComparison(); + } else if (tryMatchingTokenKinds(Token::tokensComparison, false, true)) { + right = matchTerm(); + } else if (tryMatchingTokenKinds(Token::tokensTerm, false, true)) { + right = matchFactor(); + } else if (tryMatchingTokenKinds(Token::tokensFactor, false, true)) { + right = matchPrimary(); + } - if (tryMatchingTokenKinds({TokenKind::IDENTIFIER}, true, true)) - return make_shared(token->getLexme()); - - return nullptr; -} - -shared_ptr Parser::matchExpressionCall() { - if (!tryMatchingTokenKinds({TokenKind::IDENTIFIER, TokenKind::LEFT_PAREN}, true, false)) - return nullptr; - - shared_ptr identifierToken = tokens.at(currentIndex); - currentIndex++; // identifier - currentIndex++; // left parenthesis - - vector> argumentExpressions; - do { - tryMatchingTokenKinds({TokenKind::NEW_LINE}, true, true); // optional new line - - shared_ptr argumentExpression = nextExpression(); - if (argumentExpression == nullptr || !argumentExpression->isValid()) - return argumentExpression; - argumentExpressions.push_back(argumentExpression); - } while (tryMatchingTokenKinds({TokenKind::COMMA}, true, true)); - - tryMatchingTokenKinds({TokenKind::NEW_LINE}, true, true); // optional new line - if (!tryMatchingTokenKinds({TokenKind::RIGHT_PAREN}, true, true)) + if (right == nullptr) { return matchExpressionInvalid(); + } else if (!right->isValid()) { + return right; + } else { + return make_shared(token, left, right); + } - return make_shared(identifierToken->getLexme(), argumentExpressions); + return nullptr; } shared_ptr Parser::matchExpressionBlock(vector terminalTokenKinds, bool shouldConsumeTerminal) { diff --git a/src/Parser/Parser.h b/src/Parser/Parser.h index cb34da2..9243914 100644 --- a/src/Parser/Parser.h +++ b/src/Parser/Parser.h @@ -19,12 +19,12 @@ private: int currentIndex = 0; shared_ptr nextStatement(); - shared_ptr matchStatementFunctionDeclaration(); + shared_ptr matchStatementFunction(); shared_ptr matchStatementVariable(); - shared_ptr matchStatementBlock(vector terminalTokenKinds, bool shouldConsumeTerminal); shared_ptr matchStatementReturn(); shared_ptr matchStatementExpression(); shared_ptr matchStatementMetaExternFunction(); + shared_ptr matchStatementBlock(vector terminalTokenKinds, bool shouldConsumeTerminal); shared_ptr matchStatementInvalid(string message = ""); shared_ptr nextExpression(); @@ -34,12 +34,12 @@ private: shared_ptr matchFactor(); // *, /, % shared_ptr matchPrimary(); // integer, () - shared_ptr matchExpressionLiteral(); shared_ptr matchExpressionGrouping(); - shared_ptr matchExpressionBinary(shared_ptr left); - shared_ptr matchExpressionIfElse(); - shared_ptr matchExpressionVar(); + shared_ptr matchExpressionLiteral(); + shared_ptr matchExpressionVariable(); shared_ptr matchExpressionCall(); + shared_ptr matchExpressionIfElse(); + shared_ptr matchExpressionBinary(shared_ptr left); shared_ptr matchExpressionBlock(vector terminalTokenKinds, bool shouldConsumeTerminal); shared_ptr matchExpressionInvalid();