#ifndef FZL_PARSER_H #define FZL_PARSER_H #include #include #include #include // AST node type typedef enum { FZL_NODETYPE_TYPEDEF, FZL_NODETYPE_HANDLE, FZL_NODETYPE_ALIAS, FZL_NODETYPE_STRUCT, FZL_NODETYPE_REFERENCE, FZL_NODETYPE_EXTERN_FN, FZL_NODETYPE_EXTERN, FZL_NODETYPE_BLOCK, FZL_NODETYPE_LITERAL, FZL_NODETYPE_FMT_STRING, FZL_NODETYPE_IDENTIFIER, FZL_NODETYPE_CONDITIONAL, FZL_NODETYPE_FUNCTION, FZL_NODETYPE_RETURN, FZL_NODETYPE_CALL, FZL_NODETYPE_CLASS, FZL_NODETYPE_FIELD, FZL_NODETYPE_CONSTRUCT, FZL_NODETYPE_LOOP, FZL_NODETYPE_BREAK, FZL_NODETYPE_ADD, FZL_NODETYPE_SUB, FZL_NODETYPE_MUL, FZL_NODETYPE_DIV, FZL_NODETYPE_POW, FZL_NODETYPE_MOD, FZL_NODETYPE_UNARY_PLUS, FZL_NODETYPE_UNARY_MINUS, FZL_NODETYPE_OR, FZL_NODETYPE_AND, FZL_NODETYPE_EQUAL, FZL_NODETYPE_NEQUAL, FZL_NODETYPE_LESS, FZL_NODETYPE_LESS_EQUAL, FZL_NODETYPE_GREATER, FZL_NODETYPE_GREATER_EQUAL, FZL_NODETYPE_NOT, FZL_NODETYPE_DECLARATION, FZL_NODETYPE_ASSIGN } fzl_nodetype_t; // AST node descriptor typedef struct fzl_node { fzl_nodetype_t type; fzl_token_t *token; struct fzl_node *parent; struct fzl_node *next; union { // Array of nested nodes (for blocks, etc) struct { struct fzl_node **entries; size_t entry_count; } list; // Call data struct { struct fzl_node *callee; struct fzl_node **args; size_t args_count; } call; // Binary operations struct { struct fzl_node *left; struct fzl_node *right; } binary_op; // Unary operations struct { struct fzl_node *operand; } unary_op; // Variables declaration and initializing struct { fzl_token_t *type; struct fzl_node *identifier; bool is_out; } var; // Conditional blocks struct { struct fzl_node *condition; struct fzl_node *true_block; struct fzl_node *else_block; } cond; // Function declaration struct { struct fzl_node **args; size_t args_count; struct fzl_node *body; fzl_token_t *name; fzl_token_t *type; } fn; // Return value struct { struct fzl_node *value; } ret; // Class declaration struct { fzl_token_t *name; struct fzl_node **fields; size_t fields_count; struct fzl_node **methods; size_t methods_count; } class; // Member access struct { struct fzl_node *parent; struct fzl_node *field; } memb; // Object construct struct { struct fzl_node *name; } construct; // Loop struct { struct fzl_node *init; struct fzl_node *cond; struct fzl_node *step; struct fzl_node *body; } loop; // Extern library struct { char *libname; struct fzl_node **typedefs; size_t typedefs_count; struct fzl_node **fns; size_t fns_count; } ext; // Type definition struct { char *typename; struct fzl_node *type; } typedefinition; // Structure struct { char *original_name; struct fzl_node **entries; size_t entries_count; } structure; // External function struct { char *name; char *original_name; fzl_token_t *type; struct fzl_node **args; size_t args_count; } ext_fn; }; } fzl_node_t; // Token sequence parser descriptor typedef struct { fzl_reader_ll_t *first; size_t token_count; fzl_reader_ll_t *cursor; fzl_node_t *root; } fzl_parser_t; // Allocate parser fzl_parser_t *fzl_mkparser(fzl_reader_ll_t *first); // Allocate new node fzl_node_t *fzl_mknode(fzl_nodetype_t type, fzl_token_t *tok); // Parse tokens int fzl_parse(fzl_parser_t *parser); // Get last parser error char *fzl_parser_geterror(); // Free node void fzl_freenode(fzl_node_t *node); // Free entire AST going from root node void fzl_freeast(fzl_node_t *root); // Free parser void fzl_freeparser(fzl_parser_t *parser); #endif // FZL_PARSER_H