diff options
author | kartofen <mladenovnasko0@gmail.com> | 2025-07-17 01:27:05 +0300 |
---|---|---|
committer | kartofen <mladenovnasko0@gmail.com> | 2025-07-17 01:27:05 +0300 |
commit | 7ccd9286bafbd01fbda67c2f234998c2e591ed2a (patch) | |
tree | 01448f5b8201ce92f684737b188599e3f227064b /demos/generate-parser.c | |
parent | 8ea8bd7e41c48be9635c29fb928fe9decc4eb112 (diff) |
Diffstat (limited to 'demos/generate-parser.c')
-rw-r--r-- | demos/generate-parser.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/demos/generate-parser.c b/demos/generate-parser.c index fad3b93..23201fa 100644 --- a/demos/generate-parser.c +++ b/demos/generate-parser.c @@ -21,6 +21,19 @@ size_t total_productions; char **semantic_action_str; +#include "parts/precedence.h" +int *precedence_symbol; +int *precedence_production; + +struct precedence_def{ + int flag; + int *list; + size_t nlist; +} *precedence_defs; +size_t nprecedence_defs; +void precedence_tables_fill(); +void precedence_tables_free(); + #include "parts/table.h" struct action **table; size_t table_states; @@ -29,6 +42,7 @@ void (*table_free)(); #include "util-tables.c" + void *xdlsym(void *handle, char *sym) { void *r = dlsym(handle, sym); @@ -106,7 +120,10 @@ int main(int argc, char **argv) GET_VARIABLE(grammar, def_handle); GET_VARIABLE(total_productions, def_handle); GET_VARIABLE(semantic_action_str, def_handle); + GET_VARIABLE(precedence_defs, def_handle); + GET_VARIABLE(nprecedence_defs, def_handle); + precedence_tables_fill(); util_tables_fill(); int r = 0; @@ -131,6 +148,13 @@ int main(int argc, char **argv) printf("};\n"); printf("size_t table_states = %zu;\n", table_states); + printf("int *precedence_symbol = (int[]){"); + for(size_t i = 0; i < total_symbols; i++) printf("%d, ", precedence_symbol[i]); + printf("};\n"); + printf("int *precedence_production = (int[]){"); + for(size_t i = 0; i < total_productions; i++) printf("%d, ", precedence_production[i]); + printf("};\n"); + for(size_t i = 0; i < total_productions; i++) { printf("#define A(n) (*(stack_head-3*%zu+3*n-1))\n", grammar[i].nRHS-1); printf("int __prod%zu_action(int *stack_head)\n", i); @@ -150,8 +174,38 @@ int main(int argc, char **argv) cleanup: table_free(); + precedence_tables_free(); util_tables_free(); + dlclose(table_handle); dlclose(def_handle); return r; } + +void precedence_tables_fill() +{ + precedence_symbol = calloc(total_symbols, sizeof(*precedence_symbol)); + precedence_production = calloc(total_productions, sizeof(*precedence_production)); + + for(size_t i = 0; i < nprecedence_defs; i++) + for(size_t j = 0; j < precedence_defs[i].nlist; j++) + if(precedence_defs[i].flag >= 0) + precedence_symbol[precedence_defs[i].list[j]] = PRECEDENCE_SET(precedence_defs[i].flag, i+1); + else + precedence_production[precedence_defs[i].list[j]] = PRECEDENCE_SET(~precedence_defs[i].flag, i+1); + + for(size_t i = 0; i < total_productions; i++) { + if(precedence_production[i]) continue; + + for(size_t j = 0; j < grammar[i].nRHS; j++) + if(precedence_symbol[grammar[i].RHS[j]]) { + precedence_production[i] = precedence_symbol[grammar[i].RHS[j]]; + break; + } + } +} +void precedence_tables_free() +{ + free(precedence_symbol); + free(precedence_production); +} |