diff --git a/src/Parser/Parsee/Parsee.cpp b/src/Parser/Parsee/Parsee.cpp index 945494e..227b23e 100644 --- a/src/Parser/Parsee/Parsee.cpp +++ b/src/Parser/Parsee/Parsee.cpp @@ -10,9 +10,9 @@ Parsee Parsee::tokenParsee(TokenKind tokenKind, bool isRequired, bool shouldRetu return parsee; } -Parsee Parsee::typeParsee() { - Parsee parsee; - parsee.kind = ParseeKind::TYPE; +Parsee Parsee::valueTypeParsee() { + Parsee parsee; + parsee.kind = ParseeKind::VALUE_TYPE; return parsee; } diff --git a/src/Parser/Parsee/Parsee.h b/src/Parser/Parsee/Parsee.h index 649b50a..dc7cfd4 100644 --- a/src/Parser/Parsee/Parsee.h +++ b/src/Parser/Parsee/Parsee.h @@ -5,7 +5,7 @@ enum class TokenKind; enum class ParseeKind { TOKEN, - TYPE + VALUE_TYPE }; class Parsee { @@ -14,15 +14,13 @@ private: TokenKind tokenKind; bool isRequired; bool shouldReturn; - Parsee(); public: static Parsee tokenParsee(TokenKind tokenKind, bool isRequired, bool shouldReturn); - static Parsee typeParsee(); + static Parsee valueTypeParsee(); ParseeKind getKind(); - TokenKind getTokenKind(); bool getIsRequired(); bool getShouldReturn(); diff --git a/src/Parser/Parsee/ParseeResult.cpp b/src/Parser/Parsee/ParseeResult.cpp new file mode 100644 index 0000000..66dc619 --- /dev/null +++ b/src/Parser/Parsee/ParseeResult.cpp @@ -0,0 +1,33 @@ +#include "ParseeResult.h" + +#include "Lexer/Token.h" +#include "Parser/ValueType.h" + +ParseeResult ParseeResult::tokenResult(shared_ptr token) { + ParseeResult parseeResult; + parseeResult.kind = ParseeResultKind::TOKEN; + parseeResult.token = token; + return parseeResult; +} + +ParseeResult ParseeResult::valueTypeResult(shared_ptr valueType) { + ParseeResult parseeResult; + parseeResult.kind = ParseeResultKind::VALUE_TYPE; + parseeResult.valueType = valueType; + return parseeResult; +} + +ParseeResult::ParseeResult() { } + + +ParseeResultKind ParseeResult::getKind() { + return kind; +} + +shared_ptr ParseeResult::getToken() { + return token; +} + +shared_ptr ParseeResult::getValueType() { + return valueType; +} \ No newline at end of file diff --git a/src/Parser/Parsee/ParseeResult.h b/src/Parser/Parsee/ParseeResult.h new file mode 100644 index 0000000..a909152 --- /dev/null +++ b/src/Parser/Parsee/ParseeResult.h @@ -0,0 +1,32 @@ +#ifndef PARSEE_RESULT_H +#define PARSEE_RESULT_H + +#include + +class Token; +class ValueType; + +using namespace std; + +enum class ParseeResultKind { + TOKEN, + VALUE_TYPE, +}; + +class ParseeResult { +private: + ParseeResultKind kind; + shared_ptr token; + shared_ptr valueType; + ParseeResult(); + +public: + static ParseeResult tokenResult(shared_ptr token); + static ParseeResult valueTypeResult(shared_ptr valueType); + + ParseeResultKind getKind(); + shared_ptr getToken(); + shared_ptr getValueType(); +}; + +#endif \ No newline at end of file diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp index 20fc531..cd0d81e 100644 --- a/src/Parser/Parser.cpp +++ b/src/Parser/Parser.cpp @@ -27,6 +27,7 @@ #include "Parsee/Parsee.h" #include "Parsee/ParseeGroup.h" +#include "Parsee/ParseeResult.h" Parser::Parser(vector> tokens) : tokens(tokens) { } @@ -240,7 +241,7 @@ shared_ptr Parser::matchStatementFunction() { shared_ptr Parser::matchStatementRawFunction() { bool hasError = false; - optional>> groupTokens; + optional> parseeResults; string name; string constraints; @@ -248,7 +249,7 @@ shared_ptr Parser::matchStatementRawFunction() { shared_ptr returnType = ValueType::NONE; // identifier - groupTokens = tokensForParseeGroup( + parseeResults = parseeResultsForParseeGroup( ParseeGroup( true, { @@ -258,15 +259,15 @@ shared_ptr Parser::matchStatementRawFunction() { {} ) ); - if (groupTokens) { - name = (*groupTokens).at(0)->getLexme(); + if (parseeResults) { + name = (*parseeResults).at(0).getToken()->getLexme(); } else { hasError = true; } // options if (!hasError) { - groupTokens = tokensForParseeGroup( + parseeResults = parseeResultsForParseeGroup( ParseeGroup( false, { @@ -277,23 +278,23 @@ shared_ptr Parser::matchStatementRawFunction() { {} ) ); - if (groupTokens && !(*groupTokens).empty()) { - constraints = (*groupTokens).at(0)->getLexme(); - } else if (!groupTokens) { + if (parseeResults && !(*parseeResults).empty()) { + constraints = (*parseeResults).at(0).getToken()->getLexme(); + } else if (!parseeResults) { hasError = true; } } // arguments if (!hasError) { - groupTokens = tokensForParseeGroup( + parseeResults = parseeResultsForParseeGroup( ParseeGroup( false, { Parsee::tokenParsee(TokenKind::COLON, true, false), Parsee::tokenParsee(TokenKind::NEW_LINE, false, false), Parsee::tokenParsee(TokenKind::IDENTIFIER, true, true), - Parsee::typeParsee() + Parsee::valueTypeParsee() }, ParseeGroup( true, @@ -301,36 +302,41 @@ shared_ptr Parser::matchStatementRawFunction() { Parsee::tokenParsee(TokenKind::COMMA, true, false), Parsee::tokenParsee(TokenKind::NEW_LINE, false, false), Parsee::tokenParsee(TokenKind::IDENTIFIER, true, true), - Parsee::typeParsee() + Parsee::valueTypeParsee() }, {} ) ) ); - if (groupTokens && !(*groupTokens).empty()) { - - } else if (!groupTokens) { + 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; } } // return type if (!hasError) { - groupTokens = tokensForParseeGroup( + parseeResults = parseeResultsForParseeGroup( ParseeGroup( false, { Parsee::tokenParsee(TokenKind::RIGHT_ARROW, true, false), Parsee::tokenParsee(TokenKind::NEW_LINE, false, false), - Parsee::typeParsee() + Parsee::valueTypeParsee() }, {} ) ); - if (groupTokens && !(*groupTokens).empty()) { - - } else if (!groupTokens) { + if (parseeResults && !(*parseeResults).empty()) { + returnType = (*parseeResults).at(0).getValueType(); + } else if (!parseeResults) { hasError = true; } } @@ -872,9 +878,9 @@ shared_ptr Parser::matchValueType() { return ValueType::valueTypeForToken(typeToken, subType, valueArg); } -optional>> Parser::tokensForParseeGroup(ParseeGroup group) { +optional> Parser::parseeResultsForParseeGroup(ParseeGroup group) { int nextIndex = currentIndex; - vector> returnTokens; + vector results; bool mustFulfill = false; for (Parsee &parsee : group.getParsees()) { @@ -883,11 +889,11 @@ optional>> Parser::tokensForParseeGroup(ParseeGroup gro // if doesn't match on optional group if (!matches && parsee.getIsRequired() && !group.getIsRequired() && mustFulfill) - return vector>(); + return vector(); // return matching token? if (matches && parsee.getShouldReturn()) - returnTokens.push_back(currentToken); + results.push_back(ParseeResult::tokenResult(currentToken)); // decide if we're decoding the expected sequence if (!parsee.getIsRequired() && nextIndex > currentIndex) @@ -907,7 +913,7 @@ optional>> Parser::tokensForParseeGroup(ParseeGroup gro currentIndex = nextIndex; - return returnTokens; + return results; } bool Parser::tryMatchingTokenKinds(vector kinds, bool shouldMatchAll, bool shouldAdvance) { diff --git a/src/Parser/Parser.h b/src/Parser/Parser.h index cbac15e..db079d4 100644 --- a/src/Parser/Parser.h +++ b/src/Parser/Parser.h @@ -13,6 +13,7 @@ class Expression; class Statement; class ParseeGroup; +class ParseeResult; using namespace std; @@ -54,7 +55,7 @@ private: shared_ptr matchValueType(); - optional>> tokensForParseeGroup(ParseeGroup group); + optional> parseeResultsForParseeGroup(ParseeGroup group); bool tryMatchingTokenKinds(vector kinds, bool shouldMatchAll, bool shouldAdvance); void markError(optional expectedTokenKind, optional message);