aboutsummaryrefslogtreecommitdiff
path: root/src/compiler/tree_parser/tree_parser.c
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2024-09-26 17:10:00 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2024-09-26 17:10:00 +0330
commit2ce72027e79a5aba03ecb4180039cd874b230c7a (patch)
treef9a99c4d241a69405a21c4212796276fda75edcb /src/compiler/tree_parser/tree_parser.c
parent3b5df1794867ccffc56ac5633af6c77a0b3952c8 (diff)
some small improvement
added \h in string (which can use hex as character)
Diffstat (limited to 'src/compiler/tree_parser/tree_parser.c')
-rw-r--r--src/compiler/tree_parser/tree_parser.c50
1 files changed, 46 insertions, 4 deletions
diff --git a/src/compiler/tree_parser/tree_parser.c b/src/compiler/tree_parser/tree_parser.c
index fd1dabb..474b6ca 100644
--- a/src/compiler/tree_parser/tree_parser.c
+++ b/src/compiler/tree_parser/tree_parser.c
@@ -3,6 +3,7 @@
#include <compiler/error_helper/error_helper.h>
#include <compiler/lexer/lexer.h>
#include <compiler/parser/parser.h>
+#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -115,6 +116,7 @@ void deleteParsedTree(ParsedTree *parsedTree) {
}
free(scope->lines);
free(scope->variables);
+ free(scope);
}
for (size_t i = 0; i < metadata->params_size; ++i) {
deleteParsedTree(metadata->params[i]->value);
@@ -546,6 +548,13 @@ ParsedTree *treeParseFunction(const ParsedNode *node, SourceCode *code,
metadata->params = a404m_malloc(0);
metadata->params_size = 0;
+ metadata->scope = a404m_malloc(sizeof(*metadata->scope));
+
+ metadata->scope->variables = a404m_malloc(0);
+ metadata->scope->variables_size = 0;
+ metadata->scope->lines = a404m_malloc(0);
+ metadata->scope->lines_size = 0;
+
for (size_t i = 0; i < params->operands_size; ++i) {
const ParsedNode *operand = params->operands[i];
TreeDefineVariableMetadata *define =
@@ -574,7 +583,8 @@ ParsedTree *treeParseFunction(const ParsedNode *node, SourceCode *code,
goto RETURN_ERROR;
return NULL;
} else {
- metadata->scope = NULL;
+ free(metadata->scope->lines);
+ metadata->scope->lines_size = 0;
}
return tree;
@@ -709,9 +719,21 @@ SizedString *nodeToString(ParsedNode const *node, SourceCode *code) {
case 'v':
c = '\v';
break;
- /*case 'u':*/ // TODO: do it
- /* c = '';*/
- /* break;*/
+ case 'h': {
+ if (iter + 2 >= strEnd) {
+ printError("Expected 2 hex characters after '\\c'", code,
+ node->strBegin, node->strEnd);
+ goto RETURN_ERROR;
+ }
+ bool isRight;
+ c = hexToInt(iter + 1, iter + 3, &isRight);
+ if (!isRight) {
+ printError("Bad hex number", code, iter + 1, iter + 3);
+ goto RETURN_ERROR;
+ }
+ iter += 2;
+ break;
+ }
default:
printError("Bad escape code '\\%s'", code, node->strBegin,
node->strEnd, *iter);
@@ -737,6 +759,26 @@ RETURN_ERROR:
return NULL;
}
+uint64_t hexToInt(char const *begin, char const *end, bool *isRight) {
+ uint64_t value = 0;
+ for (char const *iter = begin; iter < end; ++iter) {
+ value *= 16;
+ const char c = *iter;
+ if ('0' <= c && c <= '9') {
+ value += c - '0';
+ } else if ('A' <= c && c <= 'F') {
+ value += c - 'A' + 10;
+ } else if ('a' <= c && c <= 'f') {
+ value += c - 'a' + 10;
+ } else {
+ *isRight = false;
+ return value;
+ }
+ }
+ *isRight = true;
+ return value;
+}
+
void pushVariableToScope(TreeScopeMetadata *scope,
TreeDefineVariableMetadata *variable) {
size_t scope_variables_size = a404m_malloc_usable_size(scope->variables) /