#ifndef FZL_ANALYZER_H #define FZL_ANALYZER_H #include #include #include #include #include #include // Analyzing context type typedef enum { FZL_AN_CTX_TYPE_UNNECESSARY, // default type FZL_AN_CTX_TYPE_FUNCTION, // when analyzing function FZL_AN_CTX_TYPE_LOOP, // when analyzing loop } fzl_an_ctx_type_t; // Inner node analyzing result descriptor typedef struct { bool error; fzl_type_t type; char *classname; } fzl_an_res_t; // Current node context descriptor typedef struct fzl_an_ctx { struct fzl_an_ctx *parent; fzl_an_ctx_type_t type; } fzl_an_ctx_t; // Analyzer descriptor typedef struct { char *warnings[256]; size_t warnings_top; char *errors[256]; size_t errors_top; fzl_symtable_t *symbols[256]; size_t symbols_top; fzl_node_t *root; fzl_an_ctx_t *ctx; } fzl_analyzer_t; // Temp container for error extern char alast_error[256]; // Allocate analyzer fzl_analyzer_t *fzl_mkanalyzer(fzl_node_t *node); // Push error to errors list bool an_push_error(fzl_analyzer_t *analyzer, fzl_token_t *tok, char *error); // Push warning to warnings list bool an_push_warning(fzl_analyzer_t *analyzer, fzl_token_t *tok, char *warning); // Analyze AST void fzl_analyze(fzl_analyzer_t *analyzer); // Free analyzer void fzl_freeanalyzer(fzl_analyzer_t *analyzer); 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_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