4 rdp_t* rdp_new (nextcb cb, gpointer data)
9 parser = g_malloc (sizeof (rdp_t));
15 parser->buffer = g_list_append (NULL, NULL);
21 void rdp_delete (rdp_t* parser)
28 gpointer leaf_new (gpointer data)
30 return g_node_new (data);
33 gpointer tree_new (rule_t* rule)
35 return g_node_new (rule);
38 gpointer tree_add (gpointer tree, gpointer data)
40 return g_node_append (tree, data);
43 void tree_delete (gpointer tree)
45 g_node_destroy (tree);
48 symbol_t* buffer_next (rdp_t* parser, gpointer* attrib)
53 if (parser->buffer->next == NULL)
55 buffer = g_malloc (sizeof (buffer_t));
56 buffer->symbol = g_malloc (sizeof (symbol_t));
57 buffer->symbol->terminal = TRUE;
58 buffer->symbol->value = parser->cb (parser->data, &(buffer->attrib));
59 g_list_append (parser->buffer, buffer);
62 parser->buffer = g_list_next (parser->buffer);
63 buffer = (buffer_t*) parser->buffer->data;
66 *attrib = buffer->attrib;
68 return buffer->symbol;
72 gboolean rdp_step (rdp_t* parser, symbol_t* symbol, gpointer* attrib)
79 buffer = parser->buffer;
81 if (symbol != NULL && symbol->terminal)
84 s = buffer_next (parser, &attr);
85 if (!symbol_equal (symbol, s))
87 parser->buffer = buffer;
90 *attrib = leaf_new (attr);
94 for (l = g_list_first (parser->rules); l != NULL; l = g_list_next (l))
99 rule = (rule_t*) l->data;
101 if (symbol == NULL || symbol_equal (symbol, rule->left))
106 *attrib = tree_new (rule);
108 for (m = g_list_first (rule->right); m != NULL; m = g_list_next (m))
113 s = (symbol_t*) m->data;
115 if (!rdp_step (parser, s, &attr))
117 parser->buffer = buffer;
121 tree_add (*attrib, attr);
128 tree_delete (*attrib);
138 gpointer rdp_build (rdp_t* parser)
143 if (rdp_step (parser, NULL, &attrib))