#ifndef FZL_PARSER_H #define FZL_PARSER_H #include #include #include // AST node type typedef enum { FZL_NODETYPE_BLOCK, FZL_NODETYPE_CALL, FZL_NODETYPE_LITERAL, } 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 { struct { struct fzl_node **entries; size_t entry_count; } list; }; } 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 parser void fzl_freeparser(fzl_parser_t *parser); #endif // FZL_PARSER_H