-#include "rdp.h"
+#include <rdp.h>
#include <stdlib.h>
-rdp_t* rdp_new (nextcb cb, gpointer data, gint value)
+struct _buffer
{
-
- rdp_t* parser;
-
- parser = g_malloc (sizeof (rdp_t));
- parser->cb = cb;
- parser->data = data;
- parser->start = symbol_new (FALSE, value);
-
- parser->rules = NULL;
-
- parser->buffer = g_list_append (NULL, NULL);
-
- return parser;
-
-}
-
-void rdp_delete (rdp_t* parser)
-{
-
- g_free (parser->start);
- g_free (parser);
-
-}
+ symbol_t* symbol;
+ gpointer attrib;
+};
gpointer leaf_new (gpointer data)
{
g_node_destroy (tree);
}
+rdp_t* rdp_new (nextcb cb, gpointer data, gint value, grammar_t* grammar)
+{
+
+ rdp_t* parser;
+
+ parser = g_malloc (sizeof (rdp_t));
+
+ parser->cb = cb;
+ parser->data = data;
+ parser->start = symbol_new (FALSE, value);
+ parser->grammar = grammar;
+
+ parser->buffer = g_list_append (NULL, NULL);
+
+ return parser;
+
+}
+
+void rdp_delete (rdp_t* rdp)
+{
+ g_free (rdp->start);
+}
+
symbol_t* buffer_next (rdp_t* parser, gpointer* attrib)
{
return TRUE;
}
- for (l = g_list_first (parser->rules); l != NULL; l = g_list_next (l))
+ l = grammar_get_rules (parser->grammar, symbol);
+ for (; l != NULL; l = g_list_next (l))
{
rule_t* rule;
+ GList* m;
rule = (rule_t*) l->data;
- if (symbol == NULL || symbol_equal (symbol, rule->left))
- {
-
- GList* m;
- *attrib = tree_new (rule);
+ *attrib = tree_new (symbol_copy (symbol));
- for (m = g_list_first (rule->right); m != NULL; m = g_list_next (m))
- {
+ m = grammar_get_rule (rule);
- symbol_t* s;
+ /*
+ if (m == NULL)
+ {
+ tree_add (*attrib, leaf_new (g_string_new ("")));
+ return TRUE;
+ }
+ */
- s = (symbol_t*) m->data;
+ while (m != NULL)
+ {
- if (!rdp_step (parser, s, &attr))
- {
- parser->buffer = buffer;
- break;
- }
+ symbol_t* s;
- tree_add (*attrib, attr);
+ s = (symbol_t*) m->data;
+ if (!rdp_step (parser, s, &attr))
+ {
+ parser->buffer = buffer;
+ break;
}
- if (m == NULL)
- return TRUE;
- else
- tree_delete (*attrib);
+ tree_add (*attrib, attr);
+
+ m = g_list_next (m);
}
+ if (m == NULL)
+ return TRUE;
+ else
+ tree_delete (*attrib);
+
}
return FALSE;