X-Git-Url: http://git.cascardo.info/?p=cascardo%2Fgrammar.git;a=blobdiff_plain;f=bnf.c;h=1e0ab1cec4f606b8f57c8adcb76b6bf39b782061;hp=8d960f88e9cc49c5c47f1eadf6981470359d3e52;hb=bedde43d47f11c6b5a2b3401c90d986a0ccef0a9;hpb=1e85e209ae43ef4f84c80c8a0fa92993fdb5c8f1 diff --git a/bnf.c b/bnf.c index 8d960f8..1e0ab1c 100644 --- a/bnf.c +++ b/bnf.c @@ -6,7 +6,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 +35,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); @@ -126,7 +135,7 @@ enum BNF_NONTERMINAL }; -void grammar_tree (Grammar* grammar, GNode* tree) +void grammar_tree (grammar_t* grammar, GNode* tree) { GNode* child_rules; @@ -233,14 +242,14 @@ void grammar_tree (Grammar* grammar, GNode* tree) } -Grammar* grammar_load (char* filename) +grammar_t* grammar_load (char* filename) { - Grammar* grammar; + grammar_t* grammar; rule_t* rule; scanner_t* scanner; - Rdp* parser; + rdp_t* parser; GNode* tree; int fd; @@ -249,8 +258,8 @@ Grammar* grammar_load (char* filename) scanner = scanner_new (read, fd); - parser = rdp_new (scanner_next, scanner, BNF_GRAMMAR); - grammar = (Grammar*) 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 +291,8 @@ Grammar* grammar_load (char* filename) close (fd); scanner_delete (scanner); + rdp_delete (parser); + grammar_delete (grammar); if (tree == NULL) { @@ -289,8 +300,8 @@ Grammar* grammar_load (char* filename) } else { - Grammar* gr; - gr = g_object_new (GRAMMAR_TYPE, NULL); + grammar_t* gr; + gr = grammar_new (); grammar_tree (gr, tree); return gr; }