diff options
| author | kartofen <kartofen.mail.0@protonmail.com> | 2025-09-13 15:24:28 +0300 |
|---|---|---|
| committer | kartofen <kartofen.mail.0@protonmail.com> | 2025-09-13 15:24:28 +0300 |
| commit | db1b9c8dcb0d115217a33c2fe8e0760d49143e11 (patch) | |
| tree | c93743adff3d78ea066c14879b7d2bfeb3ce42fb /demos/generate-parser.c | |
| parent | 46e786db9d1b48b8fbc3502e36f093b755f3e09f (diff) | |
ast nearly build and proper errors
Diffstat (limited to 'demos/generate-parser.c')
| -rw-r--r-- | demos/generate-parser.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/demos/generate-parser.c b/demos/generate-parser.c index d1391d5..e0ec5f5 100644 --- a/demos/generate-parser.c +++ b/demos/generate-parser.c @@ -20,6 +20,7 @@ int (*symbol_is_valid)(symbol s); struct production *grammar; size_t total_productions; +char *stack_item_type; char **semantic_action_str; #include "parts/precedence.h" @@ -120,6 +121,12 @@ int main(int argc, char **argv) GET_VARIABLE(symbol_is_valid, def_handle); GET_VARIABLE(grammar, def_handle); GET_VARIABLE(total_productions, def_handle); + + if(!dlsym(def_handle, "stack_item_type")) + stack_item_type = "intptr_t"; + else + GET_VARIABLE(stack_item_type, def_handle); + GET_VARIABLE(semantic_action_str, def_handle); GET_VARIABLE(precedence_defs, def_handle); GET_VARIABLE(nprecedence_defs, def_handle); @@ -162,15 +169,15 @@ int main(int argc, char **argv) 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("intptr_t __prod%zu_action(intmax_t *stack_head)\n", i); - printf("{ intptr_t v = 0;\n"); + printf("#define A(n) (*(stack_head-%zu+n))\n", grammar[i].nRHS-1); + printf("stack_item __prod%zu_action(stack_item *stack_head)\n", i); + printf("{ stack_item v = {0};\n"); puts(semantic_action_str[i]); printf("return v; }\n"); printf("#undef A\n"); } - printf("typedef intptr_t (*semantic_action_fn)(intmax_t *stack_head);\n"); + printf("typedef stack_item (*semantic_action_fn)(stack_item *stack_head);\n"); printf("semantic_action_fn *semantic_actions = (semantic_action_fn[]){\n"); for(size_t i = 0; i < total_productions; i++) @@ -186,8 +193,8 @@ int main(int argc, char **argv) printf("};\n"); printf("#include \"parts/grammar.h\"\n"); printf("#include \"parts/table.h\"\n"); - printf("#include <stdint.h>\n"); - printf("typedef intptr_t (*semantic_action_fn)(intmax_t *stack_head);\n"); + printf("typedef %s stack_item;\n", stack_item_type); + printf("typedef stack_item (*semantic_action_fn)(stack_item *stack_head);\n"); printf("extern semantic_action_fn *semantic_actions;\n"); printf("#endif\n"); set_stdout(NULL); |
