From 26a42b4a7ba077659f791208a2a7989bfdfb3663 Mon Sep 17 00:00:00 2001 From: Matthew Sotoudeh Date: Mon, 19 Feb 2024 16:41:13 -0800 Subject: playing with the C grammar --- grammars/c/disambiguate.c | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) (limited to 'grammars/c/disambiguate.c') diff --git a/grammars/c/disambiguate.c b/grammars/c/disambiguate.c index a2d69d1..403d65f 100644 --- a/grammars/c/disambiguate.c +++ b/grammars/c/disambiguate.c @@ -1,14 +1,37 @@ +struct token *TYPE_NAMES[1024]; +size_t N_TYPE_NAMES; + +void alert_parse(struct state *state) { + if (PRODUCTION_ID_TO_SYMBOL[state->production_id] == SYMBOL_TYPEDEF) { + for (struct token *t = find_token(state, 2); t->symbol != DONE_SYMBOL; t++) { + if (t->symbol == SYMBOL_IDENT) { + TYPE_NAMES[N_TYPE_NAMES++] = t; + break; + } + } + } +} + +int is_typename(struct token *token) { + if (!strcmp("int", token->string)) return 1; + for (size_t i = 0; i < N_TYPE_NAMES; i++) + if (!strcmp(TYPE_NAMES[i]->string, token->string)) + return 1; + return 0; +} + int disambiguator(struct state *old, struct state *new) { // printf("Old tree:\n"); // print_parse_tree(old, 4); // printf("New tree:\n"); // print_parse_tree(new, 4); - if (old->start_idx != new->start_idx) { - // printf("\t\tIGNORING "); print_parse_tree2(old); - // printf("\t\tVS: "); print_parse_tree2(new); - return 2; - } + if (old->production_id == PRODUCTION_DECL_STMT) + if (!is_typename(find_token(old->reasons[0], 0))) + return 1; + if (new->production_id == PRODUCTION_DECL_STMT) + if (!is_typename(find_token(new->reasons[0], 0))) + return 0; // Prefer the earlier parsings in the grammar when two entirely different // productions are taken. -- cgit v1.2.3