diff options
author | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-03-25 04:46:20 +0330 |
---|---|---|
committer | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-03-25 04:46:20 +0330 |
commit | 3bd7d3498f12cfb8dbdf5fff7c0bc981bf8085e2 (patch) | |
tree | 0888de25c1e553896d817ca8d2c2405306b9d0ca /src/compiler/parser.c | |
parent | 0d2065dfb49ed41110155ab1c29879c09c9d3dc7 (diff) |
add pointer type
Diffstat (limited to 'src/compiler/parser.c')
-rw-r--r-- | src/compiler/parser.c | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/src/compiler/parser.c b/src/compiler/parser.c index 9d77462..327fab2 100644 --- a/src/compiler/parser.c +++ b/src/compiler/parser.c @@ -40,6 +40,7 @@ const char *PARSER_TOKEN_STRINGS[] = { "PARSER_TOKEN_KEYWORD_IF", "PARSER_TOKEN_KEYWORD_WHILE", "PARSER_TOKEN_KEYWORD_COMPTIME", + "PARSER_TOKEN_KEYWORD_NULL", "PARSER_TOKEN_CONSTANT", "PARSER_TOKEN_VARIABLE", @@ -68,6 +69,7 @@ const char *PARSER_TOKEN_STRINGS[] = { "PARSER_TOKEN_OPERATOR_SMALLER", "PARSER_TOKEN_OPERATOR_GREATER_OR_EQUAL", "PARSER_TOKEN_OPERATOR_SMALLER_OR_EQUAL", + "PARSER_TOKEN_OPERATOR_POINTER", "PARSER_TOKEN_FUNCTION_DEFINITION", @@ -97,7 +99,7 @@ static constexpr ParserOrder PARSER_ORDER[] = { LEXER_TOKEN_KEYWORD_F64, LEXER_TOKEN_KEYWORD_F128, LEXER_TOKEN_KEYWORD_U64, LEXER_TOKEN_KEYWORD_BOOL, LEXER_TOKEN_KEYWORD_TRUE, LEXER_TOKEN_KEYWORD_FALSE, - LEXER_TOKEN_NUMBER, ), + LEXER_TOKEN_KEYWORD_NULL, LEXER_TOKEN_NUMBER, ), }, { .ltr = false, @@ -105,7 +107,8 @@ static constexpr ParserOrder PARSER_ORDER[] = { }, { .ltr = true, - ORDER_ARRAY(LEXER_TOKEN_SYMBOL_PLUS, LEXER_TOKEN_SYMBOL_MINUS, ), + ORDER_ARRAY(LEXER_TOKEN_SYMBOL_PLUS, LEXER_TOKEN_SYMBOL_MINUS, + LEXER_TOKEN_SYMBOL_POINTER, ), }, { .ltr = true, @@ -195,6 +198,7 @@ void parserNodePrint(const ParserNode *node, int indent) { case PARSER_TOKEN_TYPE_F32: case PARSER_TOKEN_TYPE_F64: case PARSER_TOKEN_TYPE_F128: + case PARSER_TOKEN_KEYWORD_NULL: goto RETURN_SUCCESS; case PARSER_TOKEN_VALUE_INT: { ParserNodeIntMetadata metadata = (ParserNodeIntMetadata)node->metadata; @@ -234,6 +238,7 @@ void parserNodePrint(const ParserNode *node, int indent) { printf(" "); } goto RETURN_SUCCESS; + case PARSER_TOKEN_OPERATOR_POINTER: case PARSER_TOKEN_OPERATOR_PLUS: case PARSER_TOKEN_OPERATOR_MINUS: case PARSER_TOKEN_KEYWORD_PRINT_U64: @@ -443,6 +448,7 @@ void parserNodeDelete(ParserNode *node) { case PARSER_TOKEN_TYPE_F128: case PARSER_TOKEN_VALUE_INT: case PARSER_TOKEN_VALUE_BOOL: + case PARSER_TOKEN_KEYWORD_NULL: goto RETURN_SUCCESS; case PARSER_TOKEN_VALUE_FLOAT: { ParserNodeFloatMetadata *metadata = node->metadata; @@ -458,6 +464,7 @@ void parserNodeDelete(ParserNode *node) { free(metadata); } goto RETURN_SUCCESS; + case PARSER_TOKEN_OPERATOR_POINTER: case PARSER_TOKEN_OPERATOR_PLUS: case PARSER_TOKEN_OPERATOR_MINUS: case PARSER_TOKEN_KEYWORD_PRINT_U64: @@ -676,6 +683,8 @@ ParserNode *parseNode(LexerNode *node, LexerNode *begin, LexerNode *end, return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_F64); case LEXER_TOKEN_KEYWORD_F128: return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_F128); + case LEXER_TOKEN_KEYWORD_NULL: + return parserNoMetadata(node, parent, PARSER_TOKEN_KEYWORD_NULL); case LEXER_TOKEN_KEYWORD_PRINT_U64: return parserPrintU64(node, end, parent); case LEXER_TOKEN_KEYWORD_RETURN: @@ -762,6 +771,13 @@ ParserNode *parseNode(LexerNode *node, LexerNode *begin, LexerNode *end, *conti = result == NULL; return result; } + case LEXER_TOKEN_SYMBOL_POINTER: { + ParserNode *result = parserBinaryOrLeftOperator( + node, begin, end, parent, PARSER_TOKEN_OPERATOR_POINTER, + LEXER_TOKEN_SYMBOL_MULTIPLY); + *conti = result == NULL; + return result; + } case LEXER_TOKEN_KEYWORD_IF: return parserIf(node, end, parent); case LEXER_TOKEN_KEYWORD_WHILE: @@ -1157,6 +1173,7 @@ ParserNode *parserFunction(LexerNode *node, LexerNode *begin, LexerNode *end, case PARSER_TOKEN_TYPE_F32: case PARSER_TOKEN_TYPE_F64: case PARSER_TOKEN_TYPE_F128: + case PARSER_TOKEN_KEYWORD_NULL: case PARSER_TOKEN_KEYWORD_PRINT_U64: case PARSER_TOKEN_KEYWORD_RETURN: case PARSER_TOKEN_CONSTANT: @@ -1170,6 +1187,7 @@ ParserNode *parserFunction(LexerNode *node, LexerNode *begin, LexerNode *end, case PARSER_TOKEN_OPERATOR_MULTIPLY_ASSIGN: case PARSER_TOKEN_OPERATOR_DIVIDE_ASSIGN: case PARSER_TOKEN_OPERATOR_MODULO_ASSIGN: + case PARSER_TOKEN_OPERATOR_POINTER: case PARSER_TOKEN_OPERATOR_PLUS: case PARSER_TOKEN_OPERATOR_MINUS: case PARSER_TOKEN_OPERATOR_SUM: @@ -1527,6 +1545,7 @@ bool isExpression(ParserNode *node) { case PARSER_TOKEN_OPERATOR_MULTIPLY_ASSIGN: case PARSER_TOKEN_OPERATOR_DIVIDE_ASSIGN: case PARSER_TOKEN_OPERATOR_MODULO_ASSIGN: + case PARSER_TOKEN_OPERATOR_POINTER: case PARSER_TOKEN_OPERATOR_PLUS: case PARSER_TOKEN_OPERATOR_MINUS: case PARSER_TOKEN_OPERATOR_SUM: @@ -1562,6 +1581,7 @@ bool isExpression(ParserNode *node) { case PARSER_TOKEN_TYPE_F32: case PARSER_TOKEN_TYPE_F64: case PARSER_TOKEN_TYPE_F128: + case PARSER_TOKEN_KEYWORD_NULL: return true; case PARSER_TOKEN_ROOT: case PARSER_TOKEN_SYMBOL_EOL: @@ -1596,7 +1616,9 @@ bool isType(ParserNode *node) { case PARSER_TOKEN_FUNCTION_CALL: case PARSER_TOKEN_KEYWORD_IF: case PARSER_TOKEN_KEYWORD_COMPTIME: + case PARSER_TOKEN_OPERATOR_POINTER: return true; + case PARSER_TOKEN_KEYWORD_NULL: case PARSER_TOKEN_CONSTANT: case PARSER_TOKEN_VARIABLE: case PARSER_TOKEN_FUNCTION_DEFINITION: @@ -1649,6 +1671,7 @@ bool isValue(ParserNode *node) { case PARSER_TOKEN_OPERATOR_MULTIPLY_ASSIGN: case PARSER_TOKEN_OPERATOR_DIVIDE_ASSIGN: case PARSER_TOKEN_OPERATOR_MODULO_ASSIGN: + case PARSER_TOKEN_OPERATOR_POINTER: case PARSER_TOKEN_OPERATOR_PLUS: case PARSER_TOKEN_OPERATOR_MINUS: case PARSER_TOKEN_OPERATOR_SUM: @@ -1678,6 +1701,7 @@ bool isValue(ParserNode *node) { case PARSER_TOKEN_TYPE_F32: case PARSER_TOKEN_TYPE_F64: case PARSER_TOKEN_TYPE_F128: + case PARSER_TOKEN_KEYWORD_NULL: case PARSER_TOKEN_KEYWORD_IF: case PARSER_TOKEN_KEYWORD_COMPTIME: case PARSER_TOKEN_SYMBOL_PARENTHESIS: |