#ifndef PARCEL_AST_H #define PARCEL_AST_H #include #include #include // 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_RANGE, PAC_AST_ITEM_COLLECTION, // A collection of any of the other items which may not be interrupted by spaces. PAC_AST_ITEM_SET } pac_ast_item_e; // pac_ast_recovery_level_e: How much higher in the call stack the program // flow has to go to be able to recover. typedef enum { PAC_AST_STATUS_SUCCESS, PAC_AST_STATUS_ERROR_HANDLED, PAC_AST_STATUS_STOP_ESCALATING_IN_ITEM_PARSER, PAC_AST_STATUS_STOP_ESCALATING_IN_VARIANT_PARSER, PAC_AST_STATUS_STOP_ESCALATING_IN_RULE_PARSER, PAC_AST_STATUS_CONTINUE_AFTER_FINDING_NEXT_VARIANT, PAC_AST_STATUS_CONTINUE_AFTER_FINDING_NEXT_RULE, PAC_AST_STATUS_NOT_RECOVERABLE, PAC_AST_STATUS_UNEXPECTED_FILE_END } pac_ast_status_e; 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_string_literal pac_ast_string_literal_s; typedef struct pac_ast_reference pac_ast_reference_s; typedef struct pac_ast_collection pac_ast_collection_s; typedef struct pac_ast_item pac_ast_item_s; struct pac_ast { usz_t num_rules; pac_ast_rule_s *rules; pac_arena_s string_arena; }; 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_collection { usz_t num_items; pac_ast_item_s *items; }; struct pac_ast_string_literal { usz_t length; char *string; }; struct pac_ast_item { pac_ast_item_e type; union pac_ast_item_data { pac_ast_string_literal_s string_literal; pac_ast_set_e set; pac_ast_collection_s collection; pac_ast_reference_s reference; } data; }; typedef struct pac_ast_builder { usz_t cursor; pac_tlist_s *token_list; bool_t failed; pac_logger_s *logger; pac_arena_s string_arena; } pac_ast_builder_s; pac_ast_s pac_build_ast (pac_tlist_s tokens, pac_logger_s *logger); void pac_delete_ast (pac_ast_s ast); pac_ast_status_e pac_ast_handle_invalid_reference_name_token (pac_ast_builder_s *builder); pac_ast_status_e pac_ast_handle_missing_reference_close_tag (pac_ast_builder_s *builder); pac_ast_status_e pac_ast_handle_missing_rule_header_closing_sign (pac_ast_builder_s *builder); pac_ast_status_e pac_ast_handle_reference_with_equals_sign (pac_ast_builder_s *builder); pac_ast_status_e pac_ast_handle_missing_item_separator (pac_ast_builder_s *builder, char *rule_name, usz_t variant_index, usz_t item_index); pac_ast_status_e pac_ast_handle_missing_equals_sign_after_rule_header (pac_ast_builder_s *builder); pac_ast_status_e pac_ast_handle_unknown_item_type (pac_ast_builder_s *builder, char *rule_name, usz_t variant_index, usz_t item_index); char * pac_ast_stringify_status (pac_ast_status_e status); #endif // PARCEL_AST_H