From d7c31e44861b4d98fbddc177002e0a311a6d26af Mon Sep 17 00:00:00 2001 From: A404M Date: Wed, 7 May 2025 01:29:34 +0330 Subject: fix bugs in dereference and address and logs --- src/compiler/ast-tree.c | 32 +++++++++++++++++++++++--------- src/compiler/ast-tree.h | 29 ++++++++++++++++------------- src/compiler/lexer.c | 16 ++++++++-------- src/compiler/lexer.h | 10 +++++----- src/compiler/parser.c | 12 +++++++----- src/compiler/parser.h | 8 ++++---- src/runner/runner.c | 18 ------------------ src/utils/log.c | 4 ++-- src/utils/string.c | 4 ++-- src/utils/string.h | 4 ++-- 10 files changed, 69 insertions(+), 68 deletions(-) (limited to 'src') diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c index 676fafb..7c02209 100644 --- a/src/compiler/ast-tree.c +++ b/src/compiler/ast-tree.c @@ -320,7 +320,7 @@ void astTreePrint(const AstTree *tree, int indent) { goto RETURN_SUCCESS; case AST_TREE_TOKEN_VALUE_INT: { AstTreeInt *metadata = tree->metadata; - printf(",value=%lu", *metadata); + printf(",value=%lld", *metadata); } goto RETURN_SUCCESS; case AST_TREE_TOKEN_VALUE_FLOAT: { @@ -900,7 +900,7 @@ void astTreeRootsDestroy(AstTreeRoots roots) { } AstTree *newAstTree(AstTreeToken token, void *metadata, AstTree *type, - char *str_begin, char *str_end) { + char const *str_begin, char const *str_end) { AstTree *result = a404m_malloc(sizeof(*result)); *result = (AstTree){ .token = token, @@ -1758,8 +1758,8 @@ bool pushVariable(AstTreeHelper *helper, AstTreeVariables *variables, AstTreeVariable *variable) { if (helper->variables[0] != variables) { for (size_t j = 0; j < variables->size; ++j) { - char *var_begin = variables->data[j]->name_begin; - char *var_end = variables->data[j]->name_end; + const char *var_begin = variables->data[j]->name_begin; + const char *var_end = variables->data[j]->name_end; if (variable->name_end - variable->name_begin == var_end - var_begin && strnEquals(var_begin, variable->name_begin, @@ -1959,10 +1959,10 @@ AstTree *astTreeParse(const ParserNode *parserNode, AstTreeHelper *helper) { return astTreeParseUnaryOperator(parserNode, helper, AST_TREE_TOKEN_OPERATOR_POINTER); case PARSER_TOKEN_OPERATOR_ADDRESS: - return astTreeParseUnaryOperator(parserNode, helper, + return astTreeParseUnaryOperatorSingleChild(parserNode, helper, AST_TREE_TOKEN_OPERATOR_ADDRESS); case PARSER_TOKEN_OPERATOR_DEREFERENCE: - return astTreeParseUnaryOperator(parserNode, helper, + return astTreeParseUnaryOperatorSingleChild(parserNode, helper, AST_TREE_TOKEN_OPERATOR_DEREFERENCE); case PARSER_TOKEN_VARIABLE: return astTreeParseVariable(parserNode, helper); @@ -2467,6 +2467,20 @@ AstTree *astTreeParseUnaryOperator(const ParserNode *parserNode, parserNode->str_end); } +AstTree *astTreeParseUnaryOperatorSingleChild(const ParserNode *parserNode, + AstTreeHelper *helper, + AstTreeToken token) { + ParserNodeSingleChildMetadata *node_metadata = parserNode->metadata; + + AstTreeSingleChild *metadata = astTreeParse(node_metadata, helper); + if (metadata == NULL) { + return NULL; + } + + return newAstTree(token, metadata, NULL, parserNode->str_begin, + parserNode->str_end); +} + AstTree *astTreeParseOperateAssignOperator(const ParserNode *parserNode, AstTreeHelper *helper, AstTreeToken token) { @@ -5276,9 +5290,9 @@ bool setTypesBuiltinUnary(AstTree *tree, AstTreeSetTypesHelper helper, return false; } - char *str = functionCall->parameters[0].nameBegin; - size_t str_size = functionCall->parameters[0].nameEnd - - functionCall->parameters[0].nameBegin; + const char *str = functionCall->parameters[0].nameBegin; + const size_t str_size = functionCall->parameters[0].nameEnd - + functionCall->parameters[0].nameBegin; static char VALUE_STR[] = "value"; static size_t VALUE_STR_SIZE = diff --git a/src/compiler/ast-tree.h b/src/compiler/ast-tree.h index 74aa027..e52d8c2 100644 --- a/src/compiler/ast-tree.h +++ b/src/compiler/ast-tree.h @@ -100,8 +100,8 @@ typedef struct AstTree { AstTreeToken token; void *metadata; struct AstTree *type; - char *str_begin; - char *str_end; + char const *str_begin; + char const *str_end; } AstTree; extern AstTree AST_TREE_TYPE_TYPE; @@ -125,8 +125,8 @@ extern AstTree AST_TREE_CODE_TYPE; extern AstTree AST_TREE_VOID_VALUE; typedef struct AstTreeVariable { - char *name_begin; - char *name_end; + char const *name_begin; + char const *name_end; AstTree *type; AstTree *value; AstTree *initValue; @@ -171,10 +171,10 @@ typedef struct AstTreeFunction { } AstTreeFunction; typedef struct AstTreeTypeFunctionArgument { - char *str_begin; - char *str_end; - char *name_begin; - char *name_end; + char const *str_begin; + char const *str_end; + char const *name_begin; + char const *name_end; AstTree *type; } AstTreeTypeFunctionArgument; @@ -185,8 +185,8 @@ typedef struct AstTreeTypeFunction { } AstTreeTypeFunction; typedef struct AstTreeFunctionCallParam { - char *nameBegin; - char *nameEnd; + char const *nameBegin; + char const *nameEnd; AstTree *value; } AstTreeFunctionCallParam; @@ -251,8 +251,8 @@ typedef struct AstTreeStruct { } AstTreeStruct; typedef struct AstTreeName { - char *begin; - char *end; + char const *begin; + char const *end; } AstTreeName; typedef struct AstTreeAccess { @@ -283,7 +283,7 @@ void astTreeRootDelete(AstTreeRoot *root); void astTreeRootsDestroy(AstTreeRoots roots); AstTree *newAstTree(AstTreeToken token, void *metadata, AstTree *type, - char *str_begin, char *str_end); + char const *str_begin, char const *str_end); AstTree *copyAstTree(AstTree *tree); AstTree *copyAstTreeBack(AstTree *tree, AstTreeVariables oldVariables[], AstTreeVariables newVariables[], @@ -338,6 +338,9 @@ AstTree *astTreeParseBinaryOperator(const ParserNode *parserNode, AstTreeHelper *helper, AstTreeToken token); AstTree *astTreeParseUnaryOperator(const ParserNode *parserNode, AstTreeHelper *helper, AstTreeToken token); +AstTree *astTreeParseUnaryOperatorSingleChild(const ParserNode *parserNode, + AstTreeHelper *helper, + AstTreeToken token); AstTree *astTreeParseOperateAssignOperator(const ParserNode *parserNode, AstTreeHelper *helper, AstTreeToken token); diff --git a/src/compiler/lexer.c b/src/compiler/lexer.c index b28bd48..a766ce7 100644 --- a/src/compiler/lexer.c +++ b/src/compiler/lexer.c @@ -251,7 +251,7 @@ void lexerNodeArrayPrint(LexerNodeArray array) { void lexerNodeArrayDestroy(LexerNodeArray array) { free(array.data); } -LexerNodeArray lexer(char *str) { +LexerNodeArray lexer(const char *str) { size_t result_size = 0; LexerNodeArray result = { .data = a404m_malloc(result_size), @@ -259,8 +259,8 @@ LexerNodeArray lexer(char *str) { }; LexerToken node_token = LEXER_TOKEN_NONE; - char *node_str_begin = str; - char *iter = str; + char const *node_str_begin = str; + char const *iter = str; for (; *iter != '\0'; ++iter) { char c = *iter; if (c == '/') { @@ -280,7 +280,7 @@ LexerNodeArray lexer(char *str) { &node_token, LEXER_TOKEN_NONE); ++iter; int in = 1; - char *openingIter = iter - 2; + char const *openingIter = iter - 2; for (; in != 0; ++iter) { if (*iter == '*' && *(iter + 1) == '/') { @@ -313,7 +313,7 @@ LexerNodeArray lexer(char *str) { } lexerPushClear(&result, &result_size, iter, &node_str_begin, &node_token, token); - char *openingIter = iter; + char const *openingIter = iter; ++iter; for (;; ++iter) { if (*iter == '\0') { @@ -372,8 +372,8 @@ RETURN_SUCCESS: } inline __attribute__((always_inline)) void -lexerPushClear(LexerNodeArray *array, size_t *array_size, char *iter, - char **node_str_begin, LexerToken *node_token, +lexerPushClear(LexerNodeArray *array, size_t *array_size, char const *iter, + char const **node_str_begin, LexerToken *node_token, LexerToken token) { switch (*node_token) { case LEXER_TOKEN_IDENTIFIER: { @@ -553,7 +553,7 @@ bool isSymbol(char c) { } } -bool isCompleteSymbol(char *str, size_t str_size) { +bool isCompleteSymbol(char const *str, size_t str_size) { return searchInStringArray(LEXER_SYMBOL_STRINGS, LEXER_SYMBOL_SIZE, str, str_size) != LEXER_SYMBOL_SIZE; } diff --git a/src/compiler/lexer.h b/src/compiler/lexer.h index 7f52eaf..921b76a 100644 --- a/src/compiler/lexer.h +++ b/src/compiler/lexer.h @@ -133,8 +133,8 @@ typedef enum LexerToken { extern const char *LEXER_TOKEN_STRINGS[]; typedef struct LexerNode { - char *str_begin; - char *str_end; + char const *str_begin; + char const *str_end; struct ParserNode *parserNode; LexerToken token; } LexerNode; @@ -152,15 +152,15 @@ extern void lexerNodeArrayPrint(LexerNodeArray array); #endif extern void lexerNodeArrayDestroy(LexerNodeArray array); -extern LexerNodeArray lexer(char *str); +extern LexerNodeArray lexer(const char *str); extern void lexerPushClear(LexerNodeArray *array, size_t *array_size, - char *iter, char **node_str_begin, + const char *iter, char const **node_str_begin, LexerToken *node_token, LexerToken token); extern bool isIdentifier(char c); extern bool isNumber(char c); extern bool isSymbol(char c); -extern bool isCompleteSymbol(char *str, size_t str_size); +extern bool isCompleteSymbol(const char *str, size_t str_size); extern bool isSpace(char c); extern bool isString(char c); diff --git a/src/compiler/parser.c b/src/compiler/parser.c index 6e8283a..0d41a25 100644 --- a/src/compiler/parser.c +++ b/src/compiler/parser.c @@ -279,7 +279,7 @@ void parserNodePrint(const ParserNode *node, int indent) { goto RETURN_SUCCESS; case PARSER_TOKEN_VALUE_INT: { ParserNodeIntMetadata *metadata = node->metadata; - printf(",operand=%ld", *metadata); + printf(",operand=%lld", *metadata); } goto RETURN_SUCCESS; case PARSER_TOKEN_VALUE_FLOAT: { @@ -711,8 +711,9 @@ RETURN_SUCCESS: free(node); } -ParserNode *newParserNode(ParserToken token, char *str_begin, char *str_end, - void *metadata, ParserNode *parent) { +ParserNode *newParserNode(ParserToken token, char const *str_begin, + char const *str_end, void *metadata, + ParserNode *parent) { ParserNode *parserNode = a404m_malloc(sizeof(*parserNode)); *parserNode = (ParserNode){ .token = token, @@ -1251,7 +1252,8 @@ ParserNode *parserString(LexerNode *node, ParserNode *parent) { metadata->begin = metadata->end = a404m_malloc( sizeof(*metadata->begin) * (node->str_end - node->str_begin)); - for (char *iter = node->str_begin + 1; iter < node->str_end - 1; ++iter) { + for (char const *iter = node->str_begin + 1; iter < node->str_end - 1; + ++iter) { if (*iter == '\\') { iter += 1; bool success; @@ -2374,7 +2376,7 @@ bool isValue(ParserNode *node) { UNREACHABLE; } -char escapeChar(char *begin, char *end, bool *success) { +char escapeChar(char const *begin, char const *end, bool *success) { (void)end; switch (*begin) { case 'a': diff --git a/src/compiler/parser.h b/src/compiler/parser.h index b34b82f..1237991 100644 --- a/src/compiler/parser.h +++ b/src/compiler/parser.h @@ -117,8 +117,8 @@ typedef struct ParserOrder { typedef struct ParserNode { ParserToken token; - char *str_begin; - char *str_end; + char const *str_begin; + char const *str_end; void *metadata; struct ParserNode *parent; } ParserNode; @@ -204,7 +204,7 @@ ParserNode *parserFromPath(const char *filePath ParserNode *parser(LexerNodeArray lexed); bool parserNodeArray(LexerNode *begin, LexerNode *end, ParserNode *parent); -ParserNode *newParserNode(ParserToken token, char *str_begin, char *str_end, +ParserNode *newParserNode(ParserToken token, char const*str_begin, char const *str_end, void *metadata, ParserNode *parent); ParserNode *parseNode(LexerNode *node, LexerNode *begin, LexerNode *end, @@ -262,4 +262,4 @@ bool isExpression(ParserNode *node); bool isType(ParserNode *node); bool isValue(ParserNode *node); -char escapeChar(char *begin, char *end, bool *success); +char escapeChar(char const*begin, char const*end, bool *success); diff --git a/src/runner/runner.c b/src/runner/runner.c index e334cf1..abbd05c 100644 --- a/src/runner/runner.c +++ b/src/runner/runner.c @@ -669,24 +669,6 @@ AstTree *runAstTreeBuiltin(AstTree *tree, AstTreeScope *scope, case AST_TREE_TOKEN_TYPE_U64: *(u64 *)ret->metadata = *(u64 *)ret->metadata % *(u64 *)right->metadata; break; -#ifdef FLOAT_16_SUPPORT - case AST_TREE_TOKEN_TYPE_F16: - *(f16 *)ret->metadata = - fmodf(*(f16 *)ret->metadata, *(f16 *)right->metadata); - break; -#endif - case AST_TREE_TOKEN_TYPE_F32: - *(f32 *)ret->metadata = - fmodf(*(f32 *)ret->metadata, *(f32 *)right->metadata); - break; - case AST_TREE_TOKEN_TYPE_F64: - *(f64 *)ret->metadata = - fmod(*(f64 *)ret->metadata, *(f64 *)right->metadata); - break; - case AST_TREE_TOKEN_TYPE_F128: - *(f128 *)ret->metadata = - fmodl(*(f128 *)ret->metadata, *(f128 *)right->metadata); - break; default: UNREACHABLE; } diff --git a/src/utils/log.c b/src/utils/log.c index 54253de..6d95628 100644 --- a/src/utils/log.c +++ b/src/utils/log.c @@ -7,7 +7,7 @@ void _printLogBack(const char *format, const char *file, int line, ...) { va_list args; - va_start(args, end); + va_start(args, line); char *errorStr; vasprintf(&errorStr, format, args); @@ -18,7 +18,7 @@ void _printLogBack(const char *format, const char *file, int line, ...) { void _printErrorWarningBack(const char *file, int line, const char *begin, const char *end, bool isError, const char *format, ...) { va_list args; - va_start(args, end); + va_start(args, format); char *errorStr; vasprintf(&errorStr, format, args); diff --git a/src/utils/string.c b/src/utils/string.c index 55e6236..d05f0ec 100644 --- a/src/utils/string.c +++ b/src/utils/string.c @@ -39,7 +39,7 @@ size_t searchInStringArray(const char *array[], size_t array_size, return array_size; } -u64 decimalToU64(char *str_begin, char *str_end, bool *success) { +u64 decimalToU64(char const *str_begin, char const *str_end, bool *success) { u64 result = 0; while (str_begin < str_end) { @@ -56,7 +56,7 @@ u64 decimalToU64(char *str_begin, char *str_end, bool *success) { return result; } -f128 numberToFloat(char *str_begin, char *str_end, bool *success) { +f128 numberToFloat(char const *str_begin, char const *str_end, bool *success) { f128 left = 0; f128 right = 0; bool isPastPoint = false; diff --git a/src/utils/string.h b/src/utils/string.h index 56f6825..878311f 100644 --- a/src/utils/string.h +++ b/src/utils/string.h @@ -12,8 +12,8 @@ bool strnEquals(const char *left, const char *right, size_t len); size_t searchInStringArray(const char *array[], size_t array_size, const char *str, size_t str_size); -u64 decimalToU64(char *str_begin, char *str_end, bool *success); -f128 numberToFloat(char *str_begin, char *str_end, bool *success); +u64 decimalToU64(char const*str_begin, char const*str_end, bool *success); +f128 numberToFloat(char const*str_begin, char const*str_end, bool *success); char *u64ToString(u64 value); char *strClone(const char *str); -- cgit v1.2.3