aboutsummaryrefslogtreecommitdiff
path: root/demos/generate-parser.c
diff options
context:
space:
mode:
authorkartofen <mladenovnasko0@gmail.com>2025-07-17 01:27:05 +0300
committerkartofen <mladenovnasko0@gmail.com>2025-07-17 01:27:05 +0300
commit7ccd9286bafbd01fbda67c2f234998c2e591ed2a (patch)
tree01448f5b8201ce92f684737b188599e3f227064b /demos/generate-parser.c
parent8ea8bd7e41c48be9635c29fb928fe9decc4eb112 (diff)
ok precedenceHEADmaster
Diffstat (limited to 'demos/generate-parser.c')
-rw-r--r--demos/generate-parser.c54
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);
+}