From 2ce72027e79a5aba03ecb4180039cd874b230c7a Mon Sep 17 00:00:00 2001 From: A404M Date: Thu, 26 Sep 2024 17:10:00 +0330 Subject: some small improvement added \h in string (which can use hex as character) --- src/compiler/tree_parser/tree_parser.c | 50 +++++++++++++++++++++++++++++++--- src/compiler/tree_parser/tree_parser.h | 2 ++ 2 files changed, 48 insertions(+), 4 deletions(-) (limited to 'src/compiler/tree_parser') 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 #include #include +#include #include #include #include @@ -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) / diff --git a/src/compiler/tree_parser/tree_parser.h b/src/compiler/tree_parser/tree_parser.h index 1eeb63d..8a9f7b5 100644 --- a/src/compiler/tree_parser/tree_parser.h +++ b/src/compiler/tree_parser/tree_parser.h @@ -1,6 +1,7 @@ #pragma once #include +#include typedef enum TreeToken { TREE_TOKEN_NONE = 0, @@ -113,6 +114,7 @@ extern TypeId getTreeExpressionType(ParsedTree *const tree); extern TypeId getType(const TreeDefineVariableMetadata *define); extern bool isType(ParsedTree *const tree); extern SizedString *nodeToString(ParsedNode const *node, SourceCode *code); +extern uint64_t hexToInt(char const*begin,char const*end,bool *isRight); extern void pushVariableToScope(TreeScopeMetadata *scope,TreeDefineVariableMetadata *variable); extern void pushLineToScope(TreeScopeMetadata *scope,ParsedTree *line); -- cgit v1.2.3