summaryrefslogtreecommitdiff
path: root/src/compiler/parser.c
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2025-03-27 07:11:18 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2025-03-27 07:11:18 +0330
commit4c7d3c1d1e71823efc47a78ef8a608ee1656b035 (patch)
tree7d76c8d28af997f13b24e80733b2580ea69ed0ae /src/compiler/parser.c
parent8712565a385fcba4734f4d89ffb3aa40a30b4120 (diff)
add dereferencing
Diffstat (limited to 'src/compiler/parser.c')
-rw-r--r--src/compiler/parser.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/compiler/parser.c b/src/compiler/parser.c
index fa6e17c..17d596b 100644
--- a/src/compiler/parser.c
+++ b/src/compiler/parser.c
@@ -71,6 +71,7 @@ const char *PARSER_TOKEN_STRINGS[] = {
"PARSER_TOKEN_OPERATOR_SMALLER_OR_EQUAL",
"PARSER_TOKEN_OPERATOR_POINTER",
"PARSER_TOKEN_OPERATOR_ADDRESS",
+ "PARSER_TOKEN_OPERATOR_DEREFERENCE",
"PARSER_TOKEN_FUNCTION_DEFINITION",
@@ -108,6 +109,10 @@ static constexpr ParserOrder PARSER_ORDER[] = {
},
{
.ltr = true,
+ ORDER_ARRAY(LEXER_TOKEN_SYMBOL_DEREFERENCE, ),
+ },
+ {
+ .ltr = true,
ORDER_ARRAY(LEXER_TOKEN_SYMBOL_PLUS, LEXER_TOKEN_SYMBOL_MINUS,
LEXER_TOKEN_SYMBOL_POINTER, LEXER_TOKEN_SYMBOL_ADDRESS, ),
},
@@ -241,6 +246,7 @@ void parserNodePrint(const ParserNode *node, int indent) {
goto RETURN_SUCCESS;
case PARSER_TOKEN_OPERATOR_POINTER:
case PARSER_TOKEN_OPERATOR_ADDRESS:
+ case PARSER_TOKEN_OPERATOR_DEREFERENCE:
case PARSER_TOKEN_OPERATOR_PLUS:
case PARSER_TOKEN_OPERATOR_MINUS:
case PARSER_TOKEN_KEYWORD_PRINT_U64:
@@ -468,6 +474,7 @@ void parserNodeDelete(ParserNode *node) {
goto RETURN_SUCCESS;
case PARSER_TOKEN_OPERATOR_POINTER:
case PARSER_TOKEN_OPERATOR_ADDRESS:
+ case PARSER_TOKEN_OPERATOR_DEREFERENCE:
case PARSER_TOKEN_OPERATOR_PLUS:
case PARSER_TOKEN_OPERATOR_MINUS:
case PARSER_TOKEN_KEYWORD_PRINT_U64:
@@ -787,6 +794,12 @@ ParserNode *parseNode(LexerNode *node, LexerNode *begin, LexerNode *end,
*conti = result == NULL;
return result;
}
+ case LEXER_TOKEN_SYMBOL_DEREFERENCE: {
+ ParserNode *result = parserRightOperator(node, begin, parent,
+ PARSER_TOKEN_OPERATOR_DEREFERENCE);
+ *conti = result == NULL;
+ return result;
+ }
case LEXER_TOKEN_KEYWORD_IF:
return parserIf(node, end, parent);
case LEXER_TOKEN_KEYWORD_WHILE:
@@ -1198,6 +1211,7 @@ ParserNode *parserFunction(LexerNode *node, LexerNode *begin, LexerNode *end,
case PARSER_TOKEN_OPERATOR_MODULO_ASSIGN:
case PARSER_TOKEN_OPERATOR_POINTER:
case PARSER_TOKEN_OPERATOR_ADDRESS:
+ case PARSER_TOKEN_OPERATOR_DEREFERENCE:
case PARSER_TOKEN_OPERATOR_PLUS:
case PARSER_TOKEN_OPERATOR_MINUS:
case PARSER_TOKEN_OPERATOR_SUM:
@@ -1436,6 +1450,27 @@ ParserNode *parserLeftOperator(LexerNode *node, LexerNode *end,
(ParserNodeSingleChildMetadata *)right, parent);
}
+ParserNode *parserRightOperator(LexerNode *node, LexerNode *begin,
+ ParserNode *parent, ParserToken token) {
+ LexerNode *leftNode = node - 1;
+
+ if (leftNode < begin || leftNode->parserNode == NULL) {
+ printError(node->str_begin, node->str_end, "No operand found");
+ return NULL;
+ }
+
+ ParserNode *left = getUntilCommonParent(leftNode->parserNode, parent);
+
+ if (left == NULL) {
+ printError(node->str_begin, node->str_end, "No operand found");
+ return NULL;
+ }
+
+ return left->parent = node->parserNode =
+ newParserNode(token, node->str_begin, left->str_end,
+ (ParserNodeSingleChildMetadata *)left, parent);
+}
+
ParserNode *parserIf(LexerNode *node, LexerNode *end, ParserNode *parent) {
LexerNode *conditionNode = node + 1;
if (conditionNode >= end) {
@@ -1578,6 +1613,7 @@ bool isExpression(ParserNode *node) {
case PARSER_TOKEN_OPERATOR_MODULO_ASSIGN:
case PARSER_TOKEN_OPERATOR_POINTER:
case PARSER_TOKEN_OPERATOR_ADDRESS:
+ case PARSER_TOKEN_OPERATOR_DEREFERENCE:
case PARSER_TOKEN_OPERATOR_PLUS:
case PARSER_TOKEN_OPERATOR_MINUS:
case PARSER_TOKEN_OPERATOR_SUM:
@@ -1670,6 +1706,7 @@ bool isType(ParserNode *node) {
case PARSER_TOKEN_OPERATOR_MULTIPLY_ASSIGN:
case PARSER_TOKEN_OPERATOR_DIVIDE_ASSIGN:
case PARSER_TOKEN_OPERATOR_MODULO_ASSIGN:
+ case PARSER_TOKEN_OPERATOR_DEREFERENCE:
case PARSER_TOKEN_OPERATOR_PLUS:
case PARSER_TOKEN_OPERATOR_MINUS:
case PARSER_TOKEN_OPERATOR_SUM:
@@ -1706,6 +1743,7 @@ bool isValue(ParserNode *node) {
case PARSER_TOKEN_OPERATOR_MODULO_ASSIGN:
case PARSER_TOKEN_OPERATOR_POINTER:
case PARSER_TOKEN_OPERATOR_ADDRESS:
+ case PARSER_TOKEN_OPERATOR_DEREFERENCE:
case PARSER_TOKEN_OPERATOR_PLUS:
case PARSER_TOKEN_OPERATOR_MINUS:
case PARSER_TOKEN_OPERATOR_SUM: