1
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
1 #include <glib.h>
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
2 #include "symbols.h"
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
3 #include "parser.h"
|
|
2
|
4 #include "keywords.h"
|
1
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
5
|
|
2
|
6 /* Funkcja ustawiająca źródło dla flex-a. */
|
|
|
7 extern void yyrestart(FILE *);
|
1
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
8
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
9 /* Tworzy nowy parser. */
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
10 Parser *
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
11 newParser(const char *filename)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
12 {
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
13 Parser *parser;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
14
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
15 parser = g_new(Parser, 1);
|
|
2
|
16 parser->source = fopen(filename, "r");
|
|
|
17 if (parser->source==NULL) {
|
|
|
18 g_free(parser);
|
|
|
19 return NULL;
|
|
|
20 }
|
1
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
21 parser->filename = g_string_new(filename);
|
|
2
|
22 parser->namespaces = NULL;
|
|
|
23 parser->scopes = NULL;
|
1
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
24 parser->keywords = g_hash_table_new(g_str_hash, g_str_equal);
|
|
2
|
25 parser->levelup = TRUE;
|
|
|
26 parser->line = 1;
|
|
|
27 parser->root = NULL;
|
|
|
28 parser->codecomment = NULL;
|
|
|
29 parser->blockcomment = NULL;
|
1
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
30 initKeywords(parser);
|
|
2
|
31 yyrestart(parser->source); /* Każemy flexowi czytać z tego pliku. */
|
1
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
32 return parser;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
33 }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
34
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
35 /* Niszczy parser. */
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
36 void
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
37 destroyParser(Parser * parser)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
38 {
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
39 g_string_free(parser->filename, TRUE);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
40 g_hash_table_destroy(parser->keywords);
|
|
2
|
41 fclose(parser->source);
|
1
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
42 g_free(parser);
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
43 parser = NULL;
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
44 }
|