10 static void put_key_val_on_list (gpointer key, gpointer val, gpointer data)
14 *l = g_list_prepend (*l, val);
15 *l = g_list_prepend (*l, key);
18 static void put_key_on_list (gpointer key, gpointer val, gpointer data)
22 *l = g_list_prepend (*l, key);
25 void lr1_gen_add (gpointer key, gpointer val, gpointer data)
29 transition_t* transition;
33 g_hash_table_foreach (key, put_key_on_list, (gpointer) &l);
38 item = (item_t*) l->data;
40 if (item->left->value == -1 && item->left->terminal == FALSE)
42 if (item->dot == NULL)
45 printf ("ACCEPT: %p\n", key);
47 transition = transition_accept_new ();
48 lr1_add (data, key, symbol_new (TRUE, 0), transition);
53 printf ("START: %p\n", key);
55 lr1_push (data, key, NULL);
58 else if (item->dot == NULL)
61 printf ("REDUCE: %p, %s\n", key,
62 g_quark_to_string (item->lookahead->value));
64 transition = transition_reduce_new (item->left, item->right);
65 lr1_add (data, key, item->lookahead, transition);
76 g_hash_table_foreach (val, put_key_val_on_list, (gpointer) &l);
82 symbol = (symbol_t*) l->data;
86 printf ("SHIFT: %p, %s, %p\n", key,
87 g_quark_to_string (symbol->value), l->data);
89 transition = transition_shift_new (l->data);
90 lr1_add (data, key, symbol, transition);
100 lr1_t* lr1_gen (grammar_t* grammar, symbol_t* start, nextcb cb, gpointer data)
104 GHashTable* collection;
107 lr1 = lr1_new (cb, data);
109 first = grammar_first (grammar);
114 collection = item_set_collection (grammar, first, start);
116 g_hash_table_foreach (collection, lr1_gen_add, lr1);