diff --git a/samples/test.brc b/samples/test.brc index 563c1bc..6077f04 100644 --- a/samples/test.brc +++ b/samples/test.brc @@ -28,10 +28,10 @@ i u32 <- 0, rep text[i] != 0: ret num1 + num2 ;*/ -/*rawAdd raw<"=r,r,r">: num1 sint32, num2 sint32 -> sint32 +rawAdd raw<"=r,r,r">: num1 sint32, num2 sint32 -> sint32 add $1, $2 mov $0, $1 -;*/ +; /*rawAdd raw: num1 sint32, num2 sint32 -> sint32 add $1, $2 @@ -48,11 +48,11 @@ i u32 <- 0, rep text[i] != 0: ;*/ -main fun: a sint32, b sint32 -> sint32 - //printChar() +main fun -> sint32 + a sint32 <- 4 + b sint32 <- 5 - res1 sint32 <- a - b - //res2 sint32 <- rawAdd(4, 5) + res sint32 <- rawAdd(4, 5) - ret res1 + ret res ; \ No newline at end of file diff --git a/src/Parser/Parsee/Parsee.cpp b/src/Parser/Parsee/Parsee.cpp index dc8c526..3ec80d9 100644 --- a/src/Parser/Parsee/Parsee.cpp +++ b/src/Parser/Parsee/Parsee.cpp @@ -1,7 +1,5 @@ #include "Parsee.h" -#include "Parser/Expression/Expression.h" - Parsee Parsee::tokenParsee(TokenKind tokenKind, bool isRequired, bool shouldReturn) { Parsee parsee; parsee.kind = ParseeKind::TOKEN; diff --git a/src/Parser/Parsee/Parsee.h b/src/Parser/Parsee/Parsee.h index 9b1db48..6dfdf0e 100644 --- a/src/Parser/Parsee/Parsee.h +++ b/src/Parser/Parsee/Parsee.h @@ -4,7 +4,6 @@ #include enum class TokenKind; -class Expression; enum class ParseeKind { TOKEN, diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp index 9aa2130..d55b31e 100644 --- a/src/Parser/Parser.cpp +++ b/src/Parser/Parser.cpp @@ -297,9 +297,8 @@ shared_ptr Parser::matchStatementFunction() { } shared_ptr Parser::matchStatementRawFunction() { - return nullptr; - /*bool hasError = false; - optional> parseeResults; + bool hasError = false; + ParseeResultsGroup resultsGroup; string name; string constraints; @@ -308,9 +307,8 @@ shared_ptr Parser::matchStatementRawFunction() { string rawSource; // identifier - parseeResults = parseeResultsForParseeGroup( + resultsGroup = parseeResultsGroupForParseeGroup( ParseeGroup( - true, { Parsee::tokenParsee(TokenKind::IDENTIFIER, true, true), Parsee::tokenParsee(TokenKind::RAW_FUNCTION, true, false) @@ -318,17 +316,23 @@ shared_ptr Parser::matchStatementRawFunction() { {} ) ); - if (parseeResults) { - name = (*parseeResults).at(0).getToken()->getLexme(); - } else { - hasError = true; + + switch (resultsGroup.getKind()) { + case ParseeResultsGroupKind::SUCCESS: + name = resultsGroup.getResults().at(0).getToken()->getLexme(); + break; + case ParseeResultsGroupKind::NO_MATCH: + return nullptr; + break; + case ParseeResultsGroupKind::FAILURE: + hasError = true; + break; } - // options + // constraints if (!hasError) { - parseeResults = parseeResultsForParseeGroup( + resultsGroup = parseeResultsGroupForParseeGroup( ParseeGroup( - false, { Parsee::tokenParsee(TokenKind::LESS, true, false), Parsee::tokenParsee(TokenKind::STRING, true, true), @@ -337,18 +341,27 @@ shared_ptr Parser::matchStatementRawFunction() { {} ) ); - if (parseeResults && !(*parseeResults).empty()) { - constraints = (*parseeResults).at(0).getToken()->getLexme(); - } else if (!parseeResults) { - hasError = true; + + switch (resultsGroup.getKind()) { + case ParseeResultsGroupKind::SUCCESS: + constraints = resultsGroup.getResults().at(0).getToken()->getLexme(); + // remove enclosing quotes + if (constraints.length() >= 2) + constraints = constraints.substr(1, constraints.length() - 2); + break; + case ParseeResultsGroupKind::NO_MATCH: + return nullptr; + break; + case ParseeResultsGroupKind::FAILURE: + hasError = true; + break; } } // arguments if (!hasError) { - parseeResults = parseeResultsForParseeGroup( + resultsGroup = parseeResultsGroupForParseeGroup( ParseeGroup( - false, { Parsee::tokenParsee(TokenKind::COLON, true, false), Parsee::tokenParsee(TokenKind::NEW_LINE, false, false), @@ -356,7 +369,6 @@ shared_ptr Parser::matchStatementRawFunction() { Parsee::valueTypeParsee(true) }, ParseeGroup( - false, { Parsee::tokenParsee(TokenKind::COMMA, true, false), Parsee::tokenParsee(TokenKind::NEW_LINE, false, false), @@ -367,23 +379,27 @@ shared_ptr Parser::matchStatementRawFunction() { ) ) ); - if (parseeResults && !(*parseeResults).empty()) { - for (int i=0; i<(*parseeResults).size(); i+=2) { - pair> arg; - arg.first = (*parseeResults).at(i).getToken()->getLexme(); - arg.second = (*parseeResults).at(i+1).getValueType(); - arguments.push_back(arg); - } - } else if (!parseeResults) { - hasError = true; + switch (resultsGroup.getKind()) { + case ParseeResultsGroupKind::SUCCESS: + for (int i=0; i> arg; + arg.first = resultsGroup.getResults().at(i).getToken()->getLexme(); + arg.second = resultsGroup.getResults().at(i+1).getValueType(); + arguments.push_back(arg); + } + break; + case ParseeResultsGroupKind::NO_MATCH: + break; + case ParseeResultsGroupKind::FAILURE: + hasError = true; + break; } } // return type if (!hasError) { - parseeResults = parseeResultsForParseeGroup( + resultsGroup = parseeResultsGroupForParseeGroup( ParseeGroup( - false, { Parsee::tokenParsee(TokenKind::RIGHT_ARROW, true, false), Parsee::tokenParsee(TokenKind::NEW_LINE, false, false), @@ -393,10 +409,15 @@ shared_ptr Parser::matchStatementRawFunction() { ) ); - if (parseeResults && !(*parseeResults).empty()) { - returnType = (*parseeResults).at(0).getValueType(); - } else if (!parseeResults) { - hasError = true; + switch (resultsGroup.getKind()) { + case ParseeResultsGroupKind::SUCCESS: + returnType = resultsGroup.getResults().at(0).getValueType(); + break; + case ParseeResultsGroupKind::NO_MATCH: + break; + case ParseeResultsGroupKind::FAILURE: + hasError = true; + break; } } @@ -421,7 +442,7 @@ shared_ptr Parser::matchStatementRawFunction() { return nullptr; } - return make_shared(name, constraints, arguments, returnType, rawSource);*/ + return make_shared(name, constraints, arguments, returnType, rawSource); } shared_ptr Parser::matchStatementBlock(vector terminalTokenKinds) { @@ -593,7 +614,6 @@ shared_ptr Parser::nextExpression() { if (expression != nullptr || errors.size() > errorsCount) return expression; - //markError({}, {}); return nullptr; }