eolian: add a functional "import" statement

This commit is contained in:
Daniel Kolesa 2015-05-19 15:26:53 +01:00
parent 8834f8e02d
commit 72dcd2da03
6 changed files with 52 additions and 5 deletions

View File

@ -391,8 +391,6 @@ int main(int argc, char **argv)
goto end;
}
eolian_all_eot_files_parse();
if (!eolian_eo_file_parse(eo_filename))
{
ERR("Error during parsing file %s\n", eo_filename);

View File

@ -213,8 +213,12 @@ Eina_Bool
eo_parser_database_fill(const char *filename, Eina_Bool eot)
{
Eolian_Class *cl;
Eo_Lexer *ls;
Eo_Lexer *ls = eo_lexer_new(filename);
if (eot && eina_hash_find(_parsedeots, filename))
return EINA_TRUE;
ls = eo_lexer_new(filename);
if (!ls)
{
fprintf(stderr, "eolian: unable to create lexer for file '%s'\n", filename);
@ -249,6 +253,9 @@ eo_parser_database_fill(const char *filename, Eina_Bool eot)
}
done:
if (eot)
eina_hash_set(_parsedeots, filename, (void *)EINA_TRUE);
eo_lexer_free(ls);
return EINA_TRUE;

View File

@ -659,7 +659,7 @@ eo_lexer_set_input(Eo_Lexer *ls, const char *source)
ls->source = eina_stringshare_add(source);
ls->filename = get_filename(ls);
ls->line_number = 1;
ls->icolumn = ls->column = 0;
ls->icolumn = ls->column = -1;
next_char(ls);
if (ls->current != 0xEF)
return;

View File

@ -1791,8 +1791,39 @@ parse_unit(Eo_Lexer *ls, Eina_Bool eot)
goto found_class;
case KW_import:
{
Eina_Strbuf *buf = push_strbuf(ls);
const char *found = NULL;
char errbuf[PATH_MAX];
eo_lexer_get(ls);
check(ls, TOK_VALUE);
eina_strbuf_append(buf, ls->t.value.s);
eina_strbuf_append(buf, ".eot");
if (eina_hash_find(_parsingeots, ls->t.value.s))
{
pop_strbuf(ls);
snprintf(errbuf, sizeof(errbuf),
"cyclic import '%s'", ls->t.value.s);
eo_lexer_syntax_error(ls, errbuf);
}
if (!(found = eina_hash_find(_tfilenames, eina_strbuf_string_get(buf))))
{
pop_strbuf(ls);
snprintf(errbuf, sizeof(errbuf),
"unknown import '%s'", ls->t.value.s);
eo_lexer_syntax_error(ls, errbuf);
}
pop_strbuf(ls);
eina_hash_set(_parsingeots, ls->t.value.s, (void *)EINA_TRUE);
if (!eo_parser_database_fill(found, EINA_TRUE))
{
pop_strbuf(ls);
snprintf(errbuf, sizeof(errbuf),
"error while parsing import '%s'", ls->t.value.s);
eo_lexer_syntax_error(ls, errbuf);
}
eina_hash_set(_parsingeots, ls->t.value.s, (void *)EINA_FALSE);
pop_strbuf(ls);
eo_lexer_get(ls);
check_next(ls, TOK_VALUE);
check_next(ls, ';');
break;
}

View File

@ -24,6 +24,9 @@ Eina_Hash *_tfilenames = NULL;
Eina_Hash *_depclasses = NULL;
Eina_Hash *_decls = NULL;
Eina_Hash *_parsedeots = NULL;
Eina_Hash *_parsingeots = NULL;
static int _database_init_count = 0;
static void
@ -66,6 +69,8 @@ database_init()
_tfilenames = eina_hash_string_small_new(free);
_depclasses = eina_hash_stringshared_new(EINA_FREE_CB(_deplist_free));
_decls = eina_hash_stringshared_new(free);
_parsedeots = eina_hash_string_small_new(NULL);
_parsingeots = eina_hash_string_small_new(NULL);
return ++_database_init_count;
}
@ -97,6 +102,8 @@ database_shutdown()
eina_hash_free(_tfilenames); _tfilenames = NULL;
eina_hash_free(_depclasses); _depclasses = NULL;
eina_hash_free(_decls ); _decls = NULL;
eina_hash_free(_parsedeots); _parsedeots = NULL;
eina_hash_free(_parsingeots); _parsingeots = NULL;
eina_shutdown();
}
return _database_init_count;

View File

@ -52,6 +52,10 @@ extern Eina_Hash *_depclasses;
/* a hash holding all declarations, for redef checking etc */
extern Eina_Hash *_decls;
/* holds parsed/currently parsing eot files to keep track */
extern Eina_Hash *_parsedeots;
extern Eina_Hash *_parsingeots;
typedef struct _Eolian_Object
{
const char *file;