From 37bcb5c2c713e9034680d8fd0e95f9191c267205 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Grodzi=C5=84ski?= Date: Thu, 12 Jun 2025 17:06:23 +0900 Subject: [PATCH] Parse var reference --- src/Parser.cpp | 14 +++++++++----- src/Parser.h | 2 +- src/Statement.cpp | 10 +++++++--- src/Statement.h | 4 +++- src/Token.cpp | 5 +++++ src/Token.h | 1 + 6 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/Parser.cpp b/src/Parser.cpp index 39a6927..7d18952 100644 --- a/src/Parser.cpp +++ b/src/Parser.cpp @@ -100,7 +100,7 @@ shared_ptr Parser::matchStatementVarDeclaration() { // Expect new line if (!tryMatchingTokenKinds({TokenKind::NEW_LINE}, true, true)) - return matchStatementInvalid(); + return matchStatementInvalid("Expected a new line"); return make_shared(identifierToken->getLexme(), valueType, expression); } @@ -150,7 +150,7 @@ shared_ptr Parser::matchStatementExpression() { if (expression == nullptr) return nullptr; else if (!expression->isValid()) - return make_shared(tokens.at(currentIndex)); + return make_shared(tokens.at(currentIndex), expression->toString(0)); // Consume new line tryMatchingTokenKinds({TokenKind::NEW_LINE}, true, true); @@ -158,8 +158,8 @@ shared_ptr Parser::matchStatementExpression() { return make_shared(expression); } -shared_ptr Parser::matchStatementInvalid() { - return make_shared(tokens.at(currentIndex)); +shared_ptr Parser::matchStatementInvalid(string message) { + return make_shared(tokens.at(currentIndex), message); } // @@ -234,6 +234,10 @@ shared_ptr Parser::matchPrimary() { if (expression != nullptr) return expression; + expression = matchExpressionVar(); + if (expression != nullptr) + return expression; + expression = matchExpressionGrouping(); if (expression != nullptr) return expression; @@ -244,7 +248,7 @@ shared_ptr Parser::matchPrimary() { shared_ptr Parser::matchExpressionLiteral() { shared_ptr token = tokens.at(currentIndex); - if (tryMatchingTokenKinds({TokenKind::BOOL, TokenKind::INTEGER, TokenKind::REAL}, false, true)) + if (tryMatchingTokenKinds(Token::tokensLiteral, false, true)) return make_shared(token); return nullptr; diff --git a/src/Parser.h b/src/Parser.h index c2e5548..b3f1fda 100644 --- a/src/Parser.h +++ b/src/Parser.h @@ -20,7 +20,7 @@ private: shared_ptr matchStatementBlock(); shared_ptr matchStatementReturn(); shared_ptr matchStatementExpression(); - shared_ptr matchStatementInvalid(); + shared_ptr matchStatementInvalid(string message = ""); shared_ptr nextExpression(); shared_ptr matchEquality(); // =, != diff --git a/src/Statement.cpp b/src/Statement.cpp index ba16259..cef5634 100644 --- a/src/Statement.cpp +++ b/src/Statement.cpp @@ -172,10 +172,14 @@ string StatementExpression::toString(int indent) { // // StatementInvalid -StatementInvalid::StatementInvalid(shared_ptr token): -Statement(StatementKind::INVALID), token(token) { +StatementInvalid::StatementInvalid(shared_ptr token, string message): +Statement(StatementKind::INVALID), token(token), message(message) { } string StatementInvalid::toString(int indent) { - return "Invalid token " + token->toString() + " at " + to_string(token->getLine()) + ":" + to_string(token->getColumn()) + "\n"; + return "Error for token " + token->getLexme() + " at " + to_string(token->getLine()) + ":" + to_string(token->getColumn()) + ": " + message + "\n"; +} + +string StatementInvalid::getMessage() { + return message; } diff --git a/src/Statement.h b/src/Statement.h index cf1e0f8..0e00d99 100644 --- a/src/Statement.h +++ b/src/Statement.h @@ -104,10 +104,12 @@ public: class StatementInvalid: public Statement { private: shared_ptr token; + string message; public: - StatementInvalid(shared_ptr token); + StatementInvalid(shared_ptr token, string message); string toString(int indent) override; + string getMessage(); }; #endif \ No newline at end of file diff --git a/src/Token.cpp b/src/Token.cpp index 56f7bc0..aca1ad4 100644 --- a/src/Token.cpp +++ b/src/Token.cpp @@ -35,6 +35,11 @@ vector Token::tokensBinary = { TokenKind::SLASH, TokenKind::PERCENT }; +vector Token::tokensLiteral = { + TokenKind::BOOL, + TokenKind::INTEGER, + TokenKind::REAL +}; Token::Token(TokenKind kind, string lexme, int line, int column): kind(kind), lexme(lexme), line(line), column(column) { diff --git a/src/Token.h b/src/Token.h index a9ed930..3f0e6ad 100644 --- a/src/Token.h +++ b/src/Token.h @@ -20,6 +20,7 @@ public: static vector tokensTerm; static vector tokensFactor; static vector tokensBinary; + static vector tokensLiteral; Token(TokenKind kind, string lexme, int line, int column); TokenKind getKind();