return l;
}
+
+void first_print_symbol (gpointer key, gpointer val, gpointer data)
+{
+ symbol_t* symbol;
+ symbol = (symbol_t*) key;
+ fprintf (stdout, "%s\n", g_quark_to_string (symbol->value));
+}
+
+void first_print_set (gpointer key, gpointer val, gpointer data)
+{
+ symbol_t* symbol;
+ first_set_t* first_set;
+ symbol = (symbol_t*) key;
+ first_set = (first_set_t*) val;
+ fprintf (stdout, "FIRST of %s:\n", g_quark_to_string (symbol->value));
+ if (first_set->has_empty)
+ fprintf (stdout, "empty symbol\n");
+ g_hash_table_foreach (first_set->terminals, first_print_symbol, NULL);
+}
+
+void first_print (GHashTable* first)
+{
+ g_hash_table_foreach (first, first_print_set, NULL);
+}
GHashTable* grammar_first (grammar_t*);
GList* first_get (GHashTable*, symbol_t*);
GList* first_rule (GHashTable*, rule_t*);
+void first_print (GHashTable*);
#endif
return symbols;
}
-#define HASH_ITEM_SET(item_set) (((GPOINTER_TO_INT(item_set) & 0x3f00) >> 8))
+#define HASH_ITEM_SET(item_set) (item_set)
#ifdef DEBUG
void item_collection_print_each (gpointer key, gpointer val, gpointer data)
{
GHashTable* item_set;
item_set = (GHashTable*) key;
- fprintf (stdout, "Item %x:\n", HASH_ITEM_SET(key));
+ fprintf (stdout, "Item %p:\n", HASH_ITEM_SET(key));
item_set_print (item_set);
fprintf (stdout, "\n");
}
{
symbol_t* symbol;
symbol = (symbol_t*) key;
- fprintf (stdout, "GOTO (%x, %s) =\t %x\n", HASH_ITEM_SET(data),
+ fprintf (stdout, "GOTO (%p, %s) =\t %p\n", HASH_ITEM_SET(data),
g_quark_to_string (symbol->value), HASH_ITEM_SET(val));
}
if (item->dot == NULL)
{
#ifdef DEBUG
- printf ("ACCEPT: %x\n", key);
+ printf ("ACCEPT: %p\n", key);
#endif
transition = transition_accept_new ();
lr1_add (data, key, symbol_new (TRUE, 0), transition);
}
else
{
+#ifdef DEBUG
+ printf ("START: %p\n", key);
+#endif
lr1_push (data, key, NULL);
}
}
else if (item->dot == NULL)
{
#ifdef DEBUG
- printf ("REDUCE: %x, %s\n", key,
+ printf ("REDUCE: %p, %s\n", key,
g_quark_to_string (item->lookahead->value));
#endif
transition = transition_reduce_new (item->left, item->right);
l = g_list_next (l);
#ifdef DEBUG
- printf ("SHIFT: %x, %s, %x\n", key,
+ printf ("SHIFT: %p, %s, %p\n", key,
g_quark_to_string (symbol->value), l->data);
#endif
transition = transition_shift_new (l->data);
lr1 = lr1_new (cb, data);
first = grammar_first (grammar);
+#ifdef DEBUG
+ first_print (first);
+#endif
collection = item_set_collection (grammar, first, start);