9 static gint scanner_next (scanner_t* scanner, GString** val)
22 buffer = malloc (256);
24 for (i = 0; stop == 0; i++)
29 if (scanner->buffer->len == 0)
32 r = scanner->cb (scanner->data, buffer, 256);
34 g_string_append_c (scanner->buffer, 0);
36 g_string_append_len (scanner->buffer, buffer, r);
39 c = scanner->buffer->str[i];
44 if (g_ascii_isalpha (c))
50 else if (g_ascii_isspace (c))
77 if (g_ascii_isalnum (c))
81 else if (g_ascii_isspace (c) || c == 0)
100 g_string_erase (scanner->buffer, 0, start);
101 lexeme = g_string_new_len (scanner->buffer->str, stop - start);
102 g_string_erase (scanner->buffer, 0, stop - start);
110 g_string_free (lexeme, TRUE);
129 void grammar_tree (grammar_t* grammar, GNode* tree)
137 GNode* child_nonterminal;
138 GNode* child_terminal;
145 assert (G_NODE_IS_LEAF(tree) == FALSE);
147 assert (symbol->value == BNF_GRAMMAR);
149 child_rules = tree->children;
151 while (child_rules->children != NULL)
154 assert (G_NODE_IS_LEAF(child_rules) == FALSE);
155 symbol = child_rules->data;
156 assert (symbol->value == BNF_RULES);
158 child_rule = child_rules->children;
159 assert (G_NODE_IS_LEAF(child_rule) == FALSE);
160 symbol = child_rule->data;
161 assert (symbol->value == BNF_RULE);
163 child_left = child_rule->children;
164 assert (G_NODE_IS_LEAF (child_left) == FALSE);
165 symbol = child_left->data;
166 assert (symbol->value == BNF_LEFT);
168 child_nonterminal = child_left->children;
169 assert (G_NODE_IS_LEAF (child_nonterminal) == FALSE);
170 symbol = child_nonterminal->data;
171 assert (symbol->value == BNF_NONTERMINAL);
172 assert (child_nonterminal->next == NULL);
174 child = child_nonterminal->children;
175 assert (G_NODE_IS_LEAF (child));
178 /* Create new rule */
179 value = g_quark_from_string (sym->str);
180 rule = grammar_rule_new (grammar, symbol_new (FALSE, value));
182 child_right = child_left->next->next;
183 while (child_right->children != NULL)
186 assert (G_NODE_IS_LEAF(child_right) == FALSE);
187 symbol = child_right->data;
188 assert (symbol->value == BNF_RIGHT);
190 child_symbol = child_right->children;
191 assert (G_NODE_IS_LEAF(child_symbol) == FALSE);
192 symbol = child_symbol->data;
193 assert (symbol->value == BNF_SYMBOL);
195 child = child_symbol->children;
196 symbol = child->data;
197 if (symbol->value == BNF_NONTERMINAL)
199 child_nonterminal = child;
200 assert (G_NODE_IS_LEAF (child_nonterminal) == FALSE);
201 assert (child_nonterminal->next == NULL);
202 child = child_nonterminal->children;
203 assert (G_NODE_IS_LEAF (child));
205 /* Append nonterminal to rule */
206 value = g_quark_from_string (sym->str);
207 rule_append (rule, symbol_new (FALSE, value));
209 else if (symbol->value == BNF_TERMINAL)
211 child_terminal = child;
212 assert (G_NODE_IS_LEAF (child_terminal) == FALSE);
213 assert (child_terminal->next == NULL);
214 child = child_terminal->children;
215 assert (G_NODE_IS_LEAF (child));
217 /* Append terminal to rule */
218 value = g_quark_from_string (sym->str);
219 rule_append (rule, symbol_new (TRUE, value));
226 child_right = child_symbol->next;
230 child_rules = child_rule->next;
236 grammar_t* grammar_load (char* filename)
248 fd = open (filename, O_RDONLY);
250 scanner = scanner_new (read, fd);
252 grammar = grammar_new ();
253 parser = rdp_new (scanner_next, scanner, BNF_GRAMMAR, grammar);
255 rule = grammar_rule_new (grammar, symbol_new (FALSE, BNF_GRAMMAR));
256 rule_append (rule, symbol_new (FALSE, BNF_RULES));
257 rule = grammar_rule_new (grammar, symbol_new (FALSE, BNF_RULES));
258 rule_append (rule, symbol_new (FALSE, BNF_RULE));
259 rule_append (rule, symbol_new (FALSE, BNF_RULES));
260 rule = grammar_rule_new (grammar, symbol_new (FALSE, BNF_RULES));
261 rule = grammar_rule_new (grammar, symbol_new (FALSE, BNF_RULE));
262 rule_append (rule, symbol_new (FALSE, BNF_LEFT));
263 rule_append (rule, symbol_new (TRUE, EQUAL));
264 rule_append (rule, symbol_new (FALSE, BNF_RIGHT));
265 rule_append (rule, symbol_new (TRUE, EOL));
266 rule = grammar_rule_new (grammar, symbol_new (FALSE, BNF_LEFT));
267 rule_append (rule, symbol_new (FALSE, BNF_NONTERMINAL));
268 rule = grammar_rule_new (grammar, symbol_new (FALSE, BNF_RIGHT));
269 rule_append (rule, symbol_new (FALSE, BNF_SYMBOL));
270 rule_append (rule, symbol_new (FALSE, BNF_RIGHT));
271 rule = grammar_rule_new (grammar, symbol_new (FALSE, BNF_RIGHT));
272 rule = grammar_rule_new (grammar, symbol_new (FALSE, BNF_SYMBOL));
273 rule_append (rule, symbol_new (FALSE, BNF_TERMINAL));
274 rule = grammar_rule_new (grammar, symbol_new (FALSE, BNF_SYMBOL));
275 rule_append (rule, symbol_new (FALSE, BNF_NONTERMINAL));
276 rule = grammar_rule_new (grammar, symbol_new (FALSE, BNF_TERMINAL));
277 rule_append (rule, symbol_new (TRUE, STRING));
278 rule = grammar_rule_new (grammar, symbol_new (FALSE, BNF_NONTERMINAL));
279 rule_append (rule, symbol_new (TRUE, ID));
281 tree = rdp_build (parser);
284 scanner_delete (scanner);
293 gr = g_object_new (GRAMMAR_TYPE, NULL);
294 grammar_tree (gr, tree);