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:
+30
-12
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user