Files
raddebugger/src/eval/eval_parser.h
T
2024-02-12 15:03:13 -08:00

110 lines
3.2 KiB
C

// Copyright (c) 2024 Epic Games Tools
// Licensed under the MIT license (https://opensource.org/license/mit/)
#ifndef EVAL_PARSER_H
#define EVAL_PARSER_H
////////////////////////////////
//~ rjf: Token Types
typedef enum EVAL_TokenKind
{
EVAL_TokenKind_Null,
EVAL_TokenKind_Identifier,
EVAL_TokenKind_Numeric,
EVAL_TokenKind_StringLiteral,
EVAL_TokenKind_CharLiteral,
EVAL_TokenKind_Symbol,
EVAL_TokenKind_COUNT
}
EVAL_TokenKind;
typedef struct EVAL_Token EVAL_Token;
struct EVAL_Token
{
EVAL_TokenKind kind;
Rng1U64 range;
};
typedef struct EVAL_TokenChunkNode EVAL_TokenChunkNode;
struct EVAL_TokenChunkNode
{
EVAL_TokenChunkNode *next;
EVAL_Token *v;
U64 count;
U64 cap;
};
typedef struct EVAL_TokenChunkList EVAL_TokenChunkList;
struct EVAL_TokenChunkList
{
EVAL_TokenChunkNode *first;
EVAL_TokenChunkNode *last;
U64 node_count;
U64 total_count;
};
typedef struct EVAL_TokenArray EVAL_TokenArray;
struct EVAL_TokenArray
{
EVAL_Token *v;
U64 count;
};
////////////////////////////////
//~ rjf: Parser Types
typedef struct EVAL_ParseResult EVAL_ParseResult;
struct EVAL_ParseResult
{
EVAL_Token *last_token;
EVAL_Expr *expr;
EVAL_ErrorList errors;
};
typedef struct EVAL_ParseCtx EVAL_ParseCtx;
struct EVAL_ParseCtx
{
Architecture arch;
U64 ip_voff;
RADDBGI_Parsed *rdbg;
TG_Graph *type_graph;
EVAL_String2NumMap *regs_map;
EVAL_String2NumMap *reg_alias_map;
EVAL_String2NumMap *locals_map;
EVAL_String2NumMap *member_map;
};
////////////////////////////////
//~ rjf: Globals
read_only global EVAL_String2NumMap eval_string2num_map_nil = {0};
read_only global EVAL_String2ExprMap eval_string2expr_map_nil = {0};
global read_only EVAL_ParseResult eval_parse_result_nil = {0, &eval_expr_nil};
////////////////////////////////
//~ rjf: Debug-Info-Driven Map Building Fast Paths
internal EVAL_String2NumMap *eval_push_locals_map_from_raddbgi_voff(Arena *arena, RADDBGI_Parsed *rdbg, U64 voff);
internal EVAL_String2NumMap *eval_push_member_map_from_raddbgi_voff(Arena *arena, RADDBGI_Parsed *rdbg, U64 voff);
////////////////////////////////
//~ rjf: Tokenization Functions
#define eval_token_at_it(it, arr) (((it) < (arr)->v+(arr)->count) ? (*(it)) : eval_token_zero())
internal EVAL_Token eval_token_zero(void);
internal void eval_token_chunk_list_push(Arena *arena, EVAL_TokenChunkList *list, U64 chunk_size, EVAL_Token *token);
internal EVAL_TokenArray eval_token_array_from_chunk_list(Arena *arena, EVAL_TokenChunkList *list);
internal EVAL_TokenArray eval_token_array_from_text(Arena *arena, String8 text);
internal EVAL_TokenArray eval_token_array_make_first_opl(EVAL_Token *first, EVAL_Token *opl);
////////////////////////////////
//~ rjf: Parser Functions
internal TG_Key eval_leaf_type_from_name(RADDBGI_Parsed *rdbg, String8 name);
internal EVAL_ParseResult eval_parse_type_from_text_tokens(Arena *arena, EVAL_ParseCtx *ctx, String8 text, EVAL_TokenArray *tokens);
internal EVAL_ParseResult eval_parse_expr_from_text_tokens__prec(Arena *arena, EVAL_ParseCtx *ctx, String8 text, EVAL_TokenArray *tokens, S64 max_precedence);
internal EVAL_ParseResult eval_parse_expr_from_text_tokens(Arena *arena, EVAL_ParseCtx *ctx, String8 text, EVAL_TokenArray *tokens);
#endif // EVAL_PARSER_H