symbol1->terminal == symbol2->terminal;
}
+gint symbol_cmp (symbol_t* a, symbol_t* b)
+{
+ if (a->terminal == b->terminal)
+ {
+ if (a->value < b->value)
+ return -1;
+ else if (a->value > b->value)
+ return 1;
+ return 0;
+ }
+ else if (a->terminal == FALSE)
+ {
+ return -1;
+ }
+ return 1;
+}
+
rule_t* rule_new ()
{
rule_t* rule;
return new_rule;
}
+gint rule_cmp (rule_t* a, rule_t* b)
+{
+ GList* la;
+ GList* lb;
+ la = grammar_get_rule (a);
+ lb = grammar_get_rule (b);
+ while (la != NULL && lb != NULL)
+ {
+ int c;
+ if ((c = symbol_cmp (la->data, lb->data)) != 0)
+ return c;
+ la = g_list_next (la);
+ lb = g_list_next (lb);
+ }
+ if (la == lb)
+ return 0;
+ else if (la == NULL)
+ return -1;
+ return 1;
+}
+
+gboolean rule_equal (gconstpointer data1, gconstpointer data2)
+{
+ return (rule_cmp (data1, data2) == 0);
+}
+
+guint rule_hash (gconstpointer data)
+{
+ GList* l;
+ guint hash;
+ l = grammar_get_rule (data);
+ hash = 0;
+ while (l != NULL)
+ {
+ hash = 37 * hash + symbol_hash (l->data);
+ l = g_list_next (l);
+ }
+ return hash;
+}
+
symbol_t* rule_pop (rule_t* rule)
{
GList* r;
g_free (list);
}
-static void grammar_init (GTypeInstance* instance, gpointer g_class)
-{
- Grammar* self = GRAMMAR(instance);
- self->grammar = g_hash_table_new_full (symbol_hash, symbol_equal,
- g_free,
- (GDestroyNotify) rules_delete);
-}
-
-static void grammar_finalize (GObject* obj)
+grammar_t* grammar_new ()
{
- GrammarClass* klass;
- GObject* parent_class;
- Grammar* self;
- self = GRAMMAR(obj);
- g_hash_table_destroy (self->grammar);
- klass = GRAMMAR_GET_CLASS(obj);
- parent_class = g_type_class_peek_parent (klass);
- G_OBJECT_CLASS(parent_class)->finalize (obj);
+ grammar_t* grammar;
+ grammar = g_malloc (sizeof (grammar_t*));
+ grammar->grammar = g_hash_table_new_full (symbol_hash, symbol_equal,
+ g_free,
+ (GDestroyNotify) rules_delete);
+ return grammar;
}
-static void grammar_class_init (GrammarClass* klass)
+void grammar_delete (grammar_t* grammar)
{
- GObjectClass* gobj_class = G_OBJECT_CLASS(klass);
- gobj_class->finalize = grammar_finalize;
-}
-
-GType grammar_get_type ()
-{
- static GType type = 0;
- if (type == 0)
- {
- static const GTypeInfo info =
- {
- sizeof (GrammarClass),
- NULL,
- NULL,
- (GClassInitFunc)grammar_class_init,
- NULL,
- NULL,
- sizeof (Grammar),
- 0,
- grammar_init
- };
- type = g_type_register_static (G_TYPE_OBJECT, "GrammarType", &info, 0);
- }
- return type;
+ g_hash_table_destroy (grammar->grammar);
+ g_free (grammar);
}
-rule_t* grammar_rule_new (Grammar* grammar, symbol_t* left)
+rule_t* grammar_rule_new (grammar_t* grammar, symbol_t* left)
{
GList** l;
}
-GList* grammar_get_rules (Grammar* grammar, symbol_t* left)
+GList* grammar_get_rules (grammar_t* grammar, symbol_t* left)
{
GList** l;
if (!g_hash_table_lookup_extended (grammar->grammar,