Added expression statement

This commit is contained in:
Rafał Grodziński
2025-06-01 11:37:01 +09:00
parent 28e892ca12
commit 265ce4c94d
5 changed files with 71 additions and 13 deletions

View File

@@ -9,7 +9,7 @@ vector<Token> Lexer::getTokens() {
Token token = nextToken(); Token token = nextToken();
// Abort scanning if we got an error // 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; cerr << "Unexpected character '" << token.getLexme() << "' at " << token.getLine() << ":" << token.getColumn() << endl;
return vector<Token>(); return vector<Token>();
} }

View File

@@ -3,21 +3,51 @@
Parser::Parser(vector<Token> tokens): tokens(tokens) { Parser::Parser(vector<Token> tokens): tokens(tokens) {
} }
/*shared_ptr<Expression> Parser::getExpression() {
shared_ptr<Expression> expression = term();
if (!expression->isValid()) {
cerr << "Unexpected token '" << expression->getToken().getLexme() << "' at " << expression->getToken().getLine() << ":" << expression->getToken().getColumn() << endl;
return nullptr;
}
return expression;
}*/
vector<shared_ptr<Statement>> Parser::getStatements() { vector<shared_ptr<Statement>> Parser::getStatements() {
vector<shared_ptr<Statement>> statements; vector<shared_ptr<Statement>> statements;
statements.push_back(make_shared<Statement>(Statement::Kind::INVALID));
while (tokens.at(currentIndex).getKind() != Token::Kind::END) {
shared_ptr<Statement> 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<shared_ptr<Statement>>();
}
statements.push_back(statement);
}
return statements; return statements;
} }
//
// Statement
//
shared_ptr<Statement> Parser::nextStatement() {
{
shared_ptr<Statement> statement = matchExpressionStatement();
if (statement->isValid())
return statement;
}
return matchInvalidStatement();
}
shared_ptr<Statement> Parser::matchInvalidStatement() {
return make_shared<Statement>(Statement::Kind::INVALID, tokens.at(currentIndex), nullptr);
}
//
// Expression
//
shared_ptr<Statement> Parser::matchExpressionStatement() {
shared_ptr<Expression> expression = term();
if (expression->isValid()) {
return make_shared<Statement>(Statement::Kind::EXPRESSION, tokens.at(currentIndex), expression);
} else {
return make_shared<Statement>(Statement::Kind::INVALID, tokens.at(currentIndex), expression);
}
}
shared_ptr<Expression> Parser::term() { shared_ptr<Expression> Parser::term() {
shared_ptr<Expression> expression = factor(); shared_ptr<Expression> expression = factor();

View File

@@ -13,6 +13,11 @@ private:
vector<Token> tokens; vector<Token> tokens;
int currentIndex = 0; int currentIndex = 0;
shared_ptr<Statement> nextStatement();
shared_ptr<Statement> matchInvalidStatement() ;
shared_ptr<Statement> matchExpressionStatement();
shared_ptr<Expression> term(); // +, - shared_ptr<Expression> term(); // +, -
shared_ptr<Expression> factor(); // *, /, % shared_ptr<Expression> factor(); // *, /, %
shared_ptr<Expression> primary(); // integer, () shared_ptr<Expression> primary(); // integer, ()

View File

@@ -1,10 +1,24 @@
#include "Statement.h" #include "Statement.h"
Statement::Statement(Kind kind): kind(kind) { Statement::Statement(Kind kind, Token token, shared_ptr<Expression> expression): kind(kind), token(token), expression(expression) {
}
shared_ptr<Expression> Statement::getExpression() {
return expression;
}
Token Statement::getToken() {
return token;
}
bool Statement::isValid() {
return kind != Statement::Kind::INVALID;
} }
string Statement::toString() { string Statement::toString() {
switch (kind) { switch (kind) {
case EXPRESSION:
return expression->toString();
case INVALID: case INVALID:
return "INVALID"; return "INVALID";
} }

View File

@@ -3,19 +3,28 @@
#include <iostream> #include <iostream>
#include "Token.h"
#include "Expression.h"
using namespace std; using namespace std;
class Statement { class Statement {
public: public:
enum Kind { enum Kind {
EXPRESSION,
INVALID INVALID
}; };
private: private:
Kind kind; Kind kind;
Token token;
shared_ptr<Expression> expression;
public: public:
Statement(Kind kind); Statement(Kind kind, Token token, shared_ptr<Expression> expression);
Token getToken();
shared_ptr<Expression> getExpression();
bool isValid();
string toString(); string toString();
}; };