diff --git a/src/Lexer.cpp b/src/Lexer.cpp index 5050068..243ea78 100644 --- a/src/Lexer.cpp +++ b/src/Lexer.cpp @@ -9,7 +9,7 @@ vector Lexer::getTokens() { Token token = nextToken(); // Abort scanning if we got an error - if (token.getKind() == Token::Kind::INVALID) { + if (!token.isValid()) { cerr << "Unexpected character '" << token.getLexme() << "' at " << token.getLine() << ":" << token.getColumn() << endl; return vector(); } diff --git a/src/Parser.cpp b/src/Parser.cpp index 6c16192..27b1f09 100644 --- a/src/Parser.cpp +++ b/src/Parser.cpp @@ -3,21 +3,51 @@ Parser::Parser(vector tokens): tokens(tokens) { } -/*shared_ptr Parser::getExpression() { - shared_ptr expression = term(); - if (!expression->isValid()) { - cerr << "Unexpected token '" << expression->getToken().getLexme() << "' at " << expression->getToken().getLine() << ":" << expression->getToken().getColumn() << endl; - return nullptr; - } - return expression; -}*/ - vector> Parser::getStatements() { vector> statements; - statements.push_back(make_shared(Statement::Kind::INVALID)); + + while (tokens.at(currentIndex).getKind() != Token::Kind::END) { + shared_ptr statement = nextStatement(); + // Abort parsing if we got an error + if (!statement->isValid()) { + cerr << "Unexpected token '" << statement->getToken().getLexme() << "' at " << statement->getToken().getLine() << ":" << statement->getToken().getColumn() << endl; + return vector>(); + } + statements.push_back(statement); + } + return statements; } +// +// Statement +// +shared_ptr Parser::nextStatement() { + { + shared_ptr statement = matchExpressionStatement(); + if (statement->isValid()) + return statement; + } + + return matchInvalidStatement(); +} + +shared_ptr Parser::matchInvalidStatement() { + return make_shared(Statement::Kind::INVALID, tokens.at(currentIndex), nullptr); +} + +// +// Expression +// +shared_ptr Parser::matchExpressionStatement() { + shared_ptr expression = term(); + if (expression->isValid()) { + return make_shared(Statement::Kind::EXPRESSION, tokens.at(currentIndex), expression); + } else { + return make_shared(Statement::Kind::INVALID, tokens.at(currentIndex), expression); + } +} + shared_ptr Parser::term() { shared_ptr expression = factor(); diff --git a/src/Parser.h b/src/Parser.h index 81d2c8b..f82c118 100644 --- a/src/Parser.h +++ b/src/Parser.h @@ -13,6 +13,11 @@ private: vector tokens; int currentIndex = 0; + shared_ptr nextStatement(); + + shared_ptr matchInvalidStatement() ; + + shared_ptr matchExpressionStatement(); shared_ptr term(); // +, - shared_ptr factor(); // *, /, % shared_ptr primary(); // integer, () diff --git a/src/Statement.cpp b/src/Statement.cpp index 197ba4b..ff9c525 100644 --- a/src/Statement.cpp +++ b/src/Statement.cpp @@ -1,10 +1,24 @@ #include "Statement.h" -Statement::Statement(Kind kind): kind(kind) { +Statement::Statement(Kind kind, Token token, shared_ptr expression): kind(kind), token(token), expression(expression) { +} + +shared_ptr Statement::getExpression() { + return expression; +} + +Token Statement::getToken() { + return token; +} + +bool Statement::isValid() { + return kind != Statement::Kind::INVALID; } string Statement::toString() { switch (kind) { + case EXPRESSION: + return expression->toString(); case INVALID: return "INVALID"; } diff --git a/src/Statement.h b/src/Statement.h index b536375..1188df8 100644 --- a/src/Statement.h +++ b/src/Statement.h @@ -3,19 +3,28 @@ #include +#include "Token.h" +#include "Expression.h" + using namespace std; class Statement { public: enum Kind { + EXPRESSION, INVALID }; private: Kind kind; + Token token; + shared_ptr expression; public: - Statement(Kind kind); + Statement(Kind kind, Token token, shared_ptr expression); + Token getToken(); + shared_ptr getExpression(); + bool isValid(); string toString(); };