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
<< padRight(" ",indent)
<< "BinaryExpressionNode"
<< "BinaryExpressionNode "
<< OPERATOR_MAP_STRREV.find(this->Operator)->second
<< "( "<< OPERATOR_MAP_REV.find(this->Operator)->second << " )"
<< "\n";
@ -72,4 +72,38 @@ class LiteralNode : public ASTNode
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

View File

@ -60,7 +60,7 @@ ParserToken Parser::parseToken(Token token){
}
else if(token.gettype() == "identifier")
{
pToken.type = KEYWORD_MAP.find(token.token)->second;
pToken.type = TokenType::IDENTIFIER;
}
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)
{
if (this->currentToken().type == TokenType::SVR_VOID)
@ -127,9 +131,17 @@ ASTNode * Parser::volumeExpression(uint16_t precedence)
ASTNode* left = this->volumeNullDominatorExpression();
if (!left) {
return nullptr;
}
while(1)
{
auto nextToken = this->lookehead(+1);
if (nextToken.type == TokenType::RPAREN) {
break;
}
nextToken = this->lookehead(+1);
if(precedence < nextToken.getPowerOperator())
{
this->nextToken();
@ -141,8 +153,9 @@ ASTNode * Parser::volumeExpression(uint16_t precedence)
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()
{
auto currentToken = this->currentToken();
@ -151,7 +164,19 @@ ASTNode * Parser::volumeNullDominatorExpression()
// Hata: "Beklenmedik dosya sonu, bir değer bekleniyordu!"
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({
TokenType::PLUS_PLUS,
@ -170,23 +195,40 @@ ASTNode * Parser::volumeNullDominatorExpression()
return binNode;
};
if(currentToken.is({
TokenType::NUMBER
})) {
if(currentToken.is(TokenType::NUMBER)) {
LiteralNode * lNode = new LiteralNode();
lNode->lexerToken = currentToken.token;
lNode->parserToken = currentToken;
return lNode;
}
if(currentToken.is(TokenType::IDENTIFIER)) {
IdentifierNode * iNode = new IdentifierNode();
iNode->lexerToken = currentToken.token;
iNode->parserToken = currentToken;
return iNode;
}
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)
{
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();
this->nextToken();
auto right = this->volumeExpression(precedence);

BIN
saqut

Binary file not shown.

View File

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