summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Kolesa <d.kolesa@samsung.com>2014-07-17 17:16:31 +0100
committerDaniel Kolesa <d.kolesa@samsung.com>2014-08-04 16:35:08 +0100
commitb0c10eeb8183b93a9d9cce2702cedf5b220f61f1 (patch)
tree4601adb53dc653bdfefbc489059779e7d950b76d
parent21f44edf59d88057fab955ba246545a029f013ae (diff)
downloadefl-b0c10eeb8183b93a9d9cce2702cedf5b220f61f1.tar.gz
eolian: initial support for expression parsing
-rw-r--r--src/lib/eolian/Eolian.h59
-rw-r--r--src/lib/eolian/eo_definitions.h1
-rw-r--r--src/lib/eolian/eo_lexer.c38
-rw-r--r--src/lib/eolian/eo_lexer.h19
-rw-r--r--src/lib/eolian/eo_parser.c251
-rw-r--r--src/lib/eolian/eolian_database.h35
6 files changed, 344 insertions, 59 deletions
diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h
index d147068312..fd69c784ee 100644
--- a/src/lib/eolian/Eolian.h
+++ b/src/lib/eolian/Eolian.h
@@ -74,6 +74,12 @@ typedef struct _Eolian_Implement Eolian_Implement;
*/
typedef struct _Eolian_Event Eolian_Event;
+/* Expression information
+ *
+ * @ingroup Eolian
+ */
+typedef struct _Eolian_Expression Eolian_Expression;
+
#define EOLIAN_LEGACY "legacy"
#define EOLIAN_LEGACY_GET "legacy_get"
#define EOLIAN_LEGACY_SET "legacy_set"
@@ -126,6 +132,59 @@ typedef enum
EOLIAN_TYPE_CLASS
} Eolian_Type_Type;
+typedef enum
+{
+ EOLIAN_EXPR_UNKNOWN,
+ EOLIAN_EXPR_INT,
+ EOLIAN_EXPR_UINT,
+ EOLIAN_EXPR_LONG,
+ EOLIAN_EXPR_ULONG,
+ EOLIAN_EXPR_LLONG,
+ EOLIAN_EXPR_ULLONG,
+ EOLIAN_EXPR_FLOAT,
+ EOLIAN_EXPR_DOUBLE,
+ EOLIAN_EXPR_LDOUBLE,
+ EOLIAN_EXPR_STRING,
+ EOLIAN_EXPR_BOOL,
+ EOLIAN_EXPR_NAME,
+ EOLIAN_EXPR_UNARY,
+ EOLIAN_EXPR_BINARY
+} Eolian_Expression_Type;
+
+typedef enum
+{
+ BOP_ADD, /* + */
+ BOP_SUB, /* - */
+ BOP_MUL, /* * */
+ BOP_DIV, /* / */
+ BOP_MOD, /* % */
+
+ BOP_EQ, /* == */
+ BOP_NQ, /* != */
+ BOP_GT, /* > */
+ BOP_LT, /* < */
+ BOP_GE, /* >= */
+ BOP_LE, /* <= */
+
+ BOP_AND, /* && */
+ BOP_OR, /* || */
+
+ BOP_BAND, /* & */
+ BOP_BOR, /* | */
+ BOP_BXOR, /* ^ */
+ BOP_LSH, /* << */
+ BOP_RSH /* >> */
+} Eolian_Binary_Operator;
+
+typedef enum
+{
+ UOP_UNM, /* - */
+ UOP_UNP, /* + */
+
+ UOP_NOT, /* ! */
+ UOP_BNOT, /* ~ */
+} Eolian_Unary_Operator;
+
/*
* @brief Parse a given .eo file and fill the database.
*
diff --git a/src/lib/eolian/eo_definitions.h b/src/lib/eolian/eo_definitions.h
index dc52ab049d..c1e3217e71 100644
--- a/src/lib/eolian/eo_definitions.h
+++ b/src/lib/eolian/eo_definitions.h
@@ -118,6 +118,7 @@ typedef struct _Eo_Lexer_Temps
Eina_List *str_items;
Eolian_Event *event;
Eolian_Implement *impl;
+ Eina_List *expr_defs;
} Eo_Lexer_Temps;
void eo_definitions_class_def_free(Eo_Class_Def *kls);
diff --git a/src/lib/eolian/eo_lexer.c b/src/lib/eolian/eo_lexer.c
index 2b6101716f..80ee15a3c3 100644
--- a/src/lib/eolian/eo_lexer.c
+++ b/src/lib/eolian/eo_lexer.c
@@ -44,6 +44,8 @@ next_char(Eo_Lexer *ls)
static const char * const tokens[] =
{
+ "==", "!=", ">", "<", ">=", "<=", "&&", "||", "<<", ">>",
+
"<comment>", "<string>", "<number>", "<value>",
KEYWORDS
@@ -101,12 +103,12 @@ throw(Eo_Lexer *ls, const char *fmt, ...)
static void
init_hash(void)
{
- unsigned int i;
+ unsigned int i, u;
if (keyword_map) return;
keyword_map = eina_hash_string_superfast_new(NULL);
- for (i = 4; i < (sizeof(tokens) / sizeof(const char*)); ++i)
+ for (i = u = 14; i < (sizeof(tokens) / sizeof(const char*)); ++i)
{
- eina_hash_add(keyword_map, tokens[i], (void*)(size_t)(i - 3));
+ eina_hash_add(keyword_map, tokens[i], (void*)(size_t)(i - u + 1));
}
}
@@ -193,7 +195,7 @@ read_long_comment(Eo_Lexer *ls, Eo_Token *tok)
}
}
eina_strbuf_trim(ls->buff);
- if (tok) tok->value = eina_stringshare_add(eina_strbuf_string_get(ls->buff));
+ if (tok) tok->value.s = eina_stringshare_add(eina_strbuf_string_get(ls->buff));
}
static void
@@ -302,8 +304,8 @@ skip:
}
eina_strbuf_append_char(ls->buff, ls->current);
next_char(ls);
- tok->value = eina_stringshare_add_length(eina_strbuf_string_get(ls->buff) + 1,
- (unsigned int)eina_strbuf_length_get(ls->buff) - 2);
+ tok->value.s = eina_stringshare_add_length(eina_strbuf_string_get(ls->buff) + 1,
+ (unsigned int)eina_strbuf_length_get(ls->buff) - 2);
}
static int
@@ -360,21 +362,21 @@ write_val(Eo_Lexer *ls, Eo_Token *tok, Eina_Bool is_float)
if (is_float)
{
if (type == NUM_FLOAT)
- tok->value_f = strtof(str, &end);
+ tok->value.f = strtof(str, &end);
else if (type == NUM_DOUBLE)
- tok->value_d = strtod(str, &end);
+ tok->value.d = strtod(str, &end);
else if (type == NUM_LDOUBLE)
- tok->value_ld = strtold(str, &end);
+ tok->value.ld = strtold(str, &end);
}
else
{
/* signed is always in the same memory location */
if (type == NUM_INT || type == NUM_UINT)
- tok->value_u = strtoul(str, &end, 0);
+ tok->value.u = strtoul(str, &end, 0);
else if (type == NUM_LONG || type == NUM_ULONG)
- tok->value_ul = strtoul(str, &end, 0);
+ tok->value.ul = strtoul(str, &end, 0);
else if (type == NUM_LLONG || type == NUM_ULLONG)
- tok->value_ull = strtoull(str, &end, 0);
+ tok->value.ull = strtoull(str, &end, 0);
}
if (end)
eo_lexer_lex_error(ls, "malformed number", TOK_NUMBER);
@@ -455,7 +457,7 @@ static int
lex(Eo_Lexer *ls, Eo_Token *tok)
{
eina_strbuf_reset(ls->buff);
- tok->value = NULL;
+ tok->value.s = NULL;
for (;;) switch (ls->current)
{
case '\n':
@@ -526,7 +528,7 @@ lex(Eo_Lexer *ls, Eo_Token *tok)
ls->column = col + 1;
if (at_kw && tok->kw == 0)
eo_lexer_syntax_error(ls, "invalid keyword");
- tok->value = eina_stringshare_add(str);
+ tok->value.s = eina_stringshare_add(str);
return TOK_VALUE;
}
else
@@ -564,7 +566,7 @@ lex_balanced(Eo_Lexer *ls, Eo_Token *tok, char beg, char end)
eina_strbuf_trim(ls->buff);
str = eina_strbuf_string_get(ls->buff);
tok->kw = (int)(uintptr_t)eina_hash_find(keyword_map, str);
- tok->value = eina_stringshare_add(str);
+ tok->value.s = eina_stringshare_add(str);
ls->column = col + 1;
return TOK_VALUE;
}
@@ -645,8 +647,8 @@ eo_lexer_get(Eo_Lexer *ls)
{
if (ls->t.token >= START_CUSTOM && ls->t.token != TOK_NUMBER)
{
- eina_stringshare_del(ls->t.value);
- ls->t.value = NULL;
+ eina_stringshare_del(ls->t.value.s);
+ ls->t.value.s = NULL;
}
if (ls->lookahead.token >= 0)
{
@@ -714,7 +716,7 @@ eo_lexer_token_to_str(int token, char *buf)
const char *
eo_lexer_keyword_str_get(int kw)
{
- return tokens[kw + 3];
+ return tokens[kw + 13];
}
Eina_Bool
diff --git a/src/lib/eolian/eo_lexer.h b/src/lib/eolian/eo_lexer.h
index ed3e14a5f4..95abb90b2f 100644
--- a/src/lib/eolian/eo_lexer.h
+++ b/src/lib/eolian/eo_lexer.h
@@ -13,7 +13,10 @@
enum Tokens
{
- TOK_COMMENT = START_CUSTOM, TOK_STRING, TOK_NUMBER, TOK_VALUE
+ TOK_EQ = START_CUSTOM, TOK_NQ, TOK_GT, TOK_LT, TOK_GE, TOK_LE,
+ TOK_AND, TOK_OR, TOK_LSH, TOK_RSH,
+
+ TOK_COMMENT, TOK_STRING, TOK_NUMBER, TOK_VALUE
};
/* all keywords in eolian, they can still be used as names (they're TOK_VALUE)
@@ -79,19 +82,7 @@ enum Numbers
typedef struct _Eo_Token
{
int token, kw;
- union
- {
- const char *value;
- signed int value_i;
- unsigned int value_u;
- signed long value_l;
- unsigned long value_ul;
- signed long long value_ll;
- unsigned long long value_ull;
- float value_f;
- double value_d;
- long double value_ld;
- };
+ Eolian_Value value;
} Eo_Token;
enum Nodes
diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c
index 36eca4808d..1c9f3af4b2 100644
--- a/src/lib/eolian/eo_parser.c
+++ b/src/lib/eolian/eo_parser.c
@@ -170,7 +170,7 @@ parse_name(Eo_Lexer *ls, Eina_Strbuf *buf)
eina_strbuf_reset(buf);
for (;;)
{
- eina_strbuf_append(buf, ls->t.value);
+ eina_strbuf_append(buf, ls->t.value.s);
eo_lexer_get(ls);
if (ls->t.token != '.') break;
eo_lexer_get(ls);
@@ -223,6 +223,203 @@ _fill_type_name(Eolian_Type *tp, const char *type_name)
free(full_name);
}
+static Eolian_Expression *
+push_expr(Eo_Lexer *ls)
+{
+ Eolian_Expression *def = calloc(1, sizeof(Eolian_Expression));
+ ls->tmp.expr_defs = eina_list_prepend(ls->tmp.expr_defs, def);
+ return def;
+}
+
+static void
+pop_expr(Eo_Lexer *ls)
+{
+ ls->tmp.expr_defs = eina_list_remove_list(ls->tmp.expr_defs, ls->tmp.expr_defs);
+}
+
+static Eolian_Binary_Operator
+get_binop_id(int tok)
+{
+ switch (tok)
+ {
+ case '+': return BOP_ADD;
+ case '-': return BOP_SUB;
+ case '*': return BOP_MUL;
+ case '/': return BOP_DIV;
+ case '%': return BOP_MOD;
+
+ case TOK_EQ: return BOP_EQ;
+ case TOK_NQ: return BOP_NQ;
+ case TOK_GT: return BOP_GT;
+ case TOK_LT: return BOP_LT;
+ case TOK_GE: return BOP_GE;
+ case TOK_LE: return BOP_LE;
+
+ case TOK_AND: return BOP_AND;
+ case TOK_OR : return BOP_OR;
+
+ case '&': return BOP_BAND;
+ case '|': return BOP_BOR;
+ case '^': return BOP_BXOR;
+
+ case TOK_LSH: return BOP_LSH;
+ case TOK_RSH: return BOP_RSH;
+
+ default: return -1;
+ }
+}
+
+static Eolian_Unary_Operator
+get_unop_id(int tok)
+{
+ switch (tok)
+ {
+ case '-': return UOP_UNM;
+ case '+': return UOP_UNP;
+ case '!': return UOP_NOT;
+ case '~': return UOP_BNOT;
+
+ default: return -1;
+ }
+}
+
+static const int binprec[] = {
+ 8, /* + */
+ 8, /* - */
+ 9, /* * */
+ 9, /* / */
+ 9, /* % */
+
+ 3, /* == */
+ 3, /* != */
+ 3, /* > */
+ 3, /* < */
+ 3, /* >= */
+ 3, /* <= */
+
+ 2, /* && */
+ 1, /* || */
+
+ 6, /* & */
+ 4, /* | */
+ 5, /* ^ */
+ 7, /* << */
+ 7 /* >> */
+};
+
+#define UNARY_PRECEDENCE 10
+
+static int
+get_binop_prec(Eolian_Binary_Operator id)
+{
+ if (id < 0) return -1;
+ return binprec[id];
+}
+
+static Eolian_Expression *parse_expr_bin(Eo_Lexer *ls, int min_prec);
+static Eolian_Expression *parse_expr(Eo_Lexer *ls);
+
+static Eolian_Expression *
+parse_expr_simple(Eo_Lexer *ls)
+{
+ Eolian_Expression *expr;
+ Eolian_Unary_Operator unop = get_unop_id(ls->t.token);
+ if (unop >= 0)
+ {
+ Eolian_Expression *exp = parse_expr_bin(ls, UNARY_PRECEDENCE);
+ pop_expr(ls);
+ expr = push_expr(ls);
+ expr->binop = unop;
+ expr->type = EOLIAN_EXPR_UNARY;
+ expr->expr = exp;
+ return expr;
+ }
+ switch (ls->t.token)
+ {
+ case TOK_NUMBER:
+ {
+ expr = push_expr(ls);
+ expr->type = ls->t.kw + 1; /* map Numbers from lexer to expr type */
+ expr->value = ls->t.value;
+ eo_lexer_get(ls);
+ break;
+ }
+ case TOK_STRING:
+ {
+ expr = push_expr(ls);
+ expr->type = EOLIAN_EXPR_STRING;
+ expr->value.s = eina_stringshare_ref(ls->t.value.s);
+ eo_lexer_get(ls);
+ break;
+ }
+ case TOK_VALUE:
+ {
+ switch (ls->t.kw)
+ {
+ case KW_true:
+ case KW_false:
+ {
+ expr = push_expr(ls);
+ expr->type = EOLIAN_EXPR_BOOL;
+ expr->value.b = (ls->t.kw == KW_true);
+ eo_lexer_get(ls);
+ break;
+ }
+ default:
+ {
+ expr = push_expr(ls);
+ expr->type = EOLIAN_EXPR_NAME;
+ expr->value.s = eina_stringshare_ref(ls->t.value.s);
+ eo_lexer_get(ls);
+ break;
+ }
+ }
+ }
+ case '(':
+ {
+ int line = ls->line_number, col = ls->column;
+ eo_lexer_get(ls);
+ expr = parse_expr(ls);
+ check_match(ls, ')', '(', line, col);
+ }
+ default:
+ eo_lexer_syntax_error(ls, "unexpected symbol");
+ break;
+ }
+
+ return expr;
+}
+
+static Eolian_Expression *
+parse_expr_bin(Eo_Lexer *ls, int min_prec)
+{
+ Eolian_Expression *lhs = parse_expr_simple(ls);
+ for (;;)
+ {
+ Eolian_Expression *rhs, *bin;
+ Eolian_Binary_Operator op = get_binop_id(ls->t.token);
+ int prec = get_binop_prec(op);
+ if ((op < 0) || (prec < 0) || (prec < min_prec))
+ break;
+ rhs = parse_expr_bin(ls, prec + 1);
+ pop_expr(ls);
+ pop_expr(ls);
+ bin = push_expr(ls);
+ bin->binop = op;
+ bin->type = EOLIAN_EXPR_BINARY;
+ bin->lhs = lhs;
+ bin->rhs = rhs;
+ lhs = bin;
+ }
+ return lhs;
+}
+
+static Eolian_Expression *
+parse_expr(Eo_Lexer *ls)
+{
+ return parse_expr_bin(ls, 1);
+}
+
static Eolian_Type *parse_type_void(Eo_Lexer *ls);
static Eolian_Type *parse_type_struct_void(Eo_Lexer *ls, Eina_Bool allow_struct);
@@ -310,7 +507,7 @@ parse_struct(Eo_Lexer *ls, const char *name, Eina_Bool is_extern,
check_next(ls, '{');
if (ls->t.token == TOK_COMMENT)
{
- def->comment = eina_stringshare_ref(ls->t.value);
+ def->comment = eina_stringshare_ref(ls->t.value.s);
eo_lexer_get(ls);
}
while (ls->t.token != '}')
@@ -320,9 +517,9 @@ parse_struct(Eo_Lexer *ls, const char *name, Eina_Bool is_extern,
Eolian_Type *tp;
int fline = ls->line_number, fcol = ls->column;
check(ls, TOK_VALUE);
- if (eina_hash_find(def->fields, ls->t.value))
+ if (eina_hash_find(def->fields, ls->t.value.s))
eo_lexer_syntax_error(ls, "double field definition");
- fname = eina_stringshare_ref(ls->t.value);
+ fname = eina_stringshare_ref(ls->t.value.s);
eo_lexer_get(ls);
check_next(ls, ':');
tp = parse_type(ls);
@@ -336,7 +533,7 @@ parse_struct(Eo_Lexer *ls, const char *name, Eina_Bool is_extern,
check_next(ls, ';');
if (ls->t.token == TOK_COMMENT)
{
- fdef->comment = eina_stringshare_ref(ls->t.value);
+ fdef->comment = eina_stringshare_ref(ls->t.value.s);
eo_lexer_get(ls);
}
}
@@ -570,7 +767,7 @@ parse_typedef(Eo_Lexer *ls)
check_next(ls, ';');
if (ls->t.token == TOK_COMMENT)
{
- def->comment = eina_stringshare_ref(ls->t.value);
+ def->comment = eina_stringshare_ref(ls->t.value.s);
eo_lexer_get(ls);
}
return def;
@@ -591,7 +788,7 @@ parse_return(Eo_Lexer *ls, Eina_Bool allow_void)
{
int line = ls->line_number, col = ls->column;
eo_lexer_get_balanced(ls, '(', ')');
- ret->default_ret_val = eina_stringshare_ref(ls->t.value);
+ ret->default_ret_val = eina_stringshare_ref(ls->t.value.s);
eo_lexer_get(ls);
check_match(ls, ')', '(', line, col);
}
@@ -603,7 +800,7 @@ parse_return(Eo_Lexer *ls, Eina_Bool allow_void)
check_next(ls, ';');
if (ls->t.token == TOK_COMMENT)
{
- ret->comment = eina_stringshare_ref(ls->t.value);
+ ret->comment = eina_stringshare_ref(ls->t.value.s);
eo_lexer_get(ls);
}
}
@@ -641,7 +838,7 @@ parse_param(Eo_Lexer *ls, Eina_Bool allow_inout)
par->type = parse_type(ls);
pop_type(ls);
check(ls, TOK_VALUE);
- par->name = eina_stringshare_ref(ls->t.value);
+ par->name = eina_stringshare_ref(ls->t.value.s);
eo_lexer_get(ls);
if (ls->t.kw == KW_at_nonull)
{
@@ -651,7 +848,7 @@ parse_param(Eo_Lexer *ls, Eina_Bool allow_inout)
check_next(ls, ';');
if (ls->t.token == TOK_COMMENT)
{
- par->comment = eina_stringshare_ref(ls->t.value);
+ par->comment = eina_stringshare_ref(ls->t.value.s);
eo_lexer_get(ls);
}
}
@@ -661,7 +858,7 @@ parse_legacy(Eo_Lexer *ls)
{
eo_lexer_get(ls);
check(ls, TOK_VALUE);
- ls->tmp.legacy_def = eina_stringshare_ref(ls->t.value);
+ ls->tmp.legacy_def = eina_stringshare_ref(ls->t.value.s);
eo_lexer_get(ls);
check_next(ls, ';');
}
@@ -673,7 +870,7 @@ parse_attrs(Eo_Lexer *ls)
Eina_Bool has_const = EINA_FALSE;
acc = calloc(1, sizeof(Eo_Accessor_Param));
ls->tmp.accessor_param = acc;
- acc->name = eina_stringshare_ref(ls->t.value);
+ acc->name = eina_stringshare_ref(ls->t.value.s);
eo_lexer_get(ls);
check_next(ls, ':');
check(ls, TOK_VALUE);
@@ -710,7 +907,7 @@ parse_accessor(Eo_Lexer *ls)
check_next(ls, '{');
if (ls->t.token == TOK_COMMENT)
{
- acc->comment = eina_stringshare_ref(ls->t.value);
+ acc->comment = eina_stringshare_ref(ls->t.value.s);
eo_lexer_get(ls);
}
for (;;) switch (ls->t.kw)
@@ -775,7 +972,7 @@ parse_property(Eo_Lexer *ls)
prop->base.column = ls->column;
ls->tmp.prop = prop;
check(ls, TOK_VALUE);
- prop->name = eina_stringshare_ref(ls->t.value);
+ prop->name = eina_stringshare_ref(ls->t.value.s);
eo_lexer_get(ls);
for (;;) switch (ls->t.kw)
{
@@ -848,7 +1045,7 @@ parse_method(Eo_Lexer *ls, Eina_Bool ctor)
{
if (ls->t.token != TOK_VALUE)
eo_lexer_syntax_error(ls, "expected method name");
- meth->name = eina_stringshare_ref(ls->t.value);
+ meth->name = eina_stringshare_ref(ls->t.value.s);
eo_lexer_get(ls);
for (;;) switch (ls->t.kw)
{
@@ -864,7 +1061,7 @@ parse_method(Eo_Lexer *ls, Eina_Bool ctor)
else
{
check(ls, TOK_VALUE);
- meth->name = eina_stringshare_ref(ls->t.value);
+ meth->name = eina_stringshare_ref(ls->t.value.s);
eo_lexer_get(ls);
for (;;) switch (ls->t.kw)
{
@@ -897,7 +1094,7 @@ body:
check_next(ls, '{');
if (ls->t.token == TOK_COMMENT)
{
- meth->comment = eina_stringshare_ref(ls->t.value);
+ meth->comment = eina_stringshare_ref(ls->t.value.s);
eo_lexer_get(ls);
}
for (;;) switch (ls->t.kw)
@@ -966,7 +1163,7 @@ parse_implement(Eo_Lexer *ls, Eina_Bool iface)
check_next(ls, '.');
if ((ls->t.token != TOK_VALUE) || (ls->t.kw == KW_get || ls->t.kw == KW_set))
eo_lexer_syntax_error(ls, "name expected");
- eina_strbuf_append(buf, ls->t.value);
+ eina_strbuf_append(buf, ls->t.value.s);
eo_lexer_get(ls);
if (ls->t.token == '.')
{
@@ -989,7 +1186,7 @@ parse_implement(Eo_Lexer *ls, Eina_Bool iface)
}
if ((ls->t.token != TOK_VALUE) || (ls->t.kw == KW_get || ls->t.kw == KW_set))
eo_lexer_syntax_error(ls, "class name expected");
- eina_strbuf_append(buf, ls->t.value);
+ eina_strbuf_append(buf, ls->t.value.s);
eo_lexer_get(ls);
check_next(ls, '.');
eina_strbuf_append(buf, ".");
@@ -1010,7 +1207,7 @@ parse_implement(Eo_Lexer *ls, Eina_Bool iface)
break;
}
check(ls, TOK_VALUE);
- eina_strbuf_append(buf, ls->t.value);
+ eina_strbuf_append(buf, ls->t.value.s);
eo_lexer_get(ls);
if (ls->t.token != '.') break;
eina_strbuf_append(buf, ".");
@@ -1036,14 +1233,14 @@ parse_event(Eo_Lexer *ls)
eo_lexer_get(ls);
}*/
check(ls, TOK_VALUE);
- eina_strbuf_append(buf, ls->t.value);
+ eina_strbuf_append(buf, ls->t.value.s);
eo_lexer_get(ls);
while (ls->t.token == ',')
{
eo_lexer_get(ls);
check(ls, TOK_VALUE);
eina_strbuf_append_char(buf, ',');
- eina_strbuf_append(buf, ls->t.value);
+ eina_strbuf_append(buf, ls->t.value.s);
eo_lexer_get(ls);
}
ev->name = eina_stringshare_add(eina_strbuf_string_get(buf));
@@ -1058,7 +1255,7 @@ parse_event(Eo_Lexer *ls)
eo_lexer_get(ls);
if (ls->t.token == TOK_COMMENT)
{
- ev->comment = eina_stringshare_ref(ls->t.value);
+ ev->comment = eina_stringshare_ref(ls->t.value.s);
eo_lexer_get(ls);
}
}
@@ -1147,7 +1344,7 @@ parse_class_body(Eo_Lexer *ls, Eina_Bool allow_ctors, Eolian_Class_Type type)
has_events = EINA_FALSE;
if (ls->t.token == TOK_COMMENT)
{
- ls->tmp.kls->comment = eina_stringshare_ref(ls->t.value);
+ ls->tmp.kls->comment = eina_stringshare_ref(ls->t.value.s);
eo_lexer_get(ls);
}
if (type == EOLIAN_CLASS_INTERFACE)
@@ -1161,7 +1358,7 @@ parse_class_body(Eo_Lexer *ls, Eina_Bool allow_ctors, Eolian_Class_Type type)
eo_lexer_get(ls);
check_next(ls, ':');
check(ls, TOK_VALUE);
- ls->tmp.kls->legacy_prefix = eina_stringshare_ref(ls->t.value);
+ ls->tmp.kls->legacy_prefix = eina_stringshare_ref(ls->t.value.s);
eo_lexer_get(ls);
check_next(ls, ';');
break;
@@ -1170,7 +1367,7 @@ parse_class_body(Eo_Lexer *ls, Eina_Bool allow_ctors, Eolian_Class_Type type)
eo_lexer_get(ls);
check_next(ls, ':');
check(ls, TOK_VALUE);
- ls->tmp.kls->eo_prefix = eina_stringshare_ref(ls->t.value);
+ ls->tmp.kls->eo_prefix = eina_stringshare_ref(ls->t.value.s);
eo_lexer_get(ls);
check_next(ls, ';');
break;
@@ -1180,7 +1377,7 @@ parse_class_body(Eo_Lexer *ls, Eina_Bool allow_ctors, Eolian_Class_Type type)
eo_lexer_get(ls);
check_next(ls, ':');
check(ls, TOK_VALUE);
- ls->tmp.kls->data_type = eina_stringshare_ref(ls->t.value);
+ ls->tmp.kls->data_type = eina_stringshare_ref(ls->t.value.s);
eo_lexer_get(ls);
check_next(ls, ';');
break;
diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h
index 660e7413cd..2d6196adb3 100644
--- a/src/lib/eolian/eolian_database.h
+++ b/src/lib/eolian/eolian_database.h
@@ -156,6 +156,41 @@ typedef struct _Eolian_Struct_Field
Eina_Stringshare *comment;
} Eolian_Struct_Field;
+typedef union
+{
+ Eina_Bool b;
+ const char *s;
+ signed int i;
+ unsigned int u;
+ signed long l;
+ unsigned long ul;
+ signed long long ll;
+ unsigned long long ull;
+ float f;
+ double d;
+ long double ld;
+} Eolian_Value;
+
+struct _Eolian_Expression
+{
+ Eolian_Expression_Type type;
+ union
+ {
+ struct
+ {
+ Eolian_Binary_Operator binop;
+ Eolian_Expression *lhs;
+ Eolian_Expression *rhs;
+ };
+ struct
+ {
+ Eolian_Unary_Operator unop;
+ Eolian_Expression *expr;
+ };
+ Eolian_Value value;
+ };
+};
+
int database_init();
int database_shutdown();