18 static gint bnf_scanner_next (scanner_t* scanner, GString** val)
31 buffer = malloc (256);
33 for (i = 0; stop == 0; i++)
38 if (scanner->buffer->len == i)
41 r = scanner->cb (scanner->data, buffer, 256);
43 g_string_append_c (scanner->buffer, 0);
45 g_string_append_len (scanner->buffer, buffer, r);
48 c = scanner->buffer->str[i];
53 if (g_ascii_isalpha (c))
59 else if (g_ascii_isspace (c))
86 if (g_ascii_isalnum (c))
90 else if (g_ascii_isspace (c) || c == 0)
109 g_string_erase (scanner->buffer, 0, start);
110 lexeme = g_string_new_len (scanner->buffer->str, stop - start);
111 g_string_erase (scanner->buffer, 0, stop - start);
119 g_string_free (lexeme, TRUE);
138 void grammar_tree (grammar_t* grammar, GNode* tree)
146 GNode* child_nonterminal;
147 GNode* child_terminal;
154 assert (G_NODE_IS_LEAF(tree) == FALSE);
156 assert (symbol->value == BNF_GRAMMAR);
158 child_rules = tree->children;
160 while (child_rules->children != NULL)
163 assert (G_NODE_IS_LEAF(child_rules) == FALSE);
164 symbol = child_rules->data;
165 assert (symbol->value == BNF_RULES);
167 child_rule = child_rules->children;
168 assert (G_NODE_IS_LEAF(child_rule) == FALSE);
169 symbol = child_rule->data;
170 assert (symbol->value == BNF_RULE);
172 child_left = child_rule->children;
173 assert (G_NODE_IS_LEAF (child_left) == FALSE);
174 symbol = child_left->data;
175 assert (symbol->value == BNF_LEFT);
177 child_nonterminal = child_left->children;
178 assert (G_NODE_IS_LEAF (child_nonterminal) == FALSE);
179 symbol = child_nonterminal->data;
180 assert (symbol->value == BNF_NONTERMINAL);
181 assert (child_nonterminal->next == NULL);
183 child = child_nonterminal->children;
184 assert (G_NODE_IS_LEAF (child));
187 /* Create new rule */
188 value = g_quark_from_string (sym->str);
189 rule = grammar_rule_new (grammar, symbol_new (FALSE, value));
191 child_right = child_left->next->next;
192 while (child_right->children != NULL)
195 assert (G_NODE_IS_LEAF(child_right) == FALSE);
196 symbol = child_right->data;
197 assert (symbol->value == BNF_RIGHT);
199 child_symbol = child_right->children;
200 assert (G_NODE_IS_LEAF(child_symbol) == FALSE);
201 symbol = child_symbol->data;
202 assert (symbol->value == BNF_SYMBOL);
204 child = child_symbol->children;
205 symbol = child->data;
206 if (symbol->value == BNF_NONTERMINAL)
208 child_nonterminal = child;
209 assert (G_NODE_IS_LEAF (child_nonterminal) == FALSE);
210 assert (child_nonterminal->next == NULL);
211 child = child_nonterminal->children;
212 assert (G_NODE_IS_LEAF (child));
214 /* Append nonterminal to rule */
215 value = g_quark_from_string (sym->str);
216 rule_append (rule, symbol_new (FALSE, value));
218 else if (symbol->value == BNF_TERMINAL)
220 child_terminal = child;
221 assert (G_NODE_IS_LEAF (child_terminal) == FALSE);
222 assert (child_terminal->next == NULL);
223 child = child_terminal->children;
224 assert (G_NODE_IS_LEAF (child));
226 /* Append terminal to rule */
227 value = g_quark_from_string (sym->str);
228 rule_append (rule, symbol_new (TRUE, value));
235 child_right = child_symbol->next;
239 child_rules = child_rule->next;
245 grammar_t* grammar_load (char* filename)
257 fd = open (filename, O_RDONLY);
259 scanner = scanner_new (read, fd);
261 grammar = grammar_new ();
262 parser = rdp_new (bnf_scanner_next, scanner, BNF_GRAMMAR, grammar);
264 rule = grammar_rule_new (grammar, symbol_new (FALSE, BNF_GRAMMAR));
265 rule_append (rule, symbol_new (FALSE, BNF_RULES));
266 rule = grammar_rule_new (grammar, symbol_new (FALSE, BNF_RULES));
267 rule_append (rule, symbol_new (FALSE, BNF_RULE));
268 rule_append (rule, symbol_new (FALSE, BNF_RULES));
269 rule = grammar_rule_new (grammar, symbol_new (FALSE, BNF_RULES));
270 rule = grammar_rule_new (grammar, symbol_new (FALSE, BNF_RULE));
271 rule_append (rule, symbol_new (FALSE, BNF_LEFT));
272 rule_append (rule, symbol_new (TRUE, EQUAL));
273 rule_append (rule, symbol_new (FALSE, BNF_RIGHT));
274 rule_append (rule, symbol_new (TRUE, EOL));
275 rule = grammar_rule_new (grammar, symbol_new (FALSE, BNF_LEFT));
276 rule_append (rule, symbol_new (FALSE, BNF_NONTERMINAL));
277 rule = grammar_rule_new (grammar, symbol_new (FALSE, BNF_RIGHT));
278 rule_append (rule, symbol_new (FALSE, BNF_SYMBOL));
279 rule_append (rule, symbol_new (FALSE, BNF_RIGHT));
280 rule = grammar_rule_new (grammar, symbol_new (FALSE, BNF_RIGHT));
281 rule = grammar_rule_new (grammar, symbol_new (FALSE, BNF_SYMBOL));
282 rule_append (rule, symbol_new (FALSE, BNF_TERMINAL));
283 rule = grammar_rule_new (grammar, symbol_new (FALSE, BNF_SYMBOL));
284 rule_append (rule, symbol_new (FALSE, BNF_NONTERMINAL));
285 rule = grammar_rule_new (grammar, symbol_new (FALSE, BNF_TERMINAL));
286 rule_append (rule, symbol_new (TRUE, STRING));
287 rule = grammar_rule_new (grammar, symbol_new (FALSE, BNF_NONTERMINAL));
288 rule_append (rule, symbol_new (TRUE, ID));
290 tree = rdp_build (parser);
293 scanner_delete (scanner);
295 grammar_delete (grammar);
305 grammar_tree (gr, tree);