#include #include #include #include "parts/symbol.h" #include "parts/table.h" size_t total_symbols; int (*symbol_is_terminal)(symbol s); int (*symbol_is_input_end)(symbol s); int (*symbol_is_valid)(symbol s); #include "parts/grammar.h" struct production *grammar; size_t total_productions; #include "util-tables.c" // _LAZY_LALR on clr does not work?? #include "slr-table.c" void *xdlsym(void *handle, char *sym) { void *r = dlsym(handle, sym); if(!r) { fprintf(stderr, "ERROR: Symbol \"%s\" was not found\n", sym); exit(1); } return r; } #define GET_VARIABLE(var, handle) \ var = *(typeof(&var))xdlsym(handle, #var) int main(int argc, char **argv) { if(argc != 2) return 1; void *handle = dlopen(argv[1], RTLD_LAZY); if(!handle) { puts(dlerror()); return 1; } GET_VARIABLE(total_symbols, handle); GET_VARIABLE(symbol_is_terminal, handle); GET_VARIABLE(symbol_is_input_end, handle); GET_VARIABLE(symbol_is_valid, handle); GET_VARIABLE(grammar, handle); GET_VARIABLE(total_productions, handle); util_tables_fill(); table_fill() && (exit(1), 1); printf("size_t total_symbols = %zu;\n", total_symbols); printf("IMPLEMENT_FUNCPTR(int, symbol_is_valid, (symbol s), {return s >= 0 && s < total_symbols;})\n"); printf("struct production _grammar[] = {\n"); grammar_print_cstyle(); printf("};\n"); printf("struct production *grammar = _grammar;"); printf("size_t total_productions = %zu;\n", total_productions); printf("struct action **table = (struct action *([])){\n", table_states, total_symbols); table_print_cstyle(); printf("};\n"); printf("size_t table_states = %zu;\n", table_states); table_free(); util_tables_free(); dlclose(handle); return 0; }