return symbol;
}
+symbol_t* symbol_copy (symbol_t* symbol)
+{
+ return symbol_new (symbol->terminal, symbol->value);
+}
+
guint symbol_hash (gconstpointer data)
{
symbol_t* symbol;
rule->right = g_list_append (rule->right, right);
}
+rule_t* rule_copy (rule_t* rule)
+{
+ rule_t* new_rule;
+ GList* r;
+ new_rule = rule_new ();
+ r = rule->right;
+ while (r != NULL)
+ {
+ rule_append (new_rule, symbol_copy (r->data));
+ r = g_list_next (r);
+ }
+ return new_rule;
+}
+
+symbol_t* rule_pop (rule_t* rule)
+{
+ GList* r;
+ if ((r = g_list_first (rule->right)) == NULL)
+ return NULL;
+ rule->right = g_list_remove_link (r, r);
+ g_free (r->data);
+ g_list_free (r);
+ if (rule->right == NULL)
+ return NULL;
+ return rule->right->data;
+}
+
void rule_delete (rule_t* rule)
{
GList* l;
}
-void grammar_rule_append (rule_t* rule, symbol_t* right)
-{
- rule_append (rule, right);
-}
-
GList* grammar_get_rules (Grammar* grammar, symbol_t* left)
{
GList** l;