}
#endif
-void item_set_closure_step (GHashTable* item_set, Grammar* grammar,
+ rule_t* rule_new_item (item_t* item)
+ {
+
+ rule_t* rule;
+ GList* l;
+ rule = rule_new ();
+ l = g_list_next (item->dot);
+ while (l != NULL)
+ {
+ rule_append (rule, symbol_copy (l->data));
+ l = g_list_next (l);
+ }
+ rule_append (rule, symbol_copy (item->lookahead));
+ return rule;
+
+ }
+
- item_t* item)
+void item_set_closure_step (GHashTable* item_set, grammar_t* grammar,
+ GHashTable* first, item_t* item)
{
if (item->dot != NULL)
{
}
}
- GHashTable* item_set_closure (GHashTable* item_set, grammar_t* grammar)
-GHashTable* item_set_closure (GHashTable* item_set, Grammar* grammar,
++GHashTable* item_set_closure (GHashTable* item_set, grammar_t* grammar,
+ GHashTable* first)
{
int size;
int last_size;
return item_set;
}
-GHashTable* item_set_goto (GHashTable* item_set, Grammar* grammar,
+GHashTable* item_set_goto (GHashTable* item_set, grammar_t* grammar,
- symbol_t* symbol)
+ GHashTable* first, symbol_t* symbol)
{
GList* l;
GHashTable* newitem_set;
}
#endif
-GHashTable* item_collection_goto (GHashTable* collection, Grammar* grammar,
+GHashTable* item_collection_goto (GHashTable* collection, grammar_t* grammar,
- GHashTable* item_set, symbol_t* symbol)
+ GHashTable* first, GHashTable* item_set,
+ symbol_t* symbol)
{
- state_t* state;
- state_t* goto_state;
+ GHashTable* symbols;
GHashTable* newitem_set;
GHashTable* goto_item_set;
- GHashTable* return_item_set;
+ GHashTable* old_item_set;
newitem_set = item_set_copy (item_set);
- if (!item_collection_add (collection, newitem_set))
+ if (!item_collection_add (collection, newitem_set, NULL))
{
g_hash_table_destroy (newitem_set);
}
{
return NULL;
}
- goto_item_set = item_set_goto (item_set, grammar, symbol);
+ goto_item_set = item_set_goto (item_set, grammar, first, symbol);
- if (!item_collection_add (collection, goto_item_set))
- return_item_set = NULL;
+ if (!item_collection_add (collection, goto_item_set, &old_item_set))
+ {
+ g_hash_table_insert (symbols, symbol, old_item_set);
+ g_hash_table_destroy (goto_item_set);
+ return NULL;
+ }
else
- return_item_set = goto_item_set;
- goto_state = item_collection_lookup (collection, goto_item_set);
- g_hash_table_insert (state->symbols, symbol,
- GINT_TO_POINTER (goto_state->code));
- return return_item_set;
+ {
+ g_hash_table_insert (symbols, symbol, goto_item_set);
+ return goto_item_set;
+ }
}
- void item_set_collection (grammar_t* grammar, symbol_t* start)
-void item_set_collection (Grammar* grammar, GHashTable* first, symbol_t* start)
++void item_set_collection (grammar_t* grammar, GHashTable* first, symbol_t* start)
{
GHashTable* collection;
GHashTable* item_set;
GList* new_item_sets;
rule = rule_new ();
rule_append (rule, symbol_copy (start));
- item = item_new (symbol_new (FALSE, -1), rule);
+ item = item_new (symbol_new (FALSE, -1), rule, symbol_new (TRUE, 0));
item_set = item_set_new ();
item_set_add (item_set, item);
- item_set_closure (item_set, grammar);
+ item_set_closure (item_set, grammar, first);
collection = g_hash_table_new_full (item_set_hash, item_set_equal,
g_hash_table_destroy, NULL);
- item_collection_add (collection, item_set);
+ item_collection_add (collection, item_set, NULL);
new_item_sets = g_list_append (NULL, item_set);
while (new_item_sets != NULL)
{