aboutsummaryrefslogtreecommitdiff
path: root/parts/table.h
diff options
context:
space:
mode:
Diffstat (limited to 'parts/table.h')
-rw-r--r--parts/table.h50
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