aboutsummaryrefslogtreecommitdiffstats
path: root/src/parser.h
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-29 20:12:19 +0200
committerBad Diode <bd@badd10de.dev>2021-10-29 20:12:19 +0200
commit95709acb7f166b21f562ef3fcf8ba7cb5890d28a (patch)
tree5a3629189218d2c123228831348eae694b2a3a8a /src/parser.h
parent5ed73b695e6b463149ab0c9ae3eccb26a4ec5807 (diff)
downloadbdl-95709acb7f166b21f562ef3fcf8ba7cb5890d28a.tar.gz
bdl-95709acb7f166b21f562ef3fcf8ba7cb5890d28a.zip
Deduplicate string/symbols text for fast equality checks
Diffstat (limited to 'src/parser.h')
-rwxr-xr-xsrc/parser.h24
1 files changed, 20 insertions, 4 deletions
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 {
37typedef struct Parser { 37typedef struct Parser {
38 Token *tokens; 38 Token *tokens;
39 size_t current; 39 size_t current;
40
41 // Unique symbols and strings.
42 Object **symbols;
43 Object **strings;
40} Parser; 44} Parser;
41 45
42typedef Object* Root; 46typedef Object* Root;
43 47
48typedef struct ParserResults {
49 // All root statements.
50 Root *roots;
51
52 // Unique symbols (tracking only first occurence).
53 Object **symbols;
54
55 // Unique strings (tracking only first occurence).
56 Object **strings;
57} ParserResults;
58
44// Mimics the functionality in the Scanner functions, but for tokens. 59// Mimics the functionality in the Scanner functions, but for tokens.
45Token next_token(Parser *parser); 60Token next_token(Parser *parser);
46Token previous_token(Parser *parser); 61Token previous_token(Parser *parser);
@@ -50,20 +65,21 @@ bool has_next_token(const Parser *parser);
50 65
51// Parsing operations. 66// Parsing operations.
52Object * parse_tree(Parser *parser, Errors *errors); 67Object * parse_tree(Parser *parser, Errors *errors);
53Object * parse_symbol(Token tok); 68Object * parse_symbol(Parser *parser, Token tok);
54Object * parse_string(Token tok); 69Object * parse_string(Parser *parser, Token tok);
55Object * parse_bool(Token tok); 70Object * parse_bool(Token tok);
56Object * parse_fixnum(Token tok); 71Object * parse_fixnum(Token tok);
57Object * parse_list(Parser *parser, Errors *errors); 72Object * parse_list(Parser *parser, Errors *errors);
58Root * parse(Token *tokens, Errors *errors); 73ParserResults parse(Token *tokens, Errors *errors);
59 74
60// Object operations. 75// Object operations.
61void object_display(Object *obj); 76void object_display(Object *obj);
77bool object_equal(Object *a, Object *b);
62 78
63// Manage resources. 79// Manage resources.
64Object * object_alloc(Token tok, ObjectType type); 80Object * object_alloc(Token tok, ObjectType type);
65void object_free(Object *node); 81void object_free(Object *node);
66void free_roots(Root *roots); 82void free_parser_results(ParserResults *pr);
67 83
68// 84//
69// Helper macros. 85// Helper macros.