From e37a34b4e65372b23b51db2488e99cef931799c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Grodzi=C5=84ski?= Date: Thu, 31 Jul 2025 14:01:15 +0900 Subject: [PATCH] Parse value type arg --- src/Parser/Parser.cpp | 52 +++++++++---------------------------------- src/Parser/Parser.h | 2 -- 2 files changed, 10 insertions(+), 44 deletions(-) diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp index a7d06b4..0db1a3d 100644 --- a/src/Parser/Parser.cpp +++ b/src/Parser/Parser.cpp @@ -952,46 +952,6 @@ shared_ptr Parser::matchExpressionBlock(vector terminalTo return make_shared(statements); } -shared_ptr Parser::matchValueType() { - if (!tryMatchingTokenKinds({TokenKind::TYPE}, true, false)) - return nullptr; - shared_ptr typeToken = tokens.at(currentIndex++); - shared_ptr subType; - int valueArg = 0; - - if (tryMatchingTokenKinds({TokenKind::LESS}, true, true)) { - if (!tryMatchingTokenKinds({TokenKind::TYPE}, true, false)) { - markError(TokenKind::TYPE, {}); - return nullptr; - } - subType = matchValueType(); - if (subType == nullptr) - return subType; - - if (tryMatchingTokenKinds({TokenKind::COMMA}, true, true)) { - if (!tryMatchingTokenKinds({TokenKind::INTEGER_DEC, TokenKind::INTEGER_HEX, TokenKind::INTEGER_BIN, TokenKind::INTEGER_CHAR}, false, false)) { - markError({}, "Expected integer literal"); - return nullptr; - } - shared_ptr expressionValue = matchExpressionLiteral(); - if (expressionValue == nullptr) { - markError({}, "Expected integer literal"); - return nullptr; - } - - valueArg = dynamic_pointer_cast(expressionValue)->getSint32Value(); - } - - - if (!tryMatchingTokenKinds({TokenKind::GREATER}, true, true)) { - markError(TokenKind::GREATER, {}); - return nullptr; - } - } - - return ValueType::valueTypeForToken(typeToken, subType, valueArg); -} - ParseeResultsGroup Parser::parseeResultsGroupForParseeGroup(ParseeGroup group) { int errorsCount = errors.size(); int startIndex = currentIndex; @@ -1081,20 +1041,28 @@ optional Parser::valueTypeParseeResult(int index) { if (!subResult) return {}; subType = (*subResult).getValueType(); - + index += (*subResult).getTokensCount(); if (tokens.at(index)->isOfKind({TokenKind::COMMA})) { index++; if (!tokens.at(index)->isOfKind({TokenKind::INTEGER_DEC, TokenKind::INTEGER_HEX, TokenKind::INTEGER_BIN, TokenKind::INTEGER_CHAR})) return {}; + + int storedIndex = currentIndex; + currentIndex = index; + shared_ptr expressionValue = matchExpressionLiteral(); + typeArg = dynamic_pointer_cast(expressionValue)->getSint32Value(); + currentIndex = storedIndex; + index++; } if (!tokens.at(index)->isOfKind({TokenKind::GREATER})) return {}; + index++; } - shared_ptr valueType = ValueType::valueTypeForToken(typeToken, subType, 0); + shared_ptr valueType = ValueType::valueTypeForToken(typeToken, subType, typeArg); return ParseeResult::valueTypeResult(valueType, index - startIndex); } diff --git a/src/Parser/Parser.h b/src/Parser/Parser.h index 9ab27a3..8e5a8d5 100644 --- a/src/Parser/Parser.h +++ b/src/Parser/Parser.h @@ -54,8 +54,6 @@ private: shared_ptr matchExpressionBinary(shared_ptr left); shared_ptr matchExpressionBlock(vector terminalTokenKinds); - shared_ptr matchValueType(); - ParseeResultsGroup parseeResultsGroupForParseeGroup(ParseeGroup group); optional tokenParseeResult(int index, TokenKind tokenKind); optional valueTypeParseeResult(int index);