2023-11-26 18:49:54 +00:00
|
|
|
|
|
|
|
#ifndef PARCEL_AST_H
|
|
|
|
#define PARCEL_AST_H
|
|
|
|
|
|
|
|
#include <utility.h>
|
2023-11-28 15:01:46 +00:00
|
|
|
#include <tokenizer.h>
|
2023-11-26 18:49:54 +00:00
|
|
|
|
|
|
|
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;
|
|
|
|
|
2023-11-28 15:01:46 +00:00
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
PAC_AST_ITEM_INVALID = 0x00,
|
|
|
|
PAC_AST_ITEM_REFERENCE,
|
|
|
|
PAC_AST_ITEM_LITERAL,
|
|
|
|
PAC_AST_ITEM_OUTLINE
|
|
|
|
|
|
|
|
} pac_ast_item_e;
|
|
|
|
|
2023-11-26 18:49:54 +00:00
|
|
|
struct pac_ast_item
|
|
|
|
{
|
2023-11-28 15:01:46 +00:00
|
|
|
pac_ast_item_e type;
|
2023-11-26 18:49:54 +00:00
|
|
|
union pac_item_data
|
|
|
|
{
|
|
|
|
pac_ast_literal_s literal;
|
|
|
|
pac_outline_e outline;
|
2023-11-28 15:01:46 +00:00
|
|
|
pac_ast_reference_s reference;
|
2023-11-26 18:49:54 +00:00
|
|
|
} data;
|
|
|
|
};
|
|
|
|
|
2023-11-28 15:01:46 +00:00
|
|
|
pac_ast_s pac_grow_ast (pac_tlist_s tokens);
|
|
|
|
|
2023-11-26 18:49:54 +00:00
|
|
|
#endif // PARCEL_AST_H
|