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 symbol_t* symbol_copy (symbol_t* symbol)
19 return symbol_new (symbol->terminal, symbol->value);
22 guint symbol_hash (gconstpointer data)
25 symbol = (symbol_t*) data;
26 return g_direct_hash ((gpointer)symbol->value);
29 gboolean symbol_equal (gconstpointer data1, gconstpointer data2)
33 symbol1 = (symbol_t*) data1;
34 symbol2 = (symbol_t*) data2;
35 return symbol1->value == symbol2->value &&
36 symbol1->terminal == symbol2->terminal;
42 rule = g_malloc (sizeof (rule_t));
47 void rule_append (rule_t* rule, symbol_t* right)
49 rule->right = g_list_append (rule->right, right);
52 rule_t* rule_copy (rule_t* rule)
56 new_rule = rule_new ();
60 rule_append (new_rule, symbol_copy (r->data));
66 symbol_t* rule_pop (rule_t* rule)
69 if ((r = g_list_first (rule->right)) == NULL)
71 rule->right = g_list_remove_link (r, r);
74 if (rule->right == NULL)
76 return rule->right->data;
79 void rule_delete (rule_t* rule)
82 for (l = g_list_first (rule->right); l != NULL; l = g_list_next (l))
86 g_list_free (rule->right);
90 void rules_delete (GList** list)
93 for (l = g_list_first (*list); l != NULL; l = g_list_next (l))
95 rule_delete (l->data);
101 static void grammar_init (GTypeInstance* instance, gpointer g_class)
103 Grammar* self = GRAMMAR(instance);
104 self->grammar = g_hash_table_new_full (symbol_hash, symbol_equal,
106 (GDestroyNotify) rules_delete);
109 static void grammar_finalize (GObject* obj)
112 GObject* parent_class;
115 g_hash_table_destroy (self->grammar);
116 klass = GRAMMAR_GET_CLASS(obj);
117 parent_class = g_type_class_peek_parent (klass);
118 G_OBJECT_CLASS(parent_class)->finalize (obj);
121 static void grammar_class_init (GrammarClass* klass)
123 GObjectClass* gobj_class = G_OBJECT_CLASS(klass);
124 gobj_class->finalize = grammar_finalize;
127 GType grammar_get_type ()
129 static GType type = 0;
132 static const GTypeInfo info =
134 sizeof (GrammarClass),
137 (GClassInitFunc)grammar_class_init,
144 type = g_type_register_static (G_TYPE_OBJECT, "GrammarType", &info, 0);
149 rule_t* grammar_rule_new (Grammar* grammar, symbol_t* left)
155 if (!g_hash_table_lookup_extended (grammar->grammar,
156 left, NULL, (gpointer*)&l))
158 l = g_malloc (sizeof (GList**));
160 g_hash_table_insert (grammar->grammar, left, l);
165 *l = g_list_append (*l, rule);
171 GList* grammar_get_rules (Grammar* grammar, symbol_t* left)
174 if (!g_hash_table_lookup_extended (grammar->grammar,
175 left, NULL, (gpointer*)&l))
179 return g_list_first (*l);
182 GList* grammar_get_rule (rule_t* rule)