aboutsummaryrefslogtreecommitdiff
path: root/demos/generate-parser.c
diff options
context:
space:
mode:
authorkartofen <kartofen.mail.0@protonmail.com>2025-09-13 15:24:28 +0300
committerkartofen <kartofen.mail.0@protonmail.com>2025-09-13 15:24:28 +0300
commitdb1b9c8dcb0d115217a33c2fe8e0760d49143e11 (patch)
treec93743adff3d78ea066c14879b7d2bfeb3ce42fb /demos/generate-parser.c
parent46e786db9d1b48b8fbc3502e36f093b755f3e09f (diff)
ast nearly build and proper errors
Diffstat (limited to 'demos/generate-parser.c')
-rw-r--r--demos/generate-parser.c19
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);