3ff7cbfdd3ce8c2735cad9102e9c12e224e9cff0
[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: %x\n", key);
46 #endif
47               transition = transition_accept_new ();
48               lr1_add (data, key, symbol_new (TRUE, 0), transition);
49             }
50           else
51             {
52               lr1_push (data, key, NULL);
53             }
54         }
55       else if (item->dot == NULL)
56         {
57 #ifdef DEBUG
58           printf ("REDUCE: %x, %s\n", key,
59                   g_quark_to_string (item->lookahead->value));
60 #endif
61           transition = transition_reduce_new (item->left, item->right);
62           lr1_add (data, key, item->lookahead, transition);
63         }
64
65       l = g_list_next (l);
66
67     }
68
69   g_list_free (l);
70
71
72   l = NULL;
73   g_hash_table_foreach (val, put_key_val_on_list, (gpointer) &l);
74
75   while (l != NULL)
76     {
77
78       symbol_t* symbol;
79       symbol = (symbol_t*) l->data;
80       l = g_list_next (l);
81
82 #ifdef DEBUG
83       printf ("SHIFT: %x, %s, %x\n", key,
84               g_quark_to_string (symbol->value), l->data);
85 #endif
86       transition = transition_shift_new (l->data);
87       lr1_add (data, key, symbol, transition);
88
89       l = g_list_next (l);
90
91     }
92
93   g_list_free (l);
94
95 }
96
97 lr1_t* lr1_gen (grammar_t* grammar, symbol_t* start, nextcb cb, gpointer data)
98 {
99
100   GHashTable* first;
101   GHashTable* collection;
102   lr1_t* lr1;
103
104   lr1 = lr1_new (cb, data);
105
106   first = grammar_first (grammar);
107
108   collection = item_set_collection (grammar, first, start);
109
110   g_hash_table_foreach (collection, lr1_gen_add, lr1);
111
112   return lr1;
113
114 }