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: %x\n", key);
47 transition = transition_accept_new ();
48 lr1_add (data, key, symbol_new (TRUE, 0), transition);
52 lr1_push (data, key, NULL);
55 else if (item->dot == NULL)
58 printf ("REDUCE: %x, %s\n", key,
59 g_quark_to_string (item->lookahead->value));
61 transition = transition_reduce_new (item->left, item->right);
62 lr1_add (data, key, item->lookahead, transition);
73 g_hash_table_foreach (val, put_key_val_on_list, (gpointer) &l);
79 symbol = (symbol_t*) l->data;
83 printf ("SHIFT: %x, %s, %x\n", key,
84 g_quark_to_string (symbol->value), l->data);
86 transition = transition_shift_new (l->data);
87 lr1_add (data, key, symbol, transition);
97 lr1_t* lr1_gen (grammar_t* grammar, symbol_t* start, nextcb cb, gpointer data)
101 GHashTable* collection;
104 lr1 = lr1_new (cb, data);
106 first = grammar_first (grammar);
108 collection = item_set_collection (grammar, first, start);
110 g_hash_table_foreach (collection, lr1_gen_add, lr1);