Added GPLv2+ as license for libgrammatic
[cascardo/grammar.git] / bnf.c
diff --git a/bnf.c b/bnf.c
index 8d960f8..92927b2 100644 (file)
--- a/bnf.c
+++ b/bnf.c
@@ -1,3 +1,23 @@
+/*
+ *  Copyright (C) 2005  Thadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
+ *
+ *  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 <grammar.h>
 #include <rdp.h>
 #include <scanner.h>
@@ -6,7 +26,16 @@
 #include <unistd.h>
 #include <stdlib.h>
 
-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);
@@ -126,7 +155,7 @@ enum
     BNF_NONTERMINAL
   };
 
-void grammar_tree (Grammar* grammar, GNode* tree)
+void grammar_tree (grammar_t* grammar, GNode* tree)
 {
 
   GNode* child_rules;
@@ -233,14 +262,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 +278,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 +311,8 @@ Grammar* grammar_load (char* filename)
 
   close (fd);
   scanner_delete (scanner);
+  rdp_delete (parser);
+  grammar_delete (grammar);
 
   if (tree == NULL)
     {
@@ -289,8 +320,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;
     }