From 1c19600430a015a712d1c3d2b50193a18f3de770 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Grodzi=C5=84ski?= Date: Tue, 8 Jul 2025 19:20:31 +0900 Subject: [PATCH] Fixed parser --- .gitignore | 12 +++++++++--- .vscode/launch.json | 2 +- src/Parser/Parser.cpp | 10 +++++----- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index 0f82e52..6ec6bb1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,12 @@ -.DS_Store +# ignore files without extensions +* +!*.* +# brb build artifiacts *.o -brb + +.DS_Store .vscode/settings.json + +# project build artifacts *.dSYM -build/ \ No newline at end of file +build/ diff --git a/.vscode/launch.json b/.vscode/launch.json index 2dd8039..4b91f3e 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -6,7 +6,7 @@ "type": "lldb-dap", "request": "launch", "program": "${command:cmake.launchTargetPath}", - "args": ["-v", "${workspaceFolder}/test.brc"], + "args": ["-v", "${workspaceFolder}/samples/test.brc"], "cwd": "${workspaceFolder}", "internalConsoleOptions": "openOnSessionStart", } diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp index 441464a..177203d 100644 --- a/src/Parser/Parser.cpp +++ b/src/Parser/Parser.cpp @@ -122,7 +122,7 @@ shared_ptr Parser::matchStatementMetaExternFunction() { return nullptr; } shared_ptr identifierToken = tokens.at(currentIndex++); - shared_ptr argumentTypeToken = tokens.at(currentIndex++); + //shared_ptr argumentTypeToken = tokens.at(currentIndex++); shared_ptr argumentType = matchValueType(); if (argumentType == nullptr) { markError(TokenKind::TYPE, {}); @@ -143,8 +143,6 @@ shared_ptr Parser::matchStatementMetaExternFunction() { markError(TokenKind::TYPE, {}); return nullptr; } - - currentIndex++; // type } return make_shared(identifierToken->getLexme(), arguments, returnType); @@ -192,7 +190,6 @@ shared_ptr Parser::matchStatementFunction() { return nullptr; } shared_ptr identifierToken = tokens.at(currentIndex++); - shared_ptr argumentTypeToken = tokens.at(currentIndex++); shared_ptr argumentType = matchValueType(); if (argumentType == nullptr) { markError(TokenKind::TYPE, {}); @@ -207,7 +204,6 @@ shared_ptr Parser::matchStatementFunction() { 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, {}); @@ -703,5 +699,9 @@ void Parser::markError(optional expectedTokenKind, optional m while (!tryMatchingTokenKinds(safeKinds, false, true)) currentIndex++; + // Last END should not be consumed + if (currentIndex > tokens.size() - 1) + currentIndex = tokens.size() - 1; + errors.push_back(Error::parserError(actualToken, expectedTokenKind, message)); }