Mercurial > pasana
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; }
