#ifndef TABLE_H #define TABLE_H extern struct action { enum action_type { ACTION_NOT_SET = 0, ACTION_SHIFT, ACTION_GOTO, ACTION_REDUCE, ACTION_ACCEPT } type; size_t arg; } **table; extern size_t table_states; /*extern*/ int table_fill(); /*extern*/ void table_free(); void table_print(); void table_print_cstyle(); #include "symbol.h" void table_print() { printf(" "); for(size_t sym = 0; sym < total_symbols; sym++) printf("%2zu ", sym); printf("\n"); char action_to_char[] = {[ACTION_SHIFT] = 's', [ACTION_REDUCE] = 'r', [ACTION_GOTO] = 'g'}; for(size_t i = 0; i < table_states; i++) { printf("%2zu ", i); for(size_t sym = 0; sym < total_symbols; sym++) if(table[i][sym].type == ACTION_ACCEPT) printf(" a "); else if(table[i][sym].type) printf("%c%-2zu ", action_to_char[table[i][sym].type], table[i][sym].arg); else printf(" "); printf("\n"); } } void table_print_cstyle() { for(size_t i = 0; i < table_states; i++) { printf("(struct action[]){"); for(size_t sym = 0; sym < total_symbols; sym++) printf("{%d, %zu},", table[i][sym].type, table[i][sym].arg); printf("},\n"); } } #endif