Postfix ve Prefix operatörleri binaryexpression ve unary için işlenebilir hale getirildi

This commit is contained in:
abdussamedulutas 2026-01-01 14:32:14 +03:00
parent 4839f371eb
commit 817d36bc4a
4 changed files with 86 additions and 10 deletions

View File

@ -45,7 +45,7 @@ class BinaryExpressionNode : public ASTNode
{ {
std::cout std::cout
<< padRight(" ",indent) << padRight(" ",indent)
<< "BinaryExpressionNode" << "BinaryExpressionNode "
<< OPERATOR_MAP_STRREV.find(this->Operator)->second << OPERATOR_MAP_STRREV.find(this->Operator)->second
<< "( "<< OPERATOR_MAP_REV.find(this->Operator)->second << " )" << "( "<< OPERATOR_MAP_REV.find(this->Operator)->second << " )"
<< "\n"; << "\n";
@ -72,4 +72,38 @@ class LiteralNode : public ASTNode
ParserToken parserToken; ParserToken parserToken;
}; };
class IdentifierNode : public ASTNode
{
protected:
ASTKind kind = ASTKind::Literal;
void log(int indent)
{
std::cout << padRight(" ",indent) << "IdentifierNode {" << this->lexerToken.token << "}\n";
}
public:
Token lexerToken;
ParserToken parserToken;
};
class PostfixNode : public ASTNode
{
protected:
ASTKind kind = ASTKind::Literal;
void log(int indent)
{
std::cout
<< padRight(" ",indent)
<< "Postfix "
<< OPERATOR_MAP_STRREV.find(this->Operator)->second
<< "( "<< OPERATOR_MAP_REV.find(this->Operator)->second << " )"
<< "\n";
this->operand->log(indent + 4);
}
public:
ASTNode * operand;
TokenType Operator;
};
#endif #endif

View File

@ -60,7 +60,7 @@ ParserToken Parser::parseToken(Token token){
} }
else if(token.gettype() == "identifier") else if(token.gettype() == "identifier")
{ {
pToken.type = KEYWORD_MAP.find(token.token)->second; pToken.type = TokenType::IDENTIFIER;
} }
return pToken; return pToken;
@ -118,6 +118,10 @@ void Parser::primaryExpression()
} }
} }
// Expresssionu tamamen okuyup bitiren kısım burası
// Bir expressionda kendi içerisindeki operatörleri işler
// Terimler ile ilgilenmez yanlızca ifadelerin önceliğini belirler
// Sayılar, fonksionlar, tanımlamalar gibi şeyler burda işlenmez
ASTNode * Parser::volumeExpression(uint16_t precedence) ASTNode * Parser::volumeExpression(uint16_t precedence)
{ {
if (this->currentToken().type == TokenType::SVR_VOID) if (this->currentToken().type == TokenType::SVR_VOID)
@ -127,9 +131,17 @@ ASTNode * Parser::volumeExpression(uint16_t precedence)
ASTNode* left = this->volumeNullDominatorExpression(); ASTNode* left = this->volumeNullDominatorExpression();
if (!left) {
return nullptr;
}
while(1) while(1)
{ {
auto nextToken = this->lookehead(+1); auto nextToken = this->lookehead(+1);
if (nextToken.type == TokenType::RPAREN) {
break;
}
nextToken = this->lookehead(+1);
if(precedence < nextToken.getPowerOperator()) if(precedence < nextToken.getPowerOperator())
{ {
this->nextToken(); this->nextToken();
@ -141,8 +153,9 @@ ASTNode * Parser::volumeExpression(uint16_t precedence)
return left; return left;
} }
// Terimler burada işlenir tanımlamalar sayılar burada işlenir
// işlem önceliği işlenmez
// Tek yönlü operatörler !a b++ ++c burada işlenir
ASTNode * Parser::volumeNullDominatorExpression() ASTNode * Parser::volumeNullDominatorExpression()
{ {
auto currentToken = this->currentToken(); auto currentToken = this->currentToken();
@ -151,7 +164,19 @@ ASTNode * Parser::volumeNullDominatorExpression()
// Hata: "Beklenmedik dosya sonu, bir değer bekleniyordu!" // Hata: "Beklenmedik dosya sonu, bir değer bekleniyordu!"
return nullptr; return nullptr;
} }
if (currentToken.type == TokenType::RPAREN) {
return nullptr;
}
if (currentToken.type == TokenType::LPAREN) {
this->nextToken();
ASTNode* expr = this->volumeExpression(0);
this->nextToken();
return expr;
}
if(currentToken.is({ if(currentToken.is({
TokenType::PLUS_PLUS, TokenType::PLUS_PLUS,
@ -170,23 +195,40 @@ ASTNode * Parser::volumeNullDominatorExpression()
return binNode; return binNode;
}; };
if(currentToken.is({ if(currentToken.is(TokenType::NUMBER)) {
TokenType::NUMBER
})) {
LiteralNode * lNode = new LiteralNode(); LiteralNode * lNode = new LiteralNode();
lNode->lexerToken = currentToken.token; lNode->lexerToken = currentToken.token;
lNode->parserToken = currentToken; lNode->parserToken = currentToken;
return lNode; return lNode;
} }
if(currentToken.is(TokenType::IDENTIFIER)) {
IdentifierNode * iNode = new IdentifierNode();
iNode->lexerToken = currentToken.token;
iNode->parserToken = currentToken;
return iNode;
}
return nullptr; return nullptr;
} }
// Çift yönlü matematiksel işlemler burada işlenir
// [volume]+[volume] veya [volume] * [volume] gibi terimleri birbirine bağlayarak geri döner
ASTNode * Parser::volumeLeftDominatorExpression(ASTNode * left) ASTNode * Parser::volumeLeftDominatorExpression(ASTNode * left)
{ {
auto currentToken = this->currentToken(); auto currentToken = this->currentToken();
if (currentToken.is({
TokenType::PLUS_PLUS,
TokenType::MINUS_MINUS
})) {
this->nextToken();
PostfixNode* node = new PostfixNode();
node->operand = left;
node->Operator = currentToken.type;
return node;
}
uint16_t precedence = currentToken.getPowerOperator(); uint16_t precedence = currentToken.getPowerOperator();
this->nextToken(); this->nextToken();
auto right = this->volumeExpression(precedence); auto right = this->volumeExpression(precedence);

BIN
saqut

Binary file not shown.

View File

@ -1 +1 @@
1 - 2 + 3 * 4 / 5 ++1 - b++