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 static void rdp_init (GTypeInstance* instance, gpointer g_class)
32 Rdp* self = RDP(instance);
39 static void rdp_finalize (GObject* obj)
42 GObject* parent_class;
46 klass = RDP_GET_CLASS(obj);
47 parent_class = g_type_class_peek_parent (klass);
48 G_OBJECT_CLASS(parent_class)->finalize (obj);
51 static void rdp_class_init (RdpClass* klass)
53 GObjectClass* gobj_class = G_OBJECT_CLASS(klass);
54 gobj_class->finalize = rdp_finalize;
59 static GType type = 0;
62 static const GTypeInfo info =
67 (GClassInitFunc)rdp_class_init,
74 type = g_type_register_static (GRAMMAR_TYPE, "RdpType", &info, 0);
79 Rdp* rdp_new (nextcb cb, gpointer data, gint value)
84 parser = g_object_new (RDP_TYPE, NULL);
88 parser->start = symbol_new (FALSE, value);
90 parser->buffer = g_list_append (NULL, NULL);
96 void rdp_delete (Rdp* parser)
99 g_object_unref (parser);
103 symbol_t* buffer_next (Rdp* parser, gpointer* attrib)
108 if (parser->buffer->next == NULL)
110 buffer = g_malloc (sizeof (buffer_t));
111 buffer->symbol = g_malloc (sizeof (symbol_t));
112 buffer->symbol->terminal = TRUE;
113 buffer->symbol->value = parser->cb (parser->data, &(buffer->attrib));
114 g_list_append (parser->buffer, buffer);
117 parser->buffer = g_list_next (parser->buffer);
118 buffer = (buffer_t*) parser->buffer->data;
121 *attrib = buffer->attrib;
123 return buffer->symbol;
127 gboolean rdp_step (Rdp* parser, symbol_t* symbol, gpointer* attrib)
134 buffer = parser->buffer;
136 if (symbol != NULL && symbol->terminal)
139 s = buffer_next (parser, &attr);
140 if (!symbol_equal (symbol, s))
142 parser->buffer = buffer;
145 *attrib = leaf_new (attr);
149 for (l = grammar_get_rules (parser, symbol); l != NULL; l = g_list_next (l))
155 rule = (rule_t*) l->data;
158 *attrib = tree_new (symbol_copy (symbol));
160 m = grammar_get_rule (rule);
165 tree_add (*attrib, leaf_new (g_string_new ("")));
175 s = (symbol_t*) m->data;
177 if (!rdp_step (parser, s, &attr))
179 parser->buffer = buffer;
183 tree_add (*attrib, attr);
192 tree_delete (*attrib);
200 gpointer rdp_build (Rdp* parser)
205 if (rdp_step (parser, parser->start, &attrib))