#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_outline_e: An enumeration of all outlines known to Parcel. // // Outlines are tokens of which only the rough format is known, like // with variable names; the format is known, but the actual name isn't. typedef enum { PAC_OUTLINE_RUNE, PAC_OUTLINE_WORD, PAC_OUTLINE_INTEGER, PAC_OUTLINE_FLOAT } pac_outline_e; typedef enum { PAC_AST_ITEM_INVALID = 0x00, PAC_AST_ITEM_REFERENCE, PAC_AST_ITEM_LITERAL, PAC_AST_ITEM_OUTLINE } pac_ast_item_e; struct pac_ast_item { pac_ast_item_e type; union pac_item_data { pac_ast_literal_s literal; pac_outline_e outline; pac_ast_reference_s reference; } data; }; pac_ast_s pac_grow_ast (pac_tlist_s tokens); #endif // PARCEL_AST_H