10 gpointer leaf_new (gpointer data)
12 return g_node_new (data);
15 gpointer tree_new (rule_t* rule)
17 return g_node_new (rule);
20 gpointer tree_add (gpointer tree, gpointer data)
22 return g_node_append (tree, data);
25 void tree_delete (gpointer tree)
27 g_node_destroy (tree);
30 rdp_t* rdp_new (nextcb cb, gpointer data, gint value, grammar_t* grammar)
35 parser = g_malloc (sizeof (rdp_t));
39 parser->start = symbol_new (FALSE, value);
40 parser->grammar = grammar;
42 parser->buffer = g_list_append (NULL, NULL);
48 void rdp_delete (rdp_t* rdp)
53 symbol_t* buffer_next (rdp_t* parser, gpointer* attrib)
58 if (parser->buffer->next == NULL)
60 buffer = g_malloc (sizeof (buffer_t));
61 buffer->symbol = g_malloc (sizeof (symbol_t));
62 buffer->symbol->terminal = TRUE;
63 buffer->symbol->value = parser->cb (parser->data, &(buffer->attrib));
64 g_list_append (parser->buffer, buffer);
67 parser->buffer = g_list_next (parser->buffer);
68 buffer = (buffer_t*) parser->buffer->data;
71 *attrib = buffer->attrib;
73 return buffer->symbol;
77 gboolean rdp_step (rdp_t* parser, symbol_t* symbol, gpointer* attrib)
84 buffer = parser->buffer;
86 if (symbol != NULL && symbol->terminal)
89 s = buffer_next (parser, &attr);
90 if (!symbol_equal (symbol, s))
92 parser->buffer = buffer;
95 *attrib = leaf_new (attr);
99 l = grammar_get_rules (parser->grammar, symbol);
100 for (; l != NULL; l = g_list_next (l))
106 rule = (rule_t*) l->data;
109 *attrib = tree_new (symbol_copy (symbol));
111 m = grammar_get_rule (rule);
116 tree_add (*attrib, leaf_new (g_string_new ("")));
126 s = (symbol_t*) m->data;
128 if (!rdp_step (parser, s, &attr))
130 parser->buffer = buffer;
134 tree_add (*attrib, attr);
143 tree_delete (*attrib);
151 gpointer rdp_build (rdp_t* parser)
156 if (rdp_step (parser, parser->start, &attrib))