diff options
author | kartofen <mladenovnasko0@gmail.com> | 2025-07-01 00:11:29 +0300 |
---|---|---|
committer | kartofen <mladenovnasko0@gmail.com> | 2025-07-01 00:11:29 +0300 |
commit | a67266ff72280b85fed7ec498967a855a5735639 (patch) | |
tree | f53d551e49e2263b5208b9adf1d4c50943f4d59d /parts/table.h | |
parent | 7743cb4f8a06ab79a521c4346aac74b47c8ce224 (diff) |
major refactor, more modular (wow because obviously modularity is always a good thing yes), and etc
Diffstat (limited to 'parts/table.h')
-rw-r--r-- | parts/table.h | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/parts/table.h b/parts/table.h new file mode 100644 index 0000000..3b54312 --- /dev/null +++ b/parts/table.h @@ -0,0 +1,50 @@ +#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("{"); + for(size_t sym = 0; sym < total_symbols; sym++) + printf("{%d, %zu},", table[i][sym].type, table[i][sym].arg); + printf("},\n"); + } +} + +#endif |