8 symbol_t* symbol_new (gboolean terminal, gint value)
11 symbol = g_malloc (sizeof (symbol_t));
12 symbol->terminal = terminal;
13 symbol->value = value;
17 guint symbol_hash (gconstpointer data)
20 symbol = (symbol_t*) data;
21 return g_direct_hash ((gpointer)symbol->value);
24 gboolean symbol_equal (gconstpointer data1, gconstpointer data2)
28 symbol1 = (symbol_t*) data1;
29 symbol2 = (symbol_t*) data2;
30 return symbol1->value == symbol2->value &&
31 symbol1->terminal == symbol2->terminal;
37 rule = g_malloc (sizeof (rule_t));
42 void rule_append (rule_t* rule, symbol_t* right)
44 rule->right = g_list_append (rule->right, right);
47 void rule_delete (rule_t* rule)
50 for (l = g_list_first (rule->right); l != NULL; l = g_list_next (l))
54 g_list_free (rule->right);
58 void rules_delete (GList** list)
61 for (l = g_list_first (*list); l != NULL; l = g_list_next (l))
63 rule_delete (l->data);
69 static void grammar_init (GTypeInstance* instance, gpointer g_class)
71 Grammar* self = GRAMMAR(instance);
72 self->grammar = g_hash_table_new_full (symbol_hash, symbol_equal,
74 (GDestroyNotify) rules_delete);
77 static void grammar_finalize (GObject* obj)
80 GObject* parent_class;
83 g_hash_table_destroy (self->grammar);
84 klass = GRAMMAR_GET_CLASS(obj);
85 parent_class = g_type_class_peek_parent (klass);
86 G_OBJECT_CLASS(parent_class)->finalize (obj);
89 static void grammar_class_init (GrammarClass* klass)
91 GObjectClass* gobj_class = G_OBJECT_CLASS(klass);
92 gobj_class->finalize = grammar_finalize;
95 GType grammar_get_type ()
97 static GType type = 0;
100 static const GTypeInfo info =
102 sizeof (GrammarClass),
105 (GClassInitFunc)grammar_class_init,
112 type = g_type_register_static (G_TYPE_OBJECT, "GrammarType", &info, 0);
117 rule_t* grammar_rule_new (Grammar* grammar, symbol_t* left)
123 if (!g_hash_table_lookup_extended (grammar->grammar,
124 left, NULL, (gpointer*)&l))
126 l = g_malloc (sizeof (GList**));
128 g_hash_table_insert (grammar->grammar, left, l);
133 *l = g_list_append (*l, rule);
139 void grammar_rule_append (rule_t* rule, symbol_t* right)
141 rule_append (rule, right);
144 GList* grammar_get_rules (Grammar* grammar, symbol_t* left)
147 if (!g_hash_table_lookup_extended (grammar->grammar,
148 left, NULL, (gpointer*)&l))
152 return g_list_first (*l);
155 GList* grammar_get_rule (rule_t* rule)