diff parser.c @ 2:ff5e493bc9cb default tip

2003-01-29
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Sat, 13 Oct 2012 21:14:50 +0200
parents 1361f218a6e5
children
line wrap: on
line diff
--- a/parser.c	Sat Oct 13 21:11:54 2012 +0200
+++ b/parser.c	Sat Oct 13 21:14:50 2012 +0200
@@ -1,35 +1,10 @@
-/* Funkcje wymagane przez Bisona i uzywane wewnatrz parsera. */
-
-#include <stdlib.h>
-#include <stdio.h>
 #include <glib.h>
-
 #include "symbols.h"
-#include "tokenize.h"
-#include "tp4.tab.h"
 #include "parser.h"
+#include "keywords.h"
 
-/* Wpisuje do tablicy slowa kluczowe. */
-void
-initKeywords(Parser * parser)
-{
-    int             i;
-    const static char *keywords_str[] =
-        { "AND", "ABSOLUTE", "ARRAY", "BEGIN", "CASE", "CONST", "DIV", "DOWNTO", "DO", "ELSE",
-"END", "EXTERNAL", "FILE", "FORWARD", "FOR", "FUNCTION", "GOTO", "IF", "IMPLEMENTATION", "INTERFACE", "IN", "LABEL",
-"MOD", "NIL", "NOT", "OF", "OR", "PACKED", "PROCEDURE", "PROGRAM", "RECORD", "REPEAT", "SET", "SHL", "SHR", "STRING",
-"THEN", "TO", "TYPE", "UNIT", "UNTIL", "USES", "VAR", "WHILE", "WITH", "XOR", "THEN", "ELSE", NULL };
-    const static int keywords_tok[] =
-        { K_AND, K_ABSOLUTE, K_ARRAY, K_BEGIN, K_CASE, K_CONST, K_DIV, K_DOWNTO, K_DO, K_ELSE,
-K_END, K_EXTERNAL, K_FILE, K_FORWARD, K_FOR, K_FUNCTION, K_GOTO, K_IF, K_IMPLEMENTATION, K_INTERFACE, K_IN, K_LABEL,
-K_MOD, K_NIL, K_NOT, K_OF, K_OR, K_PACKED, K_PROCEDURE, K_PROGRAM, K_RECORD, K_REPEAT, K_SET, K_SHL, K_SHR, K_STRING,
-K_THEN, K_TO, K_TYPE, K_UNIT, K_UNTIL, K_USES, K_VAR, K_WHILE, K_WITH, K_XOR, K_THEN, K_ELSE, 0 };
-
-    for (i = 0; keywords_str[i] != NULL; ++i) {
-        g_hash_table_insert(parser->keywords, (char *)(keywords_str[i]),
-                            GINT_TO_POINTER(keywords_tok[i]));
-    }
-}
+/* Funkcja ustawiająca źródło dla flex-a. */
+extern void yyrestart(FILE *);
 
 /* Tworzy nowy parser. */
 Parser         *
@@ -38,13 +13,22 @@
     Parser         *parser;
 
     parser = g_new(Parser, 1);
+    parser->source = fopen(filename, "r");
+    if (parser->source==NULL) {
+        g_free(parser);
+        return NULL;
+    }
     parser->filename = g_string_new(filename);
-    parser->global = newNamespace(NULL);
-    parser->actual = parser->global;
-
-    parser->tok = newTokenizer(filename);
+    parser->namespaces = NULL;
+    parser->scopes = NULL;
     parser->keywords = g_hash_table_new(g_str_hash, g_str_equal);
+    parser->levelup = TRUE;
+    parser->line = 1;
+    parser->root = NULL;
+    parser->codecomment = NULL;
+    parser->blockcomment = NULL;
     initKeywords(parser);
+    yyrestart(parser->source);  /* Każemy flexowi czytać z tego pliku. */
     return parser;
 }
 
@@ -53,10 +37,8 @@
 destroyParser(Parser * parser)
 {
     g_string_free(parser->filename, TRUE);
-    destroyNamespace(parser->global);
-
-    destroyTokenizer(parser->tok);
     g_hash_table_destroy(parser->keywords);
+    fclose(parser->source);
     g_free(parser);
     parser = NULL;
 }