diff options
author | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-03-27 07:11:18 +0330 |
---|---|---|
committer | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-03-27 07:11:18 +0330 |
commit | 4c7d3c1d1e71823efc47a78ef8a608ee1656b035 (patch) | |
tree | 7d76c8d28af997f13b24e80733b2580ea69ed0ae /src/compiler/parser.c | |
parent | 8712565a385fcba4734f4d89ffb3aa40a30b4120 (diff) |
add dereferencing
Diffstat (limited to 'src/compiler/parser.c')
-rw-r--r-- | src/compiler/parser.c | 38 |
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: |