Added some debugging
[cascardo/grammar.git] / lr1_gen.c
1 #include <grammar.h>
2 #include <item.h>
3 #include <lr1.h>
4 #include <first.h>
5 #include <scanner.h>
6 #ifdef DEBUG
7 #include <stdio.h>
8 #endif
9
10 static void put_key_val_on_list (gpointer key, gpointer val, gpointer data)
11 {
12   GList** l;
13   l = (GList**) data;
14   *l = g_list_prepend (*l, val);
15   *l = g_list_prepend (*l, key);
16 }
17
18 static void put_key_on_list (gpointer key, gpointer val, gpointer data)
19 {
20   GList** l;
21   l = (GList**) data;
22   *l = g_list_prepend (*l, key);
23 }
24
25 void lr1_gen_add (gpointer key, gpointer val, gpointer data)
26 {
27
28   GList* l;
29   transition_t* transition;
30
31
32   l = NULL;
33   g_hash_table_foreach (key, put_key_on_list, (gpointer) &l);
34
35   while (l != NULL)
36     {
37       item_t* item;
38       item = (item_t*) l->data;
39
40       if (item->left->value == -1 && item->left->terminal == FALSE)
41         {
42           if (item->dot == NULL)
43             {
44 #ifdef DEBUG
45               printf ("ACCEPT: %p\n", key);
46 #endif
47               transition = transition_accept_new ();
48               lr1_add (data, key, symbol_new (TRUE, 0), transition);
49             }
50           else
51             {
52 #ifdef DEBUG
53               printf ("START: %p\n", key);
54 #endif
55               lr1_push (data, key, NULL);
56             }
57         }
58       else if (item->dot == NULL)
59         {
60 #ifdef DEBUG
61           printf ("REDUCE: %p, %s\n", key,
62                   g_quark_to_string (item->lookahead->value));
63 #endif
64           transition = transition_reduce_new (item->left, item->right);
65           lr1_add (data, key, item->lookahead, transition);
66         }
67
68       l = g_list_next (l);
69
70     }
71
72   g_list_free (l);
73
74
75   l = NULL;
76   g_hash_table_foreach (val, put_key_val_on_list, (gpointer) &l);
77
78   while (l != NULL)
79     {
80
81       symbol_t* symbol;
82       symbol = (symbol_t*) l->data;
83       l = g_list_next (l);
84
85 #ifdef DEBUG
86       printf ("SHIFT: %p, %s, %p\n", key,
87               g_quark_to_string (symbol->value), l->data);
88 #endif
89       transition = transition_shift_new (l->data);
90       lr1_add (data, key, symbol, transition);
91
92       l = g_list_next (l);
93
94     }
95
96   g_list_free (l);
97
98 }
99
100 lr1_t* lr1_gen (grammar_t* grammar, symbol_t* start, nextcb cb, gpointer data)
101 {
102
103   GHashTable* first;
104   GHashTable* collection;
105   lr1_t* lr1;
106
107   lr1 = lr1_new (cb, data);
108
109   first = grammar_first (grammar);
110 #ifdef DEBUG
111   first_print (first);
112 #endif
113
114   collection = item_set_collection (grammar, first, start);
115
116   g_hash_table_foreach (collection, lr1_gen_add, lr1);
117
118   return lr1;
119
120 }