X-Git-Url: http://git.cascardo.info/?p=cascardo%2Fgrammar.git;a=blobdiff_plain;f=bnf.c;h=92927b219a20ca603a0b304a015afb48f48a6e6c;hp=f2d01e9a99e8657e9aa39a84807cd3189b93d529;hb=HEAD;hpb=58c67aca3f0c6090ae9fba5d872d041d514c6b8f diff --git a/bnf.c b/bnf.c index f2d01e9..92927b2 100644 --- a/bnf.c +++ b/bnf.c @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2005 Thadeu Lima de Souza Cascardo + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + + + #include #include #include @@ -6,7 +26,16 @@ #include #include -static gint scanner_next (scanner_t* scanner, GString** val) +typedef enum + { + NONE = 0, + EQUAL = 1, + ID = 2, + STRING = 3, + EOL = 4 + } token_t; + +static gint bnf_scanner_next (scanner_t* scanner, GString** val) { int state; @@ -26,7 +55,7 @@ static gint scanner_next (scanner_t* scanner, GString** val) gchar c; - if (scanner->buffer->len == 0) + if (scanner->buffer->len == i) { int r; r = scanner->cb (scanner->data, buffer, 256); @@ -240,7 +269,7 @@ grammar_t* grammar_load (char* filename) rule_t* rule; scanner_t* scanner; - Rdp* parser; + rdp_t* parser; GNode* tree; int fd; @@ -249,8 +278,8 @@ grammar_t* grammar_load (char* filename) scanner = scanner_new (read, fd); - parser = rdp_new (scanner_next, scanner, BNF_GRAMMAR); - grammar = (grammar_t*) parser; + grammar = grammar_new (); + parser = rdp_new (bnf_scanner_next, scanner, BNF_GRAMMAR, grammar); rule = grammar_rule_new (grammar, symbol_new (FALSE, BNF_GRAMMAR)); rule_append (rule, symbol_new (FALSE, BNF_RULES)); @@ -282,6 +311,8 @@ grammar_t* grammar_load (char* filename) close (fd); scanner_delete (scanner); + rdp_delete (parser); + grammar_delete (grammar); if (tree == NULL) { @@ -290,7 +321,7 @@ grammar_t* grammar_load (char* filename) else { grammar_t* gr; - gr = g_object_new (GRAMMAR_TYPE, NULL); + gr = grammar_new (); grammar_tree (gr, tree); return gr; }