eolian: better error reporting (include correct token info)

This commit is contained in:
Daniel Kolesa 2015-05-27 11:25:04 +01:00
parent 77e3ac7f82
commit 80000e993e
2 changed files with 17 additions and 4 deletions

View File

@ -131,10 +131,7 @@ static void
txt_token(Eo_Lexer *ls, int token, char *buf)
{
if (token == TOK_VALUE)
{
const char *str = eina_strbuf_string_get(ls->buff);
memcpy(buf, str, strlen(str) + 1);
}
memcpy(buf, ls->t.value.s, strlen(ls->t.value.s) + 1);
else
return eo_lexer_token_to_str(token, buf);
}
@ -848,6 +845,11 @@ eo_lexer_shutdown()
return _init_counter;
}
static Eina_Bool
_eo_is_tokstr(int t) {
return (t == TOK_COMMENT) || (t == TOK_STRING) || (t == TOK_VALUE);
}
void
eo_lexer_context_push(Eo_Lexer *ls)
{
@ -855,6 +857,9 @@ eo_lexer_context_push(Eo_Lexer *ls)
ctx->line = ls->line_number;
ctx->column = ls->column;
ctx->linestr = ls->stream_line;
ctx->token = ls->t;
if (_eo_is_tokstr(ctx->token.token))
eina_stringshare_ref(ctx->token.value.s);
ls->saved_ctxs = eina_list_prepend(ls->saved_ctxs, ctx);
}
@ -862,6 +867,8 @@ void
eo_lexer_context_pop(Eo_Lexer *ls)
{
Lexer_Ctx *ctx = (Lexer_Ctx*)eina_list_data_get(ls->saved_ctxs);
if (_eo_is_tokstr(ctx->token.token))
eina_stringshare_del(ctx->token.value.s);
free(ctx);
ls->saved_ctxs = eina_list_remove_list(ls->saved_ctxs, ls->saved_ctxs);
}
@ -874,6 +881,11 @@ eo_lexer_context_restore(Eo_Lexer *ls)
ls->line_number = ctx->line;
ls->column = ctx->column;
ls->stream_line = ctx->linestr;
if (_eo_is_tokstr(ls->t.token))
eina_stringshare_del(ls->t.value.s);
ls->t = ctx->token;
if (_eo_is_tokstr(ls->t.token))
eina_stringshare_ref(ls->t.value.s);
}
void

View File

@ -92,6 +92,7 @@ typedef struct _Lexer_Ctx
{
int line, column;
const char *linestr;
Eo_Token token;
} Lexer_Ctx;
typedef struct _Eo_Lexer_Temps