From 95709acb7f166b21f562ef3fcf8ba7cb5890d28a Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Fri, 29 Oct 2021 20:12:19 +0200 Subject: Deduplicate string/symbols text for fast equality checks --- src/parser.h | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) (limited to 'src/parser.h') diff --git a/src/parser.h b/src/parser.h index ee5febe..f438863 100755 --- a/src/parser.h +++ b/src/parser.h @@ -37,10 +37,25 @@ typedef struct Object { typedef struct Parser { Token *tokens; size_t current; + + // Unique symbols and strings. + Object **symbols; + Object **strings; } Parser; typedef Object* Root; +typedef struct ParserResults { + // All root statements. + Root *roots; + + // Unique symbols (tracking only first occurence). + Object **symbols; + + // Unique strings (tracking only first occurence). + Object **strings; +} ParserResults; + // Mimics the functionality in the Scanner functions, but for tokens. Token next_token(Parser *parser); Token previous_token(Parser *parser); @@ -50,20 +65,21 @@ bool has_next_token(const Parser *parser); // Parsing operations. Object * parse_tree(Parser *parser, Errors *errors); -Object * parse_symbol(Token tok); -Object * parse_string(Token tok); +Object * parse_symbol(Parser *parser, Token tok); +Object * parse_string(Parser *parser, Token tok); Object * parse_bool(Token tok); Object * parse_fixnum(Token tok); Object * parse_list(Parser *parser, Errors *errors); -Root * parse(Token *tokens, Errors *errors); +ParserResults parse(Token *tokens, Errors *errors); // Object operations. void object_display(Object *obj); +bool object_equal(Object *a, Object *b); // Manage resources. Object * object_alloc(Token tok, ObjectType type); void object_free(Object *node); -void free_roots(Root *roots); +void free_parser_results(ParserResults *pr); // // Helper macros. -- cgit v1.2.1