summaryrefslogtreecommitdiff
path: root/src/compiler/parser.c
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2025-01-27 01:25:24 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2025-01-27 01:25:24 +0330
commit64331c144518b8ab1c3cf08473771e0d3f14f67b (patch)
treec378fccbddcc4e0972a7a426b4bf464efc1129bf /src/compiler/parser.c
parentbb87887ec288f341256d324f271bac6267fc83f4 (diff)
add print_u64 to be able to print u64 numbers
Diffstat (limited to 'src/compiler/parser.c')
-rw-r--r--src/compiler/parser.c80
1 files changed, 73 insertions, 7 deletions
diff --git a/src/compiler/parser.c b/src/compiler/parser.c
index 14125cc..333d755 100644
--- a/src/compiler/parser.c
+++ b/src/compiler/parser.c
@@ -2,6 +2,7 @@
#include "compiler/lexer.h"
#include "utils/log.h"
#include "utils/memory.h"
+#include "utils/string.h"
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
@@ -12,10 +13,13 @@ const char *PARSER_TOKEN_STRINGS[] = {
"PARSER_TOKEN_IDENTIFIER",
+ "PARSER_TOKEN_VALUE_U64",
+
"PARSER_TOKEN_TYPE_FUNCTION",
"PARSER_TOKEN_TYPE_VOID",
"PARSER_TOKEN_KEYWORD_PRINT",
+ "PARSER_TOKEN_KEYWORD_PRINT_U64",
"PARSER_TOKEN_CONSTANT",
@@ -42,12 +46,13 @@ static constexpr ParserOrder PARSER_ORDER[] = {
},
{
.ltr = true,
- .size = 3,
+ .size = 4,
.data =
{
LEXER_TOKEN_SYMBOL_CLOSE_PARENTHESIS,
LEXER_TOKEN_IDENTIFIER,
LEXER_TOKEN_KEYWORD_VOID,
+ LEXER_TOKEN_NUMBER,
},
},
{
@@ -60,11 +65,12 @@ static constexpr ParserOrder PARSER_ORDER[] = {
},
{
.ltr = true,
- .size = 2,
+ .size = 3,
.data =
{
LEXER_TOKEN_SYMBOL_COLON,
LEXER_TOKEN_KEYWORD_PRINT,
+ LEXER_TOKEN_KEYWORD_PRINT_U64,
},
},
{
@@ -111,6 +117,11 @@ void parserNodePrint(const ParserNode *node, int indent) {
case PARSER_TOKEN_TYPE_VOID:
case PARSER_TOKEN_KEYWORD_PRINT:
goto RETURN_SUCCESS;
+ case PARSER_TOKEN_VALUE_U64: {
+ ParserNodeU64Metadata metadata = (ParserNodeU64Metadata)node->metadata;
+ printf(",operand=%lu", metadata);
+ }
+ goto RETURN_SUCCESS;
case PARSER_TOKEN_CONSTANT: {
const ParserNodeVariableMetadata *metadata = node->metadata;
printf(",\n");
@@ -133,9 +144,10 @@ void parserNodePrint(const ParserNode *node, int indent) {
printf(" ");
}
goto RETURN_SUCCESS;
+ case PARSER_TOKEN_KEYWORD_PRINT_U64:
case PARSER_TOKEN_SYMBOL_COMMA:
case PARSER_TOKEN_SYMBOL_EOL: {
- const ParserNodeEOLMetadata *metadata = node->metadata;
+ const ParserNodeSingleChildMetadata *metadata = node->metadata;
printf(",\n");
for (int i = 0; i < indent; ++i)
printf(" ");
@@ -233,6 +245,7 @@ void parserNodeDelete(ParserNode *node) {
case PARSER_TOKEN_IDENTIFIER:
case PARSER_TOKEN_TYPE_VOID:
case PARSER_TOKEN_KEYWORD_PRINT:
+ case PARSER_TOKEN_VALUE_U64:
goto RETURN_SUCCESS;
case PARSER_TOKEN_CONSTANT: {
ParserNodeVariableMetadata *metadata = node->metadata;
@@ -242,9 +255,10 @@ void parserNodeDelete(ParserNode *node) {
free(metadata);
}
goto RETURN_SUCCESS;
+ case PARSER_TOKEN_KEYWORD_PRINT_U64:
case PARSER_TOKEN_SYMBOL_COMMA:
case PARSER_TOKEN_SYMBOL_EOL: {
- ParserNodeEOLMetadata *metadata = node->metadata;
+ ParserNodeSingleChildMetadata *metadata = node->metadata;
parserNodeDelete(metadata);
}
goto RETURN_SUCCESS;
@@ -384,6 +398,8 @@ ParserNode *parseNode(LexerNode *node, LexerNode *begin, LexerNode *end,
return parserVoid(node, parent);
case LEXER_TOKEN_KEYWORD_PRINT:
return parserPrint(node, parent);
+ case LEXER_TOKEN_KEYWORD_PRINT_U64:
+ return parserPrintU64(node, end, parent);
case LEXER_TOKEN_SYMBOL_EOL:
return parserEol(node, begin, parent);
case LEXER_TOKEN_SYMBOL_CLOSE_PARENTHESIS:
@@ -396,8 +412,9 @@ ParserNode *parseNode(LexerNode *node, LexerNode *begin, LexerNode *end,
return parserVariable(node, begin, end, parent);
case LEXER_TOKEN_SYMBOL_COMMA:
return parserComma(node, begin, parent);
- case LEXER_TOKEN_NONE:
case LEXER_TOKEN_NUMBER:
+ return parserNumber(node, parent);
+ case LEXER_TOKEN_NONE:
case LEXER_TOKEN_SYMBOL:
case LEXER_TOKEN_SYMBOL_OPEN_PARENTHESIS:
case LEXER_TOKEN_SYMBOL_OPEN_CURLY_BRACKET:
@@ -431,6 +448,49 @@ ParserNode *parserPrint(LexerNode *node, ParserNode *parent) {
node->str_end, NULL, parent);
}
+ParserNode *parserPrintU64(LexerNode *node, LexerNode *end,
+ ParserNode *parent) {
+ LexerNode *afterNode = node + 1;
+ if (afterNode >= end) {
+ printLog("No param");
+ return NULL;
+ } else if (afterNode->parserNode == NULL) {
+ printLog("Bad param");
+ return NULL;
+ }
+
+ ParserNode *operand = getUntilCommonParent(afterNode->parserNode, parent);
+ if (operand == NULL) {
+ printLog("No param");
+ return NULL;
+ }
+
+ return operand->parent = node->parserNode = newParserNode(
+ PARSER_TOKEN_KEYWORD_PRINT_U64, node->str_begin, node->str_end,
+ (ParserNodeSingleChildMetadata *)operand, parent);
+}
+
+ParserNode *parserNumber(LexerNode *node, ParserNode *parent) {
+ ParserNode *parserNode;
+ switch (*node->str_begin) {
+ case '0':
+ printLog("Not implemented");
+ return NULL;
+ default: {
+ bool success;
+ uint64_t value = decimalToU64(node->str_begin, node->str_end, &success);
+ if (!success) {
+ printLog("Error in parsing number");
+ return NULL;
+ }
+ parserNode =
+ newParserNode(PARSER_TOKEN_VALUE_U64, node->str_begin, node->str_end,
+ (void *)(ParserNodeU64Metadata)value, parent);
+ }
+ }
+ return node->parserNode = parserNode;
+}
+
ParserNode *parserEol(LexerNode *node, LexerNode *begin, ParserNode *parent) {
LexerNode *nodeBeore = node - 1;
ParserNode *parserNodeBefore;
@@ -448,7 +508,7 @@ ParserNode *parserEol(LexerNode *node, LexerNode *begin, ParserNode *parent) {
}
ParserNode *parserNode =
newParserNode(PARSER_TOKEN_SYMBOL_EOL, node->str_begin, node->str_end,
- (ParserNodeEOLMetadata *)parserNodeBefore, parent);
+ (ParserNodeSingleChildMetadata *)parserNodeBefore, parent);
node->parserNode = parserNode;
if (parserNodeBefore != NULL) {
parserNodeBefore->parent = parserNode;
@@ -471,7 +531,7 @@ ParserNode *parserComma(LexerNode *node, LexerNode *begin, ParserNode *parent) {
}
return node->parserNode = parserNodeBefore->parent = newParserNode(
PARSER_TOKEN_SYMBOL_COMMA, node->str_begin, node->str_end,
- (ParserNodeEOLMetadata *)parserNodeBefore, parent);
+ (ParserNodeSingleChildMetadata *)parserNodeBefore, parent);
}
ParserNode *parserParenthesis(LexerNode *closing, LexerNode *begin,
@@ -742,6 +802,7 @@ bool isExpression(ParserNode *node) {
case PARSER_TOKEN_FUNCTION_DEFINITION:
case PARSER_TOKEN_KEYWORD_PRINT:
case PARSER_TOKEN_FUNCTION_CALL:
+ case PARSER_TOKEN_KEYWORD_PRINT_U64:
return true;
case PARSER_TOKEN_ROOT:
case PARSER_TOKEN_TYPE_FUNCTION:
@@ -749,6 +810,7 @@ bool isExpression(ParserNode *node) {
case PARSER_TOKEN_SYMBOL_EOL:
case PARSER_TOKEN_SYMBOL_CURLY_BRACKET:
case PARSER_TOKEN_SYMBOL_COMMA:
+ case PARSER_TOKEN_VALUE_U64:
return false;
case PARSER_TOKEN_NONE:
}
@@ -771,6 +833,8 @@ bool isType(ParserNode *node) {
case PARSER_TOKEN_SYMBOL_CURLY_BRACKET:
case PARSER_TOKEN_SYMBOL_COMMA:
case PARSER_TOKEN_FUNCTION_CALL:
+ case PARSER_TOKEN_VALUE_U64:
+ case PARSER_TOKEN_KEYWORD_PRINT_U64:
return false;
case PARSER_TOKEN_NONE:
}
@@ -782,6 +846,7 @@ bool isValue(ParserNode *node) {
switch (node->token) {
case PARSER_TOKEN_FUNCTION_DEFINITION:
case PARSER_TOKEN_FUNCTION_CALL:
+ case PARSER_TOKEN_VALUE_U64:
return true;
case PARSER_TOKEN_TYPE_VOID:
case PARSER_TOKEN_IDENTIFIER:
@@ -793,6 +858,7 @@ bool isValue(ParserNode *node) {
case PARSER_TOKEN_SYMBOL_EOL:
case PARSER_TOKEN_SYMBOL_CURLY_BRACKET:
case PARSER_TOKEN_SYMBOL_COMMA:
+ case PARSER_TOKEN_KEYWORD_PRINT_U64:
return false;
case PARSER_TOKEN_NONE:
}