#ifndef PARCEL_AST_H #define PARCEL_AST_H #include #include typedef struct pac_ast pac_ast_s; typedef struct pac_ast_rule pac_ast_rule_s; typedef struct pac_ast_variant pac_ast_variant_s; typedef struct pac_ast_literal pac_ast_literal_s; typedef struct pac_ast_reference pac_ast_reference_s; typedef struct pac_ast_item pac_ast_item_s; struct pac_ast { usz_t num_rules; pac_ast_rule_s *rules; }; struct pac_ast_rule { char *name; usz_t num_variants; pac_ast_variant_s *variants; }; struct pac_ast_variant { usz_t num_items; pac_ast_item_s *items; }; // pac_ast_reference: Also called non-terminal, a reference is an item // which represents all the contents of another rule. struct pac_ast_reference { usz_t len_name; char *name; }; struct pac_ast_literal { usz_t length; char *string; }; // pac_ast_set_e: An enumeration of all sets known in Parcel's AST. // // Sets are descriptions which describe a rough format of token, like // with variable names; the format is known, but the actual name isn't. typedef enum { PAC_AST_SET_RUNE, PAC_AST_SET_WORD, PAC_AST_SET_INTEGER, PAC_AST_SET_FLOAT } pac_ast_set_e; typedef enum { PAC_AST_ITEM_INVALID = 0x00, PAC_AST_ITEM_REFERENCE, PAC_AST_ITEM_LITERAL, PAC_AST_ITEM_SET } pac_ast_item_e; struct pac_ast_item { pac_ast_item_e type; union pac_item_data { pac_ast_literal_s literal; pac_ast_set_e set; pac_ast_reference_s reference; } data; }; pac_ast_s pac_grow_ast (pac_tlist_s tokens); #endif // PARCEL_AST_H