From: Thadeu Lima de Souza Cascardo Date: Thu, 20 Oct 2005 21:45:30 +0000 (+0000) Subject: Merge nobobject with LR1 X-Git-Tag: cascardo@tlscascardo--private,libgrammatic--regular--0.1--base-0~11 X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Fgrammar.git;a=commitdiff_plain;h=66cf4081bff89b9d93856cd3bd06e57cec9043ee Merge nobobject with LR1 Patches applied: * cascardo@tlscascardo--private/libgrammatic--lr1--0.1--base-0 tag of cascardo@tlscascardo--private/libgrammatic--dev--0.1--patch-18 * cascardo@tlscascardo--private/libgrammatic--lr1--0.1--patch-1 LR1 Items with lookahead instead of LR0 items git-archimport-id: cascardo@tlscascardo--private/libgrammatic--nogobject-lr1--0.1--patch-1 --- 66cf4081bff89b9d93856cd3bd06e57cec9043ee diff --cc item.c index c089253,3eb8fe3..ef98647 --- a/item.c +++ b/item.c @@@ -173,8 -181,25 +181,25 @@@ void item_set_print (GHashTable* item_s } #endif + 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; + + } + -void item_set_closure_step (GHashTable* item_set, Grammar* grammar, +void item_set_closure_step (GHashTable* item_set, grammar_t* grammar, - item_t* item) + GHashTable* first, item_t* item) { if (item->dot != NULL) { @@@ -198,7 -236,8 +236,8 @@@ } } - 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; @@@ -220,8 -259,8 +259,8 @@@ 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; @@@ -349,15 -412,17 +388,16 @@@ void item_collection_print (GHashTable } #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); } @@@ -366,21 -431,18 +406,21 @@@ { 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; @@@ -389,13 -451,13 +429,13 @@@ 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) {