Keep better track of errors
This commit is contained in:
parent
41b454e7c4
commit
e25ed2688b
24
src/parser.c
24
src/parser.c
|
@ -44,6 +44,7 @@ struct _Parser
|
||||||
size_t string_pos;
|
size_t string_pos;
|
||||||
|
|
||||||
/* tracking the position */
|
/* tracking the position */
|
||||||
|
int error;
|
||||||
unsigned int line;
|
unsigned int line;
|
||||||
unsigned int col;
|
unsigned int col;
|
||||||
int last;
|
int last;
|
||||||
|
@ -90,12 +91,18 @@ int parser_scan_filter(Parser * parser)
|
||||||
if(parser->lookahead)
|
if(parser->lookahead)
|
||||||
parser->lookahead--;
|
parser->lookahead--;
|
||||||
else if(parser->scanner(&c, parser) != 0)
|
else if(parser->scanner(&c, parser) != 0)
|
||||||
return EOF; /* FIXME report error */
|
{
|
||||||
|
parser->error = 1;
|
||||||
|
return EOF;
|
||||||
|
}
|
||||||
for(i = 0; i < parser->filters_cnt; i++)
|
for(i = 0; i < parser->filters_cnt; i++)
|
||||||
{
|
{
|
||||||
pfd = &parser->filters[i];
|
pfd = &parser->filters[i];
|
||||||
if((l = pfd->filter(&c, pfd->data)) < 0)
|
if((l = pfd->filter(&c, pfd->data)) < 0)
|
||||||
|
{
|
||||||
|
parser->error = 1;
|
||||||
return EOF;
|
return EOF;
|
||||||
|
}
|
||||||
parser->lookahead += l;
|
parser->lookahead += l;
|
||||||
}
|
}
|
||||||
parser->last = c;
|
parser->last = c;
|
||||||
|
@ -188,6 +195,7 @@ static Parser * _new_do(ParserFilter scanner)
|
||||||
parser->string = NULL;
|
parser->string = NULL;
|
||||||
parser->string_cnt = 0;
|
parser->string_cnt = 0;
|
||||||
parser->string_pos = 0;
|
parser->string_pos = 0;
|
||||||
|
parser->error = 0;
|
||||||
parser->line = 1;
|
parser->line = 1;
|
||||||
parser->col = 1;
|
parser->col = 1;
|
||||||
parser->last = EOF;
|
parser->last = EOF;
|
||||||
|
@ -263,9 +271,15 @@ int parser_get_token(Parser * parser, Token ** token)
|
||||||
|
|
||||||
if((*token = token_new(parser->filename, parser->line, parser->col))
|
if((*token = token_new(parser->filename, parser->line, parser->col))
|
||||||
== NULL)
|
== NULL)
|
||||||
return 1;
|
return -1;
|
||||||
if(parser->last == EOF)
|
if(parser->last == EOF
|
||||||
parser_scan_filter(parser);
|
&& parser_scan_filter(parser) == EOF
|
||||||
|
&& parser->error != 0)
|
||||||
|
{
|
||||||
|
token_delete(*token);
|
||||||
|
*token = NULL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fprintf(stderr, "DEBUG: %s() %c\n", __func__, parser->last);
|
fprintf(stderr, "DEBUG: %s() %c\n", __func__, parser->last);
|
||||||
#endif
|
#endif
|
||||||
|
@ -280,7 +294,7 @@ int parser_get_token(Parser * parser, Token ** token)
|
||||||
return 0; /* there is a token and no error */
|
return 0; /* there is a token and no error */
|
||||||
token_delete(*token);
|
token_delete(*token);
|
||||||
*token = NULL;
|
*token = NULL;
|
||||||
return (ret >= 0 && parser->last == EOF) ? 0 : 1;
|
return (ret >= 0 && parser->last == EOF) ? 0 : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user