Merge nobobject with LR1
authorThadeu Lima de Souza Cascardo <cascardo@dcc.ufmg.br>
Thu, 20 Oct 2005 21:45:30 +0000 (21:45 +0000)
committerThadeu Lima de Souza Cascardo <cascardo@dcc.ufmg.br>
Thu, 20 Oct 2005 21:45:30 +0000 (21:45 +0000)
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

1  2 
item.c

diff --cc item.c
--- 1/item.c
--- 2/item.c
+++ b/item.c
@@@ -173,8 -181,25 +181,25 @@@ void item_set_print (GHashTable* item_s
  }
  #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;
@@@ -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);
      }
      {
        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)
      {