From 46827bf0220d09c92afd9c497f0f7a8bcc80615e Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Tue, 8 Jul 2014 15:44:42 +0100 Subject: [PATCH] eolian: initial struct parsing --- src/lib/eolian/eo_parser.c | 61 +++++++++++++++++++++++++++----------- 1 file changed, 44 insertions(+), 17 deletions(-) diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c index 65eaf8e727..9c915d68dd 100644 --- a/src/lib/eolian/eo_parser.c +++ b/src/lib/eolian/eo_parser.c @@ -146,6 +146,8 @@ parse_name_list(Eo_Lexer *ls) } static Eo_Type_Def *parse_type_void(Eo_Lexer *ls); +static Eo_Type_Def *parse_type_struct(Eo_Lexer *ls, Eina_Bool allow_struct, + Eina_Bool allow_anon); static Eo_Type_Def * parse_type(Eo_Lexer *ls) @@ -161,6 +163,21 @@ parse_type(Eo_Lexer *ls) return ret; } +static Eo_Type_Def * +parse_type_struct_nonvoid(Eo_Lexer *ls, Eina_Bool allow_struct, + Eina_Bool allow_anon) +{ + int line = ls->line_number, column = ls->column; + Eo_Type_Def *ret = parse_type_struct(ls, allow_struct, allow_anon); + if (ret->type == EOLIAN_TYPE_VOID) + { + ls->line_number = line; + ls->column = column; + eo_lexer_syntax_error(ls, "non-void type expected"); + } + return ret; +} + static Eo_Type_Def * parse_function_type(Eo_Lexer *ls) { @@ -188,9 +205,25 @@ parse_function_type(Eo_Lexer *ls) static Eo_Type_Def * parse_struct(Eo_Lexer *ls, const char *name) { - (void)ls; - (void)name; - return NULL; + int line = ls->line_number, column = ls->column; + Eo_Type_Def *def = calloc(1, sizeof(Eo_Type_Def)); + ls->tmp.type_def = def; + def->name = name; + check_next(ls, '{'); + while (ls->t.token != '}') + { + check(ls, TOK_VALUE); + eo_lexer_get(ls); + check_next(ls, ':'); + parse_type_struct_nonvoid(ls, EINA_TRUE, EINA_FALSE); + check_next(ls, ';'); + if (ls->t.token == TOK_COMMENT) + { + eo_lexer_get(ls); + } + } + check_match(ls, '}', '{', line, column); + return def; } static Eo_Type_Def * @@ -239,11 +272,13 @@ parse_type_struct(Eo_Lexer *ls, Eina_Bool allow_struct, Eina_Bool allow_anon) return parse_struct(ls, NULL); if (eo_lexer_lookahead(ls) == '{') { + const char *name; check(ls, TOK_VALUE); if (eo_lexer_get_c_type(ls->t.kw)) eo_lexer_syntax_error(ls, "invalid struct name"); + name = eina_stringshare_add(ls->t.value); eo_lexer_get(ls); - return parse_struct(ls, NULL); + return parse_struct(ls, name); } } has_struct = EINA_TRUE; @@ -308,24 +343,14 @@ parse_type_void(Eo_Lexer *ls) static void parse_typedef(Eo_Lexer *ls) { - int line, column; - Eo_Type_Def *ret; ls->tmp.typedef_def = calloc(1, sizeof(Eo_Typedef_Def)); eo_lexer_get(ls); check(ls, TOK_VALUE); ls->tmp.typedef_def->alias = eina_stringshare_add(ls->t.value); eo_lexer_get(ls); test_next(ls, ':'); - line = ls->line_number; - column = ls->column; - ret = parse_type_struct(ls, EINA_TRUE, EINA_TRUE); - if (ret->type == EOLIAN_TYPE_VOID) - { - ls->line_number = line; - ls->column = column; - eo_lexer_syntax_error(ls, "non-void type expected"); - } - ls->tmp.typedef_def->type = ret; + ls->tmp.typedef_def->type = parse_type_struct_nonvoid(ls, EINA_TRUE, + EINA_TRUE); ls->tmp.type_def = NULL; check_next(ls, ';'); } @@ -962,12 +987,14 @@ parse_unit(Eo_Lexer *ls, Eina_Bool eot) } case KW_struct: { + const char *name; eo_lexer_get(ls); check(ls, TOK_VALUE); if (eo_lexer_get_c_type(ls->t.kw)) eo_lexer_syntax_error(ls, "invalid struct name"); + name = eina_stringshare_add(ls->t.value); eo_lexer_get(ls); - parse_struct(ls, NULL); + parse_struct(ls, name); } def: default: