diff --git a/samples/test.brc b/samples/test.brc index 6077f04..21321d7 100644 --- a/samples/test.brc +++ b/samples/test.brc @@ -1,4 +1,4 @@ -//@extern putchar fun: character sint32 -> sint32 +@extern putchar fun: character sint32 -> sint32 // ./build/brb samples/test.brc -S -x86-asm-syntax=intel @@ -49,10 +49,12 @@ rawAdd raw<"=r,r,r">: num1 sint32, num2 sint32 -> sint32 ;*/ main fun -> sint32 - a sint32 <- 4 + /*a sint32 <- 4 b sint32 <- 5 - res sint32 <- rawAdd(4, 5) + res sint32 <- rawAdd(4, 5)*/ + putchar('@') + putchar('\n') - ret res + ret 0 ; \ No newline at end of file diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp index a5f3246..3eb154c 100644 --- a/src/Parser/Parser.cpp +++ b/src/Parser/Parser.cpp @@ -112,50 +112,91 @@ shared_ptr Parser::nextInBlockStatement() { } shared_ptr Parser::matchStatementMetaExternFunction() { - if (!tryMatchingTokenKinds({TokenKind::M_EXTERN, TokenKind::IDENTIFIER, TokenKind::FUNCTION}, true, false)) - return nullptr; + ParseeResultsGroup resultsGroup; - string name; + string identifier; vector>> arguments; shared_ptr returnType = ValueType::NONE; - currentIndex++; // skip meta - shared_ptr identifierToken = tokens.at(currentIndex++); - currentIndex++; // skip fun + // identifier + resultsGroup = parseeResultsGroupForParseeGroup( + ParseeGroup( + { + Parsee::tokenParsee(TokenKind::M_EXTERN, true, false), + Parsee::tokenParsee(TokenKind::IDENTIFIER, true, true), + Parsee::tokenParsee(TokenKind::FUNCTION, true, false) + }, + {} + ) + ); + + switch (resultsGroup.getKind()) { + case ParseeResultsGroupKind::SUCCESS: + identifier = resultsGroup.getResults().at(0).getToken()->getLexme(); + break; + case ParseeResultsGroupKind::NO_MATCH: + case ParseeResultsGroupKind::FAILURE: + return nullptr; + } // arguments - if (tryMatchingTokenKinds({TokenKind::COLON}, true, true)) { - do { - tryMatchingTokenKinds({TokenKind::NEW_LINE}, true, true); // skip new line - if (!tryMatchingTokenKinds({TokenKind::IDENTIFIER, TokenKind::TYPE}, true, false)) { - markError({}, "Expected function argument"); - return nullptr; + resultsGroup = parseeResultsGroupForParseeGroup( + ParseeGroup( + { + Parsee::tokenParsee(TokenKind::COLON, true, false), + Parsee::tokenParsee(TokenKind::NEW_LINE, false, false), + Parsee::tokenParsee(TokenKind::IDENTIFIER, true, true), + Parsee::valueTypeParsee(true) + }, + ParseeGroup( + { + Parsee::tokenParsee(TokenKind::COMMA, true, false), + Parsee::tokenParsee(TokenKind::NEW_LINE, false, false), + Parsee::tokenParsee(TokenKind::IDENTIFIER, true, true), + Parsee::valueTypeParsee(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); } - shared_ptr identifierToken = tokens.at(currentIndex++); - //shared_ptr argumentTypeToken = tokens.at(currentIndex++); - shared_ptr argumentType = matchValueType(); - if (argumentType == nullptr) { - markError(TokenKind::TYPE, {}); - return nullptr; - } - - arguments.push_back(pair>(identifierToken->getLexme(), argumentType)); - } while (tryMatchingTokenKinds({TokenKind::COMMA}, true, true)); - } - - // Return type - if (tryMatchingTokenKinds({TokenKind::RIGHT_ARROW}, true, true)) { - tryMatchingTokenKinds({TokenKind::NEW_LINE}, true, true); // skip new line - - //shared_ptr returnTypeToken = tokens.at(currentIndex); - returnType = matchValueType(); - if (returnType == nullptr) { - markError(TokenKind::TYPE, {}); + break; + case ParseeResultsGroupKind::NO_MATCH: + break; + case ParseeResultsGroupKind::FAILURE: return nullptr; - } } - return make_shared(identifierToken->getLexme(), arguments, returnType); + // return type + resultsGroup = parseeResultsGroupForParseeGroup( + ParseeGroup( + { + Parsee::tokenParsee(TokenKind::RIGHT_ARROW, true, false), + Parsee::tokenParsee(TokenKind::NEW_LINE, false, false), + Parsee::valueTypeParsee(true) + }, + {} + ) + ); + + switch (resultsGroup.getKind()) { + case ParseeResultsGroupKind::SUCCESS: + returnType = resultsGroup.getResults().at(0).getValueType(); + break; + case ParseeResultsGroupKind::NO_MATCH: + break; + case ParseeResultsGroupKind::FAILURE: + return nullptr; + } + + return make_shared(identifier, arguments, returnType); } shared_ptr Parser::matchStatementVariable() { @@ -464,6 +505,7 @@ shared_ptr Parser::matchStatementBlock(vector terminalToke } shared_ptr Parser::matchStatementAssignment() { + int startIndex = currentIndex; ParseeResultsGroup resultsGroup; string identifier; @@ -523,6 +565,8 @@ shared_ptr Parser::matchStatementAssignment() { expression = resultsGroup.getResults().at(0).getExpression(); break; case ParseeResultsGroupKind::NO_MATCH: + currentIndex = startIndex; + return nullptr; case ParseeResultsGroupKind::FAILURE: return nullptr; }