4 rdp_t* rdp_new (nextcb cb, gpointer data, gint value)
9 parser = g_malloc (sizeof (rdp_t));
12 parser->start = symbol_new (FALSE, value);
16 parser->buffer = g_list_append (NULL, NULL);
22 void rdp_delete (rdp_t* parser)
25 g_free (parser->start);
30 gpointer leaf_new (gpointer data)
32 return g_node_new (data);
35 gpointer tree_new (rule_t* rule)
37 return g_node_new (rule);
40 gpointer tree_add (gpointer tree, gpointer data)
42 return g_node_append (tree, data);
45 void tree_delete (gpointer tree)
47 g_node_destroy (tree);
50 symbol_t* buffer_next (rdp_t* parser, gpointer* attrib)
55 if (parser->buffer->next == NULL)
57 buffer = g_malloc (sizeof (buffer_t));
58 buffer->symbol = g_malloc (sizeof (symbol_t));
59 buffer->symbol->terminal = TRUE;
60 buffer->symbol->value = parser->cb (parser->data, &(buffer->attrib));
61 g_list_append (parser->buffer, buffer);
64 parser->buffer = g_list_next (parser->buffer);
65 buffer = (buffer_t*) parser->buffer->data;
68 *attrib = buffer->attrib;
70 return buffer->symbol;
74 gboolean rdp_step (rdp_t* parser, symbol_t* symbol, gpointer* attrib)
81 buffer = parser->buffer;
83 if (symbol != NULL && symbol->terminal)
86 s = buffer_next (parser, &attr);
87 if (!symbol_equal (symbol, s))
89 parser->buffer = buffer;
92 *attrib = leaf_new (attr);
96 for (l = g_list_first (parser->rules); l != NULL; l = g_list_next (l))
101 rule = (rule_t*) l->data;
103 if (symbol == NULL || symbol_equal (symbol, rule->left))
108 *attrib = tree_new (rule);
110 for (m = g_list_first (rule->right); m != NULL; m = g_list_next (m))
115 s = (symbol_t*) m->data;
117 if (!rdp_step (parser, s, &attr))
119 parser->buffer = buffer;
123 tree_add (*attrib, attr);
130 tree_delete (*attrib);
140 gpointer rdp_build (rdp_t* parser)
145 if (rdp_step (parser, parser->start, &attrib))