Parcel/core-parser/inc/ast.h

117 lines
3.2 KiB
C

#ifndef PARCEL_AST_H
#define PARCEL_AST_H
#include <utility.h>
#include <logger.h>
#include <tokenizer.h>
// 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;
// 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_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_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;
};
struct pac_ast_item
{
pac_ast_item_e type;
union pac_ast_item_data
{
pac_ast_literal_s literal;
pac_ast_set_e set;
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_ast_builder_s;
pac_ast_s pac_build_ast (pac_tlist_s tokens);
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_reference_with_equals_sign (pac_ast_builder_s *builder);
pac_ast_status_e pac_ast_handle_missing_item_delimiter (pac_ast_builder_s *builder);
pac_ast_status_e pac_ast_handle_missing_equals_sign_after_rule_header (pac_ast_builder_s *builder);
#endif // PARCEL_AST_H