#include #include #include #include #include #include #include #include // Analyzer main function fzl_an_res_t analyze_common(fzl_analyzer_t *analyzer, fzl_node_t *node) { if (!analyzer || !node) return (fzl_an_res_t){.error = true}; fzl_an_res_t res = {.error = false, .type = FZL_TYPE_NULL, .classname = NULL}; switch (node->type) { case FZL_NODETYPE_EXTERN: res = analyze_extern(analyzer, node); break; case FZL_NODETYPE_EXTERN_FN: res = analyze_externfn(analyzer, node); break; case FZL_NODETYPE_REFERENCE: res = analyze_ref(analyzer, node); break; case FZL_NODETYPE_STRUCT: res = analyze_struct(analyzer, node); break; case FZL_NODETYPE_ALIAS: res.type = an_toktotype(analyzer, node->token, NULL); break; case FZL_NODETYPE_HANDLE: res.type = FZL_TYPE_HANDLE; break; case FZL_NODETYPE_TYPEDEF: res = analyze_typedef(analyzer, node); break; case FZL_NODETYPE_FMT_STRING: res = analyze_strfmt(analyzer, node); break; case FZL_NODETYPE_ASSIGN: res = analyze_assign(analyzer, node); break; case FZL_NODETYPE_NOT: res = analyze_unarycond(analyzer, node); break; case FZL_NODETYPE_OR: case FZL_NODETYPE_AND: case FZL_NODETYPE_LESS: case FZL_NODETYPE_LESS_EQUAL: case FZL_NODETYPE_GREATER: case FZL_NODETYPE_GREATER_EQUAL: case FZL_NODETYPE_EQUAL: case FZL_NODETYPE_NEQUAL: res = analyze_condition(analyzer, node); break; case FZL_NODETYPE_UNARY_MINUS: case FZL_NODETYPE_UNARY_PLUS: res = analyze_unarymath(analyzer, node); break; case FZL_NODETYPE_ADD: case FZL_NODETYPE_SUB: case FZL_NODETYPE_MUL: case FZL_NODETYPE_DIV: case FZL_NODETYPE_POW: case FZL_NODETYPE_MOD: res = analyze_binmath(analyzer, node); break; case FZL_NODETYPE_BREAK: res = analyze_break(analyzer, node); break; case FZL_NODETYPE_LOOP: res = analyze_loop(analyzer, node); break; case FZL_NODETYPE_CONSTRUCT: res = analyze_construct(analyzer, node); break; case FZL_NODETYPE_DECLARATION: res = analyze_declaration(analyzer, node); break; case FZL_NODETYPE_FIELD: res = analyze_field(analyzer, node); break; case FZL_NODETYPE_CLASS: res = analyze_class(analyzer, node); break; case FZL_NODETYPE_RETURN: res = analyze_return(analyzer, node); break; case FZL_NODETYPE_FUNCTION: res = analyze_function(analyzer, node); break; case FZL_NODETYPE_CONDITIONAL: res = analyze_conditional(analyzer, node); break; case FZL_NODETYPE_IDENTIFIER: res = analyze_identifier(analyzer, node); break; case FZL_NODETYPE_BLOCK: res = analyze_block(analyzer, node); break; case FZL_NODETYPE_CALL: res = analyze_call(analyzer, node); break; case FZL_NODETYPE_LITERAL: switch (node->token->type) { case FZL_TOKTYPE_STR_LITERAL: res.type = FZL_TYPE_STRING; break; case FZL_TOKTYPE_NUM_LITERAL: res.type = FZL_TYPE_INT; break; case FZL_TOKTYPE_BOOL_LITERAL: res.type = FZL_TYPE_BOOL; break; case FZL_TOKTYPE_NULL_LITERAL: res.type = FZL_TYPE_OBJECT; res.classname = "null"; break; default: an_push_error(analyzer, node->token, "unknown literal type"); res.error = true; break; } break; } return res; }