Equality and comparison
This commit is contained in:
@@ -21,6 +21,24 @@ string Expression::toString() {
|
|||||||
ExpressionBinary::ExpressionBinary(shared_ptr<Token> token, shared_ptr<Expression> left, shared_ptr<Expression> right):
|
ExpressionBinary::ExpressionBinary(shared_ptr<Token> token, shared_ptr<Expression> left, shared_ptr<Expression> right):
|
||||||
Expression(Expression::Kind::BINARY), left(left), right(right) {
|
Expression(Expression::Kind::BINARY), left(left), right(right) {
|
||||||
switch (token->getKind()) {
|
switch (token->getKind()) {
|
||||||
|
case Token::Kind::EQUAL:
|
||||||
|
operation = EQUAL;
|
||||||
|
break;
|
||||||
|
case Token::Kind::NOT_EQUAL:
|
||||||
|
operation = NOT_EQUAL;
|
||||||
|
break;
|
||||||
|
case Token::Kind::LESS:
|
||||||
|
operation = LESS;
|
||||||
|
break;
|
||||||
|
case Token::Kind::LESS_EQUAL:
|
||||||
|
operation = LESS_EQUAL;
|
||||||
|
break;
|
||||||
|
case Token::Kind::GREATER:
|
||||||
|
operation = GREATER;
|
||||||
|
break;
|
||||||
|
case Token::Kind::GREATER_EQUAL:
|
||||||
|
operation = GREATER_EQUAL;
|
||||||
|
break;
|
||||||
case Token::Kind::PLUS:
|
case Token::Kind::PLUS:
|
||||||
operation = ADD;
|
operation = ADD;
|
||||||
break;
|
break;
|
||||||
@@ -55,16 +73,28 @@ shared_ptr<Expression> ExpressionBinary::getRight() {
|
|||||||
|
|
||||||
string ExpressionBinary::toString() {
|
string ExpressionBinary::toString() {
|
||||||
switch (operation) {
|
switch (operation) {
|
||||||
|
case EQUAL:
|
||||||
|
return "{= " + left->toString() + " " + right->toString() + "}";
|
||||||
|
case NOT_EQUAL:
|
||||||
|
return "{!= " + left->toString() + " " + right->toString() + "}";
|
||||||
|
case LESS:
|
||||||
|
return "{< " + left->toString() + " " + right->toString() + "}";
|
||||||
|
case LESS_EQUAL:
|
||||||
|
return "{<= " + left->toString() + " " + right->toString() + "}";
|
||||||
|
case GREATER:
|
||||||
|
return "{> " + left->toString() + " " + right->toString() + "}";
|
||||||
|
case GREATER_EQUAL:
|
||||||
|
return "{<= " + left->toString() + " " + right->toString() + "}";
|
||||||
case ADD:
|
case ADD:
|
||||||
return "<+ " + left->toString() + " " + right->toString() + ">";
|
return "{+ " + left->toString() + " " + right->toString() + "}";
|
||||||
case SUB:
|
case SUB:
|
||||||
return "<- " + left->toString() + " " + right->toString() + ">";
|
return "{- " + left->toString() + " " + right->toString() + "}";
|
||||||
case MUL:
|
case MUL:
|
||||||
return "<* " + left->toString() + " " + right->toString() + ">";
|
return "{* " + left->toString() + " " + right->toString() + "}";
|
||||||
case DIV:
|
case DIV:
|
||||||
return "</ " + left->toString() + " " + right->toString() + ">";
|
return "{/ " + left->toString() + " " + right->toString() + "}";
|
||||||
case MOD:
|
case MOD:
|
||||||
return "<% " + left->toString() + " " + right->toString() + ">";
|
return "{% " + left->toString() + " " + right->toString() + "}";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -47,6 +47,12 @@ public:
|
|||||||
class ExpressionBinary: public Expression {
|
class ExpressionBinary: public Expression {
|
||||||
public:
|
public:
|
||||||
enum Operation {
|
enum Operation {
|
||||||
|
EQUAL,
|
||||||
|
NOT_EQUAL,
|
||||||
|
LESS,
|
||||||
|
LESS_EQUAL,
|
||||||
|
GREATER,
|
||||||
|
GREATER_EQUAL,
|
||||||
ADD,
|
ADD,
|
||||||
SUB,
|
SUB,
|
||||||
MUL,
|
MUL,
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ shared_ptr<Token> Lexer::nextToken() {
|
|||||||
if (token != nullptr)
|
if (token != nullptr)
|
||||||
return token;
|
return token;
|
||||||
|
|
||||||
// logical
|
// comparison
|
||||||
token = match(Token::Kind::NOT_EQUAL, "!=", false);
|
token = match(Token::Kind::NOT_EQUAL, "!=", false);
|
||||||
if (token != nullptr)
|
if (token != nullptr)
|
||||||
return token;
|
return token;
|
||||||
|
|||||||
@@ -122,7 +122,33 @@ shared_ptr<StatementInvalid> Parser::matchStatementInvalid() {
|
|||||||
// Expression
|
// Expression
|
||||||
//
|
//
|
||||||
shared_ptr<Expression> Parser::nextExpression() {
|
shared_ptr<Expression> Parser::nextExpression() {
|
||||||
return matchTerm();
|
return matchEquality();
|
||||||
|
}
|
||||||
|
|
||||||
|
shared_ptr<Expression> Parser::matchEquality() {
|
||||||
|
shared_ptr<Expression> expression = matchTerm();
|
||||||
|
if (expression == nullptr || !expression->isValid())
|
||||||
|
return expression;
|
||||||
|
|
||||||
|
while (tokens.at(currentIndex)->isOfKind(Token::tokensEquality)) {
|
||||||
|
// comaprison
|
||||||
|
expression = matchExpressionBinary(expression);
|
||||||
|
}
|
||||||
|
|
||||||
|
return expression;
|
||||||
|
}
|
||||||
|
|
||||||
|
shared_ptr<Expression> Parser::matchComparison() {
|
||||||
|
shared_ptr<Expression> expression = matchTerm();
|
||||||
|
if (expression == nullptr || !expression->isValid())
|
||||||
|
return expression;
|
||||||
|
|
||||||
|
while (tokens.at(currentIndex)->isOfKind(Token::tokensComparison)) {
|
||||||
|
// term
|
||||||
|
expression = matchExpressionBinary(expression);
|
||||||
|
}
|
||||||
|
|
||||||
|
return expression;
|
||||||
}
|
}
|
||||||
|
|
||||||
shared_ptr<Expression> Parser::matchTerm() {
|
shared_ptr<Expression> Parser::matchTerm() {
|
||||||
@@ -130,7 +156,8 @@ shared_ptr<Expression> Parser::matchTerm() {
|
|||||||
if (expression == nullptr || !expression->isValid())
|
if (expression == nullptr || !expression->isValid())
|
||||||
return expression;
|
return expression;
|
||||||
|
|
||||||
while (tokens.at(currentIndex)->isOfKind({Token::Kind::PLUS, Token::Kind::MINUS})) {
|
while (tokens.at(currentIndex)->isOfKind(Token::tokensTerm)) {
|
||||||
|
// factor
|
||||||
expression = matchExpressionBinary(expression);
|
expression = matchExpressionBinary(expression);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -142,7 +169,8 @@ shared_ptr<Expression> Parser::matchFactor() {
|
|||||||
if (expression == nullptr || !expression->isValid())
|
if (expression == nullptr || !expression->isValid())
|
||||||
return expression;
|
return expression;
|
||||||
|
|
||||||
while (tokens.at(currentIndex)->isOfKind({Token::Kind::STAR, Token::Kind::SLASH, Token::Kind::PERCENT})) {
|
while (tokens.at(currentIndex)->isOfKind(Token::tokensFactor)) {
|
||||||
|
// unary
|
||||||
expression = matchExpressionBinary(expression);
|
expression = matchExpressionBinary(expression);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -196,7 +224,7 @@ shared_ptr<Expression> Parser::matchExpressionGrouping() {
|
|||||||
|
|
||||||
shared_ptr<Expression> Parser::matchExpressionBinary(shared_ptr<Expression> left) {
|
shared_ptr<Expression> Parser::matchExpressionBinary(shared_ptr<Expression> left) {
|
||||||
shared_ptr<Token> token = tokens.at(currentIndex);
|
shared_ptr<Token> token = tokens.at(currentIndex);
|
||||||
if (token->isOfKind({Token::Kind::PLUS, Token::Kind::MINUS, Token::Kind::STAR, Token::Kind::SLASH, Token::Kind::PERCENT})) {
|
if (token->isOfKind(Token::tokensBinary)) {
|
||||||
currentIndex++;
|
currentIndex++;
|
||||||
shared_ptr<Expression> right = matchFactor();
|
shared_ptr<Expression> right = matchFactor();
|
||||||
if (right == nullptr) {
|
if (right == nullptr) {
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ private:
|
|||||||
shared_ptr<StatementInvalid> matchStatementInvalid();
|
shared_ptr<StatementInvalid> matchStatementInvalid();
|
||||||
|
|
||||||
shared_ptr<Expression> nextExpression();
|
shared_ptr<Expression> nextExpression();
|
||||||
|
shared_ptr<Expression> matchEquality(); // =, !=
|
||||||
|
shared_ptr<Expression> matchComparison(); // <, <=, >, >=
|
||||||
shared_ptr<Expression> matchTerm(); // +, -
|
shared_ptr<Expression> matchTerm(); // +, -
|
||||||
shared_ptr<Expression> matchFactor(); // *, /, %
|
shared_ptr<Expression> matchFactor(); // *, /, %
|
||||||
shared_ptr<Expression> matchPrimary(); // integer, ()
|
shared_ptr<Expression> matchPrimary(); // integer, ()
|
||||||
|
|||||||
@@ -1,5 +1,41 @@
|
|||||||
#include "Token.h"
|
#include "Token.h"
|
||||||
|
|
||||||
|
vector<Token::Kind> Token::tokensEquality = {
|
||||||
|
Token::Kind::EQUAL,
|
||||||
|
Token::Kind::NOT_EQUAL
|
||||||
|
};
|
||||||
|
vector<Token::Kind> Token::tokensComparison = {
|
||||||
|
Token::Kind::LESS,
|
||||||
|
Token::Kind::LESS_EQUAL,
|
||||||
|
Token::Kind::GREATER,
|
||||||
|
Token::Kind::GREATER_EQUAL
|
||||||
|
};
|
||||||
|
vector<Token::Kind> Token::tokensTerm = {
|
||||||
|
Token::Kind::PLUS,
|
||||||
|
Token::Kind::MINUS
|
||||||
|
};
|
||||||
|
vector<Token::Kind> Token::tokensFactor = {
|
||||||
|
Token::Kind::STAR,
|
||||||
|
Token::Kind::SLASH,
|
||||||
|
Token::Kind::PERCENT
|
||||||
|
};
|
||||||
|
vector<Token::Kind> Token::tokensBinary = {
|
||||||
|
Token::Kind::EQUAL,
|
||||||
|
Token::Kind::NOT_EQUAL,
|
||||||
|
|
||||||
|
Token::Kind::LESS,
|
||||||
|
Token::Kind::LESS_EQUAL,
|
||||||
|
Token::Kind::GREATER,
|
||||||
|
Token::Kind::GREATER_EQUAL,
|
||||||
|
|
||||||
|
Token::Kind::PLUS,
|
||||||
|
Token::Kind::MINUS,
|
||||||
|
|
||||||
|
Token::Kind::STAR,
|
||||||
|
Token::Kind::SLASH,
|
||||||
|
Token::Kind::PERCENT
|
||||||
|
};
|
||||||
|
|
||||||
Token::Token(Kind kind, string lexme, int line, int column):
|
Token::Token(Kind kind, string lexme, int line, int column):
|
||||||
kind(kind), lexme(lexme), line(line), column(column) {
|
kind(kind), lexme(lexme), line(line), column(column) {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,6 +45,12 @@ private:
|
|||||||
int column;
|
int column;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
static vector<Token::Kind> tokensEquality;
|
||||||
|
static vector<Token::Kind> tokensComparison;
|
||||||
|
static vector<Token::Kind> tokensTerm;
|
||||||
|
static vector<Token::Kind> tokensFactor;
|
||||||
|
static vector<Token::Kind> tokensBinary;
|
||||||
|
|
||||||
Token(Kind kind, string lexme, int line, int column);
|
Token(Kind kind, string lexme, int line, int column);
|
||||||
Kind getKind();
|
Kind getKind();
|
||||||
string getLexme();
|
string getLexme();
|
||||||
|
|||||||
Reference in New Issue
Block a user