wip: working on analyzer

- Feat: add binary math analysis
- Fix: check for function context in block analysis
- Feat: add 'break' analysis
- Fix: few fixes in call analysis
- Feat: add class analysis
- Feat: add construct analysis
- Feat: add declaration analysis
- Feat: add field analysis
- Feat: add function analysis
- Feat: add loop analysis
- Ref: updated utilities and context functions
This commit is contained in:
samsonium
2026-10-27 05:18:36 +03:00
parent d7630dbb6a
commit 25991c6f15
17 changed files with 1094 additions and 30 deletions
+30 -12
View File
@@ -3,11 +3,16 @@
#include <compiler/fzl_token.h>
#include <compiler/utils/fzl_symtable.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char alast_err[256];
char aerrors[256][256];
size_t aerrors_top;
char awarnings[256][256];
size_t awarnings_top;
fzl_analyzer_t *fzl_mkanalyzer(fzl_node_t *node)
{
@@ -18,14 +23,19 @@ fzl_analyzer_t *fzl_mkanalyzer(fzl_node_t *node)
if (!analyzer)
return NULL;
analyzer->root = node;
analyzer->warnings_top = 0;
analyzer->errors_top = 0;
analyzer->symbols_top = 0;
analyzer->root = node;
analyzer->warnings_top = 0;
analyzer->errors_top = 0;
analyzer->symbols_top = 0;
analyzer->alloc_names_top = 0;
memset(analyzer->errors, 0, sizeof(analyzer->errors));
memset(analyzer->warnings, 0, sizeof(analyzer->warnings));
memset(analyzer->symbols, 0, sizeof(analyzer->symbols));
memset(analyzer->alloc_names, 0, sizeof(analyzer->alloc_names));
memset(aerrors, 0, sizeof(aerrors));
memset(awarnings, 0, sizeof(awarnings));
return analyzer;
}
@@ -35,14 +45,15 @@ bool an_push_error(fzl_analyzer_t *analyzer, fzl_token_t *tok, char *error)
if (analyzer->errors_top >= 256 || !analyzer || !error)
return false;
size_t ei = aerrors_top++;
if (tok != NULL)
snprintf(alast_error, sizeof(alast_error), "%s:%zu:%zu => %s",
snprintf(aerrors[ei], sizeof(aerrors[ei]), "'%s'(%zu:%zu) => %s",
tok->filename, tok->ln, tok->cn, error);
else
snprintf(alast_error, sizeof(alast_error), "<unknown location> => %s",
snprintf(aerrors[ei], sizeof(aerrors[ei]), "<unknown location> => %s",
error);
analyzer->errors[analyzer->errors_top++] = alast_error;
analyzer->errors[analyzer->errors_top++] = aerrors[ei];
return true;
}
@@ -51,14 +62,15 @@ bool an_push_warning(fzl_analyzer_t *analyzer, fzl_token_t *tok, char *warning)
if (analyzer->warnings_top >= 256 || !analyzer || !warning)
return false;
size_t wi = awarnings_top++;
if (tok != NULL)
snprintf(alast_error, sizeof(alast_error), "%s:%zu:%zu => %s",
snprintf(awarnings[wi], sizeof(awarnings[wi]), "'%s'(%zu:%zu) => %s",
tok->filename, tok->ln, tok->cn, warning);
else
snprintf(alast_error, sizeof(alast_error), "<unknown location> => %s",
snprintf(awarnings[wi], sizeof(awarnings[wi]), "<unknown location> => %s",
warning);
analyzer->warnings[analyzer->warnings_top++] = alast_error;
analyzer->warnings[analyzer->warnings_top++] = awarnings[wi];
return true;
}
@@ -83,7 +95,8 @@ void fzl_analyze(fzl_analyzer_t *analyzer)
current = current->next;
}
an_fin_ctx(analyzer);
for (ssize_t i = analyzer->symbols_top; i > 0; i--)
an_fin_ctx(analyzer);
}
void fzl_freeanalyzer(fzl_analyzer_t *analyzer)
@@ -91,8 +104,13 @@ void fzl_freeanalyzer(fzl_analyzer_t *analyzer)
if (!analyzer)
return;
if (analyzer->alloc_names_top > 0)
for (ssize_t i = analyzer->alloc_names_top - 1; i >= 0; i--)
free(analyzer->alloc_names[i]);
memset(analyzer->errors, 0, sizeof(analyzer->errors));
memset(analyzer->warnings, 0, sizeof(analyzer->warnings));
memset(analyzer->symbols, 0, sizeof(analyzer->symbols));
memset(analyzer->alloc_names, 0, sizeof(analyzer->alloc_names));
free(analyzer);
}