From 62b0030e4ae58aba6b570fdf63d7f08689903095 Mon Sep 17 00:00:00 2001 From: samsonium Date: Wed, 28 Oct 2026 23:24:17 +0300 Subject: [PATCH] ref: move analyzer fn defs into `compiler/iternals` --- CMakeLists.txt | 1 + include/compiler/fzl_analyzer.h | 28 ------------------ include/compiler/internals/analyzer.h | 38 +++++++++++++++++++++++++ src/compiler/analyzer/an_assign.c | 1 + src/compiler/analyzer/an_binmath.c | 1 + src/compiler/analyzer/an_block.c | 1 + src/compiler/analyzer/an_break.c | 1 + src/compiler/analyzer/an_call.c | 1 + src/compiler/analyzer/an_class.c | 1 + src/compiler/analyzer/an_common.c | 5 ++++ src/compiler/analyzer/an_condition.c | 1 + src/compiler/analyzer/an_conditional.c | 1 + src/compiler/analyzer/an_construct.c | 1 + src/compiler/analyzer/an_declaration.c | 1 + src/compiler/analyzer/an_field.c | 1 + src/compiler/analyzer/an_function.c | 1 + src/compiler/analyzer/an_identifier.c | 1 + src/compiler/analyzer/an_loop.c | 1 + src/compiler/analyzer/an_return.c | 1 + src/compiler/analyzer/an_strfmt.c | 39 ++++++++++++++++++++++++++ src/compiler/analyzer/an_unarycond.c | 1 + src/compiler/analyzer/an_unarymath.c | 1 + src/compiler/analyzer/context.c | 1 + src/compiler/fzl_analyzer.c | 1 + 24 files changed, 102 insertions(+), 28 deletions(-) create mode 100644 include/compiler/internals/analyzer.h create mode 100644 src/compiler/analyzer/an_strfmt.c diff --git a/CMakeLists.txt b/CMakeLists.txt index ba81f35..95dae20 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -44,6 +44,7 @@ add_executable(fzc src/compiler/analyzer/an_identifier.c src/compiler/analyzer/an_loop.c src/compiler/analyzer/an_return.c + src/compiler/analyzer/an_strfmt.c src/compiler/analyzer/an_unarycond.c src/compiler/analyzer/an_unarymath.c src/compiler/reader/rd_fmtstr.c diff --git a/include/compiler/fzl_analyzer.h b/include/compiler/fzl_analyzer.h index 4050ba4..56110bb 100644 --- a/include/compiler/fzl_analyzer.h +++ b/include/compiler/fzl_analyzer.h @@ -76,32 +76,4 @@ void fzl_analyze(fzl_analyzer_t *analyzer); // Free analyzer void fzl_freeanalyzer(fzl_analyzer_t *analyzer); -extern char an_problem[256]; - -bool an_is_compatible(fzl_type_t a, fzl_type_t b, char *ac, char *bc); -char *an_typetostr(fzl_type_t type, char *classname); -fzl_type_t an_toktotype(fzl_token_t *tok); - -fzl_an_res_t analyze_common(fzl_analyzer_t *analyzer, fzl_node_t *node); -fzl_an_res_t analyze_call(fzl_analyzer_t *analyzer, fzl_node_t *call_node); -fzl_an_res_t analyze_identifier(fzl_analyzer_t *analyzer, fzl_node_t *id); -fzl_an_res_t analyze_conditional(fzl_analyzer_t *analyzer, fzl_node_t *cond); -fzl_an_res_t analyze_function(fzl_analyzer_t *analyzer, fzl_node_t *fn_node); -fzl_an_res_t analyze_block(fzl_analyzer_t *analyzer, fzl_node_t *block_node); -fzl_an_res_t analyze_return(fzl_analyzer_t *analyzer, fzl_node_t *ret_node); -fzl_an_res_t analyze_class(fzl_analyzer_t *analyzer, fzl_node_t *class_node); -fzl_an_res_t analyze_field(fzl_analyzer_t *analyzer, fzl_node_t *field); -fzl_an_res_t analyze_declaration(fzl_analyzer_t *analyzer, fzl_node_t *decl); -fzl_an_res_t analyze_construct(fzl_analyzer_t *analyzer, fzl_node_t *construct); -fzl_an_res_t analyze_loop(fzl_analyzer_t *analyzer, fzl_node_t *loop_node); -fzl_an_res_t analyze_break(fzl_analyzer_t *analyzer, fzl_node_t *break_node); -fzl_an_res_t analyze_binmath(fzl_analyzer_t *analyzer, fzl_node_t *bin_node); -fzl_an_res_t analyze_unarymath(fzl_analyzer_t *analyzer, fzl_node_t *unary); -fzl_an_res_t analyze_condition(fzl_analyzer_t *analyzer, fzl_node_t *cond_node); -fzl_an_res_t analyze_unarycond(fzl_analyzer_t *analyzer, fzl_node_t *unary); -fzl_an_res_t analyze_assign(fzl_analyzer_t *analyzer, fzl_node_t *assign_node); - -fzl_an_ctx_t *an_nest_ctx(fzl_analyzer_t *analyzer, fzl_an_ctx_type_t type); -fzl_an_ctx_t *an_fin_ctx(fzl_analyzer_t *analyzer); - #endif // FZL_ANALYZER_H diff --git a/include/compiler/internals/analyzer.h b/include/compiler/internals/analyzer.h new file mode 100644 index 0000000..095a205 --- /dev/null +++ b/include/compiler/internals/analyzer.h @@ -0,0 +1,38 @@ +#ifndef INTERNALS_ANALYZER_H +#define INTERNALS_ANALYZER_H + +#include +#include +#include +#include + +extern char an_problem[256]; + +bool an_is_compatible(fzl_type_t a, fzl_type_t b, char *ac, char *bc); +char *an_typetostr(fzl_type_t type, char *classname); +fzl_type_t an_toktotype(fzl_token_t *tok); + +fzl_an_res_t analyze_common(fzl_analyzer_t *analyzer, fzl_node_t *node); +fzl_an_res_t analyze_call(fzl_analyzer_t *analyzer, fzl_node_t *call_node); +fzl_an_res_t analyze_identifier(fzl_analyzer_t *analyzer, fzl_node_t *id); +fzl_an_res_t analyze_conditional(fzl_analyzer_t *analyzer, fzl_node_t *cond); +fzl_an_res_t analyze_function(fzl_analyzer_t *analyzer, fzl_node_t *fn_node); +fzl_an_res_t analyze_block(fzl_analyzer_t *analyzer, fzl_node_t *block_node); +fzl_an_res_t analyze_return(fzl_analyzer_t *analyzer, fzl_node_t *ret_node); +fzl_an_res_t analyze_class(fzl_analyzer_t *analyzer, fzl_node_t *class_node); +fzl_an_res_t analyze_field(fzl_analyzer_t *analyzer, fzl_node_t *field); +fzl_an_res_t analyze_declaration(fzl_analyzer_t *analyzer, fzl_node_t *decl); +fzl_an_res_t analyze_construct(fzl_analyzer_t *analyzer, fzl_node_t *construct); +fzl_an_res_t analyze_loop(fzl_analyzer_t *analyzer, fzl_node_t *loop_node); +fzl_an_res_t analyze_break(fzl_analyzer_t *analyzer, fzl_node_t *break_node); +fzl_an_res_t analyze_binmath(fzl_analyzer_t *analyzer, fzl_node_t *bin_node); +fzl_an_res_t analyze_unarymath(fzl_analyzer_t *analyzer, fzl_node_t *unary); +fzl_an_res_t analyze_condition(fzl_analyzer_t *analyzer, fzl_node_t *cond_node); +fzl_an_res_t analyze_unarycond(fzl_analyzer_t *analyzer, fzl_node_t *unary); +fzl_an_res_t analyze_assign(fzl_analyzer_t *analyzer, fzl_node_t *assign_node); +fzl_an_res_t analyze_strfmt(fzl_analyzer_t *analyzer, fzl_node_t *strfmt_node); + +fzl_an_ctx_t *an_nest_ctx(fzl_analyzer_t *analyzer, fzl_an_ctx_type_t type); +fzl_an_ctx_t *an_fin_ctx(fzl_analyzer_t *analyzer); + +#endif // INTERNALS_ANALYZER_H diff --git a/src/compiler/analyzer/an_assign.c b/src/compiler/analyzer/an_assign.c index 120a6cd..28c6f34 100644 --- a/src/compiler/analyzer/an_assign.c +++ b/src/compiler/analyzer/an_assign.c @@ -1,6 +1,7 @@ #include #include #include +#include #include // Analyze assigns diff --git a/src/compiler/analyzer/an_binmath.c b/src/compiler/analyzer/an_binmath.c index 2d2f522..880c328 100644 --- a/src/compiler/analyzer/an_binmath.c +++ b/src/compiler/analyzer/an_binmath.c @@ -1,6 +1,7 @@ #include #include #include +#include #include // Analyze binary arithmetics diff --git a/src/compiler/analyzer/an_block.c b/src/compiler/analyzer/an_block.c index f4ce9be..a49972e 100644 --- a/src/compiler/analyzer/an_block.c +++ b/src/compiler/analyzer/an_block.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include diff --git a/src/compiler/analyzer/an_break.c b/src/compiler/analyzer/an_break.c index fb83f44..ebfb7df 100644 --- a/src/compiler/analyzer/an_break.c +++ b/src/compiler/analyzer/an_break.c @@ -1,6 +1,7 @@ #include #include #include +#include // Analyze break node fzl_an_res_t analyze_break(fzl_analyzer_t *analyzer, fzl_node_t *break_node) diff --git a/src/compiler/analyzer/an_call.c b/src/compiler/analyzer/an_call.c index 3776b8d..7d7048c 100644 --- a/src/compiler/analyzer/an_call.c +++ b/src/compiler/analyzer/an_call.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include diff --git a/src/compiler/analyzer/an_class.c b/src/compiler/analyzer/an_class.c index ceccd86..726bb7a 100644 --- a/src/compiler/analyzer/an_class.c +++ b/src/compiler/analyzer/an_class.c @@ -1,6 +1,7 @@ #include #include #include +#include #include #include diff --git a/src/compiler/analyzer/an_common.c b/src/compiler/analyzer/an_common.c index 7a2d077..a2baff9 100644 --- a/src/compiler/analyzer/an_common.c +++ b/src/compiler/analyzer/an_common.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include @@ -14,6 +15,10 @@ fzl_an_res_t analyze_common(fzl_analyzer_t *analyzer, fzl_node_t *node) fzl_an_res_t res = {.error = false, .type = FZL_TYPE_NULL, .classname = NULL}; switch (node->type) { + case FZL_NODETYPE_FMT_STRING: + res = analyze_strfmt(analyzer, node); + break; + case FZL_NODETYPE_ASSIGN: res = analyze_assign(analyzer, node); break; diff --git a/src/compiler/analyzer/an_condition.c b/src/compiler/analyzer/an_condition.c index 8473b54..274c085 100644 --- a/src/compiler/analyzer/an_condition.c +++ b/src/compiler/analyzer/an_condition.c @@ -1,6 +1,7 @@ #include #include #include +#include #include // Analyze binary conditional nodes diff --git a/src/compiler/analyzer/an_conditional.c b/src/compiler/analyzer/an_conditional.c index 5a4002d..3cfe488 100644 --- a/src/compiler/analyzer/an_conditional.c +++ b/src/compiler/analyzer/an_conditional.c @@ -2,6 +2,7 @@ #include #include #include +#include #include // Analyze conditional statement diff --git a/src/compiler/analyzer/an_construct.c b/src/compiler/analyzer/an_construct.c index 3529aaf..1b00756 100644 --- a/src/compiler/analyzer/an_construct.c +++ b/src/compiler/analyzer/an_construct.c @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include diff --git a/src/compiler/analyzer/an_declaration.c b/src/compiler/analyzer/an_declaration.c index 4f950dc..fcabeec 100644 --- a/src/compiler/analyzer/an_declaration.c +++ b/src/compiler/analyzer/an_declaration.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include diff --git a/src/compiler/analyzer/an_field.c b/src/compiler/analyzer/an_field.c index e231f5d..b95dc72 100644 --- a/src/compiler/analyzer/an_field.c +++ b/src/compiler/analyzer/an_field.c @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include diff --git a/src/compiler/analyzer/an_function.c b/src/compiler/analyzer/an_function.c index a555fed..90209b6 100644 --- a/src/compiler/analyzer/an_function.c +++ b/src/compiler/analyzer/an_function.c @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include diff --git a/src/compiler/analyzer/an_identifier.c b/src/compiler/analyzer/an_identifier.c index da80f41..320d16e 100644 --- a/src/compiler/analyzer/an_identifier.c +++ b/src/compiler/analyzer/an_identifier.c @@ -1,5 +1,6 @@ #include #include +#include #include #include diff --git a/src/compiler/analyzer/an_loop.c b/src/compiler/analyzer/an_loop.c index d2e1aa7..77aabbf 100644 --- a/src/compiler/analyzer/an_loop.c +++ b/src/compiler/analyzer/an_loop.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include diff --git a/src/compiler/analyzer/an_return.c b/src/compiler/analyzer/an_return.c index 543bc6f..8ebc2f5 100644 --- a/src/compiler/analyzer/an_return.c +++ b/src/compiler/analyzer/an_return.c @@ -2,6 +2,7 @@ #include #include #include +#include #include // Analyze return statement diff --git a/src/compiler/analyzer/an_strfmt.c b/src/compiler/analyzer/an_strfmt.c new file mode 100644 index 0000000..1f5d954 --- /dev/null +++ b/src/compiler/analyzer/an_strfmt.c @@ -0,0 +1,39 @@ +#include +#include +#include +#include +#include + +// Analyze format string +fzl_an_res_t analyze_strfmt(fzl_analyzer_t *analyzer, fzl_node_t *strfmt_node) +{ + if (!analyzer) + return (fzl_an_res_t){.error = true}; + + if (!strfmt_node || strfmt_node->type != FZL_NODETYPE_FMT_STRING) + { + an_push_error(analyzer, NULL, "node is not format string"); + return (fzl_an_res_t){.error = true}; + } + + for (size_t i = 0; i < strfmt_node->list.entry_count; i++) + { + fzl_node_t *node = strfmt_node->list.entries[i]; + + if (node->type != FZL_NODETYPE_LITERAL && + node->type != FZL_NODETYPE_IDENTIFIER) + { + an_push_error( + analyzer, node->token, + "format string can only contain string literals and identifiers"); + return (fzl_an_res_t){.error = true}; + } + + fzl_an_res_t node_res = analyze_common(analyzer, node); + if (node_res.error) + return (fzl_an_res_t){.error = true}; + } + + return (fzl_an_res_t){ + .error = false, .type = FZL_TYPE_STRING, .classname = NULL}; +} diff --git a/src/compiler/analyzer/an_unarycond.c b/src/compiler/analyzer/an_unarycond.c index 3a7cc68..6c57abf 100644 --- a/src/compiler/analyzer/an_unarycond.c +++ b/src/compiler/analyzer/an_unarycond.c @@ -1,6 +1,7 @@ #include #include #include +#include // Analyze unary condition fzl_an_res_t analyze_unarycond(fzl_analyzer_t *analyzer, fzl_node_t *unary) diff --git a/src/compiler/analyzer/an_unarymath.c b/src/compiler/analyzer/an_unarymath.c index 3f592aa..ff58905 100644 --- a/src/compiler/analyzer/an_unarymath.c +++ b/src/compiler/analyzer/an_unarymath.c @@ -1,6 +1,7 @@ #include #include #include +#include #include // Analyze unary arithmetic diff --git a/src/compiler/analyzer/context.c b/src/compiler/analyzer/context.c index 2c3a361..cfacfdc 100644 --- a/src/compiler/analyzer/context.c +++ b/src/compiler/analyzer/context.c @@ -1,4 +1,5 @@ #include +#include #include #include #include diff --git a/src/compiler/fzl_analyzer.c b/src/compiler/fzl_analyzer.c index 9b4603f..91a16a4 100644 --- a/src/compiler/fzl_analyzer.c +++ b/src/compiler/fzl_analyzer.c @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include