X-Git-Url: http://git.cascardo.info/?p=cascardo%2Fgrammar.git;a=blobdiff_plain;f=grammar.c;h=d716065a6396c5e2d51aabc64d05d777d7996d38;hp=411cd64cc8c3da11b04790a05286570215f6eceb;hb=59aa417f29c790c64bc4501a8b08dd457d587e24;hpb=a84befe7a74aef0b745dc72b49788fd9ed6900b0 diff --git a/grammar.c b/grammar.c index 411cd64..d716065 100644 --- a/grammar.c +++ b/grammar.c @@ -36,6 +36,23 @@ gboolean symbol_equal (gconstpointer data1, gconstpointer data2) 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; @@ -63,6 +80,46 @@ rule_t* rule_copy (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;